老文章档案 · 2003 年

贪吃蛇的算法分析(2)

破解教程 · 算法分析 · 2003-09-19 · 作者:James 人气: · 出处:赢政天下整理收藏)

下面重点介绍下Worm类中的几个方法:

l public void setDirection(byte direction)

这个方法用来改变贪吃蛇运动的方向,只能90度。看下面的实现代码:

if ((direction != currentDirection) && !needUpdate) {

// 取出列表中的最后一个元素(蛇的头部)

WormLink sl = (WormLink)worm.lastElement();

int x = sl.getEndX();

int y = sl.getEndY();

// 不同的运动方向坐标的改变也不一样

switch (direction) {

case UP: // 当这段向上运动的时候

if (currentDirection != DOWN) {

y--; needUpdate = true; }

break;

case DOWN: // 当这段向下运动的时候

if (currentDirection != UP) {

y++; needUpdate = true; }

break;

case LEFT: // 当这段向左运动的时候

if (currentDirection != RIGHT) {

x--; needUpdate = true; }

break;

case RIGHT: // 当这段向右运动的时候

if (currentDirection != LEFT) {

x++; needUpdate = true; }

break; }

// 当更改方向后需要更新

if (needUpdate == true) {

worm.addElement(new WormLink(x, y, 0, direction));

currentDirection = direction; } }

l public void update(Graphics g)

这个函数是更新贪吃蛇状态。每次更新都把头部增加一节,尾部减少一节。如果它吃到食物尾部段就不减少一节。看起来就像整只蛇长了一节。

// 把贪吃蛇头部增加一格

head = (WormLink)worm.lastElement();

head.increaseLength();

// 如果没有吃到食物则尾部减少一格

if (!hasEaten) {

WormLink tail;

tail = (WormLink)worm.firstElement();

int tailX = tail.getX();

int tailY = tail.getY();

// 如果尾部块长度为0就删除

tail.decreaseLength();

if (tail.getLength() == 0) {

worm.removeElement(tail); }

// 尾部减少一格

g.setColor(WormPit.ERASE_COLOUR);

drawLink(g, tailX, tailY, tailX, tailY, 1);

} else {

// 如果吃到食物就不删除尾部

hasEaten = false; }

needUpdate = false;

// 确认是否在边界中

if (!WormPit.isInBounds(head.getEndX(), head.getEndY())) {

// 如果不在,就死了

throw new WormException("over the edge"); }

headX = (byte)head.getEndX();

headY = (byte)head.getEndY();

//贪吃蛇的头部增加一格

g.setColor(WormPit.DRAW_COLOUR);

drawLink(g, headX, headY, headX, headY, 1);

// 判断是否吃到自己

for (int i = 0; i < worm.size()-1; i++) {

sl = (WormLink)worm.elementAt(i);

if (sl.contains(headX, headY)) {

throw new WormException("you ate yourself"); } }

l void drawLink(Graphics g, int x1, int y1, int x2, int y2, int len)

这个函数用来画蛇的一段,一只完整的蛇是一段一段组成的。

// 把长度转换成像素长度

len *= WormPit.CELL_SIZE;

// (x1 == x2)说明这一段是垂直的

if (x1 == x2) {

// 把x1转成像素长度

x1 *= WormPit.CELL_SIZE;

// (y2 < y1)说明是向上运动

if (y2 < y1) {

// 就把头、尾左边交换并转成像素

y1 = y2 * WormPit.CELL_SIZE;

} else {

// 把y1转成像素

y1 *= WormPit.CELL_SIZE; }

g.fillRect(x1, y1, WormPit.CELL_SIZE, len);

} else {

// 这是水平的一段

y1 *= WormPit.CELL_SIZE;

if (x2 < x1) {

// 就把头、尾左边交换并转成像素

x1 = x2 * WormPit.CELL_SIZE;

} else {

x1 *= WormPit.CELL_SIZE; }

g.fillRect(x1, y1, len, WormPit.CELL_SIZE); }

l public void paint(Graphics g)

画出一只完整的贪吃蛇

WormLink sl;

int x1, x2, y1, y2;

int len;

for (int i = 0; i < worm.size(); i++) {

// 取出每一段,然后画出这一段,连起来就是一只完整的蛇

sl = (WormLink)worm.elementAt(i);

x1 = sl.getX(); x2 = sl.getEndX();

y1 = sl.getY(); y2 = sl.getEndY();

len = sl.getLength();

drawLink(g, x1, y1, x2, y2, len); }

(出处:赢政天下整理收藏)

相关文章:

·语音界面2.0算法分析及注册机源码!

·侠客系统修改器1.21破解手记--算法分析

·中文拨号上网计时计费器 V4.12注册算法分析

·ClockWise 3.22e注册码算法分析

·CoolClock V1.02注册算法分析

·Directory Scanner v1.5 注册算法分析

·Disk Chief 1.2 简单注册算法分析

·EffeTech HTTP Sniffer 3.2注册算法分析

·eLib2.01算法分析

·EZ MP3 Recorder 1.15 注册算法分析

相关软件:

→ 特别推荐

→ 热点TOP10

我为人人《《==》》人人为我

关于我们 |

帮助(?)

| 广告服务 |

版权声明 |

商业合作 |

发展历程 |

加盟我们 |

联系我们

Copyright © 1999-2003

winzheng.com All Rights Reserved.

繁体版:由华琦数码技术提供

Powered

by:MeSky.Net

2003-2004 年,宽带刚刚普及,下载站的文章区是许多人学电脑的第一课堂。
🕰 → 🤖 从那时到现在

当年一篇教程能让一台电脑焕然一新;今天的效率工具换成了 AI。 想知道当下最可靠的 AI 模型怎么选?看 赢政指数——我们用了 28 年的选软件严谨,现在用来评测大模型。

档案性质声明:本页为赢政天下(1998-2011)老文章的历史档案复原, 内容反映当年发表时的原貌——包括当年的技术表述、软件版本与观点,部分方法在今天已不适用或不合规,仅作互联网历史记录与研究用途, 不提供任何形式的下载。原始数据经由公共网络存档(Internet Archive)复原。发现问题请联系我们
← 返回老文章档案 · 软件史档案馆 · 赢政天下站史