📄 用midp实现贪吃蛇游戏(1).htm
字号:
<TR>
<TD align=middle colSpan=2><BR>
<DIV style="FONT-SIZE: 18pt; COLOR: #990000; FONT-FAMILY: 楷体_GB2312"
align=center><B>Java手机游戏开发实例</B></DIV><BR>
<DIV style="FONT-SIZE: 18px; COLOR: #990000; FONT-FAMILY: ; 宋体: "
align=center>用MIDP实现贪吃蛇游戏(1)</DIV>
<DIV
style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; FONT-SIZE: 10.5pt; COLOR: black; LINE-HEIGHT: 180%"
align=left><BR>
<P> 贪吃蛇是一款非常经典的手机游戏,本文将使用MIDP实现这款著名的游戏。首先我将介绍下主要用到的七个类:<BR><BR>
WormMain:最主要的类,控制所有其它类的运行和销毁。<BR><BR>
WormPit:处理键盘输入事件并实例化Worm类和WormFood类的。<BR><BR>
Worm:抽象了贪吃蛇的属性和动作<BR><BR> WormFood:抽象了食物的属性和动作<BR><BR>
WormScore:用来纪录分数的类<BR><BR>
WormLink:抽象了蛇身上的一段,保存了这段的坐标、方向和所有状态。<BR><BR>
WormException:处理异常类<BR><BR> <STRONG>基本概念介绍</STRONG><BR><BR> 节:一条蛇可以看成有许多正方形的“小格子”拼凑成,我把它称作节。节是蛇身上最小的单位。<BR><BR> 段:当许多节连成一条直线,我称它为段。上图的贪吃蛇只有一段,如果它拐弯就变成两段。<BR><BR> 链表:用来保存每一段的状态,链表的元素单位是段。且链表的最后一个元素表示蛇的头部段。<BR><BR> 坐标系:MIDP中的坐标以左上角那点为(0,0),向右则x递增,向下则y递增。<BR><BR> Worm类<BR><BR> 一条完整的贪吃蛇是由一段一段组成的。链表中保存的第一个元素是蛇的尾巴段,最后一个元素是蛇的头部段。当蛇运动的时候,它头部段增加一节而尾段减少一节。如果它吃到了食物,尾部段就不减少一节。也就是说,蛇是从头部段开始长的。<BR><BR> 下面的代码段显示了Worm类保存的各种属性:<BR><BR></P>
<TABLE width="100%" bgColor=#ffffff>
<TBODY>
<TR>
<TD>
<P>/* 贪吃蛇可能移动的方向 */<BR><BR>public final static byte DOWN =
2;<BR><BR>public final static byte LEFT = 4;<BR><BR>public final
static byte RIGHT = 6;<BR><BR>public final static byte UP =
8;<BR><BR>// 贪吃蛇的当前方向<BR><BR>private byte
currentDirection;<BR><BR>// 保存贪吃蛇每一段的列表<BR><BR>private Vector worm =
new Vector(5, 2);<BR><BR>// 是否需要更新状态<BR><BR>private boolean
needUpdate;<BR><BR>// 是否在运动中<BR><BR>private boolean
moveOnNextUpdate;<BR><BR>// 是否吃到食物<BR><BR>private boolean
hasEaten;<BR><BR>// 贪吃蛇的初始位置、长度和方向<BR><BR>private final static int
INIT_X = 3;<BR><BR>private final static int INIT_Y =
8;<BR><BR>private final static int INIT_LEN = 8;<BR><BR>private
final static byte INIT_DIR =RIGHT;</P></TD></TR></TBODY></TABLE>
<P><BR> 下面重点介绍下Worm类中的几个方法: <BR><BR>public void setDirection(byte
direction)<BR><BR> 这个方法用来改变贪吃蛇运动的方向,只能90度。看下面的实现代码:<BR><BR></P>
<TABLE width="100%" bgColor=#ffffff>
<TBODY>
<TR>
<TD>
<P>if ((direction != currentDirection) && !needUpdate)
{<BR><BR>// 取出列表中的最后一个元素(蛇的头部)<BR><BR>WormLink sl =
(WormLink)worm.lastElement();<BR><BR>int x =
sl.getEndX();<BR><BR>int y = sl.getEndY();<BR><BR>//
不同的运动方向坐标的改变也不一样<BR><BR>switch (direction) {<BR><BR>case UP: //
当这段向上运动的时候<BR><BR>if (currentDirection != DOWN) {<BR><BR>y--;
needUpdate = true; }<BR><BR>break;<BR><BR>case DOWN: //
当这段向下运动的时候<BR><BR>if (currentDirection != UP) {<BR><BR>y++;
needUpdate = true; }<BR><BR>break;<BR><BR>case LEFT: //
当这段向左运动的时候<BR><BR>if (currentDirection != RIGHT) {<BR><BR>x--;
needUpdate = true; }<BR><BR>break;<BR><BR>case RIGHT: //
当这段向右运动的时候<BR><BR>if (currentDirection != LEFT) {<BR><BR>x++;
needUpdate = true; }<BR><BR>break; }<BR><BR>// 当更改方向后需要更新<BR><BR>if
(needUpdate == true) {<BR><BR>worm.addElement(new WormLink(x, y, 0,
direction));<BR><BR>currentDirection = direction; }
}<BR><BR></P></TD></TR></TBODY></TABLE>
<P><BR> public void update(Graphics
g)<BR><BR> 这个函数是更新贪吃蛇状态。每次更新都把头部增加一节,尾部减少一节。如果它吃到食物尾部段就不减少一节。看起来就像整只蛇长了一节。<BR><BR></P>
<TABLE width="100%" bgColor=#ffffff>
<TBODY>
<TR>
<TD>
<P>// 把贪吃蛇头部增加一格<BR><BR>head =
(WormLink)worm.lastElement();<BR><BR>head.increaseLength();<BR><BR>//
如果没有吃到食物则尾部减少一格<BR><BR>if (!hasEaten) {<BR><BR>WormLink
tail;<BR><BR>tail = (WormLink)worm.firstElement();<BR><BR>int tailX
= tail.getX();<BR><BR>int tailY = tail.getY();<BR><BR>//
如果尾部块长度为0就删除<BR><BR>tail.decreaseLength();<BR><BR>if
(tail.getLength() == 0) {<BR><BR>worm.removeElement(tail);
}<BR><BR>//
尾部减少一格<BR><BR>g.setColor(WormPit.ERASE_COLOUR);<BR><BR>drawLink(g,
tailX, tailY, tailX, tailY, 1);<BR><BR>} else { <BR><BR>//
如果吃到食物就不删除尾部<BR><BR>hasEaten = false; }<BR><BR>needUpdate =
false;<BR><BR>// 确认是否在边界中<BR><BR>if
(!WormPit.isInBounds(head.getEndX(), head.getEndY())) {<BR><BR>//
如果不在,就死了<BR><BR>throw new WormException("over the edge");
}<BR><BR>headX = (byte)head.getEndX();<BR><BR>headY =
(byte)head.getEndY();<BR><BR>//贪吃蛇的头部增加一格<BR><BR>g.setColor(WormPit.DRAW_COLOUR);<BR><BR>drawLink(g,
headX, headY, headX, headY, 1);<BR><BR>// 判断是否吃到自己<BR><BR>for (int i
= 0; i < worm.size()-1; i++) {<BR><BR>sl =
(WormLink)worm.elementAt(i);<BR><BR>if (sl.contains(headX, headY))
{<BR><BR>throw new WormException("you ate yourself"); }
}</P></TD></TR></TBODY></TABLE>
<P><BR> void drawLink(Graphics g, int x1, int y1, int x2, int y2, int
len)<BR><BR> 这个函数用来画蛇的一段,一只完整的蛇是一段一段组成的。<BR><BR></P>
<TABLE width="100%" bgColor=#ffffff>
<TBODY>
<TR>
<TD>
<P>// 把长度转换成像素长度<BR><BR>len *= WormPit.CELL_SIZE;<BR><BR>// (x1 ==
x2)说明这一段是垂直的<BR><BR>if (x1 == x2) {<BR><BR>// 把x1转成像素长度<BR><BR>x1 *=
WormPit.CELL_SIZE;<BR><BR>// (y2 < y1)说明是向上运动<BR><BR>if (y2 <
y1) {<BR><BR>// 就把头、尾左边交换并转成像素<BR><BR>y1 = y2 *
WormPit.CELL_SIZE;<BR><BR>} else { <BR><BR>// 把y1转成像素<BR><BR>y1 *=
WormPit.CELL_SIZE; }<BR><BR>g.fillRect(x1, y1, WormPit.CELL_SIZE,
len);<BR><BR>} else {<BR><BR>// 这是水平的一段<BR><BR>y1 *=
WormPit.CELL_SIZE;<BR><BR>if (x2 < x1) {<BR><BR>// 就把头、尾左边交换并转成像素
<BR><BR>x1 = x2 * WormPit.CELL_SIZE;<BR><BR>} else {<BR><BR>x1 *=
WormPit.CELL_SIZE; }<BR><BR>g.fillRect(x1, y1, len,
WormPit.CELL_SIZE); }<BR></P></TD></TR></TBODY></TABLE>
<P><BR> public void paint(Graphics g)<BR><BR> 画出一只完整的贪吃蛇<BR><BR></P>
<TABLE width="100%" bgColor=#ffffff>
<TBODY>
<TR>
<TD>
<P>WormLink sl;<BR><BR>int x1, x2, y1, y2;<BR><BR>int
len;<BR><BR>for (int i = 0; i < worm.size(); i++) {<BR><BR>//
取出每一段,然后画出这一段,连起来就是一只完整的蛇<BR><BR>sl =
(WormLink)worm.elementAt(i);<BR><BR>x1 = sl.getX(); x2 =
sl.getEndX();<BR><BR>y1 = sl.getY(); y2 = sl.getEndY();<BR><BR>len =
sl.getLength();<BR><BR>drawLink(g, x1, y1, x2, y2, len);
}</P></TD></TR></TBODY></TABLE><BR><BR></DIV></TD></TR>
<TR>
<TD class=center01>
<DIV align=center>来源:天极网 作者:
<DIV></DIV></DIV></TD>
<TD class=center01 width=280>
<DIV align=center><FONT color=#0000ff><A
href="http://act.it.sohu.com/book/chapter.php?id=461&volume=4&chapter=11">上一页</A></FONT>
<FONT color=#0000ff><A
href="http://act.it.sohu.com/book/serialize.php?id=461">回书目</A></FONT>
<FONT color=#0000ff><A
href="http://act.it.sohu.com/book/chapter.php?id=461&volume=4&chapter=13">下一页</A></FONT>
</DIV></TD></TR></TBODY></TABLE>
<TABLE>
<TBODY>
<TR>
<TD width=760>
<TABLE height=10 cellSpacing=0 cellPadding=0 width=760 border=0>
<TBODY>
<TR>
<TD></TD></TR></TBODY></TABLE><!------------ 评论 ---------------->
<TABLE cellSpacing=0 cellPadding=0 width=760 border=0>
<TBODY>
<TR>
<TD><IFRAME id=vs src="用MIDP实现贪吃蛇游戏(1).files/comment_list1.htm"
frameBorder=0 width="100%"
scrolling=no></IFRAME></TD></TR></TBODY></TABLE><BR>
<SCRIPT language=javascript>function CheckNetwordForm(theForm){ if("" == theForm.content.value) { alert("写两句吧~~"); theForm.content.focus(); return false; } var index; for(index=0;index<theForm.content.value.length;index++) { if(" " != theForm.content.value.charAt(index)) break; } if(index == theForm.content.value.length) { alert("写两句吧~~"); theForm.content.focus(); return false; } if (theForm.content.value.length>100){ alert("评论字数不能超过100哦"); theForm.content.focus(); return false; } return true;}</SCRIPT>
<!------------------ 评论 --------------->
<FORM name=netword onsubmit="javascript: return CheckNetwordForm(this);"
action=insertnetword.php method=post>
<TABLE cellSpacing=0 cellPadding=0 width=760 border=0>
<TBODY>
<TR>
<TD class=text6 height=25> 给此书打分:<A name=1></A> <SELECT
name=score> <OPTION value=5 selected>非常好</OPTION> <OPTION
value=4>还凑合</OPTION> <OPTION value=3>一般吧</OPTION> <OPTION
value=2>不太行</OPTION> <OPTION value=1>太差了</OPTION></SELECT>
用户名: <INPUT id=id type=hidden value=461 name=id> <INPUT type=hidden
value=/book/chapter.php?id=461&volume=4&chapter=12
name=backurl> <INPUT id=username maxLength=20 name=username> <FONT
color=#666666>*评论字数请控制在一百字以内</FONT> </TD></TR></TBODY></TABLE><BR> <TEXTAREA id=description name=content rows=4 wrap=off cols=80></TEXTAREA>
<INPUT type=submit value=提交 name=Submit>
</FORM></TD></TR></TBODY></TABLE></TD></TR></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=760 border=0>
<TBODY>
<TR>
<TD width=1003 background=用MIDP实现贪吃蛇游戏(1).files/t_bj01.gif height=9><IMG
height=1 src="" width=1></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=760 bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD>
<HR width=760 noShade SIZE=1>
</TD></TR>
<TR>
<TD align=middle><A class=black href="http://www.chinaren.com/"
target=_blank>ChinaRen</A> - <A class=black
href="http://big5.www.sohu.com/" target=_blank>繁体版</A> - <A class=black
href="http://hr.sohu.com/hrm.html" target=_blank>搜狐招聘</A> - <A class=black
href="http://add.sohu.com/" target=_blank>网站登录</A> - <A class=black
href="http://help.sohu.com/" target=_blank>帮助中心</A> - <A class=black
href="http://book.news.sohu.com/onClick=this.style.behavior='url(#default#homepage)';this.setHomePage('http://www.sohu.com');return"
target=_blank false;>设置首页</A> - <A class=black
href="http://adinfo.sohu.com/" target=_blank>广告服务</A> - <A class=black
href="http://www.sohu.com/about/lianxi.htm" target=_blank>联系方式</A> - <A
class=black href="http://www.sohu.com/about/privacy.html"
target=_blank>保护隐私权</A> - <A class=black href="http://www.sohu.com/about/"
target=_blank>About SOHU</A> - <A class=black
href="http://www.sohu.com/about/" target=_blank>公司介绍</A><BR><SPAN
class=eng>Copyright © 2004 Sohu.com Inc. All rights reserved. 搜狐公司
版权所有</SPAN> </TD></TR></TBODY></TABLE></CENTER><!-- START NNR Site Census V5.1 --><!-- COPYRIGHT 2004 Nielsen // Netratings -->
<SCRIPT language=JavaScript type=text/javascript>
<!--
var _rsCI="cn-sohu";
var _rsCG="0";
var _rsDT=0;
var _rsDU=0;
var _rsDO=0;
var _rsX6=0;
var _rsSI=escape(window.location);
var _rsLP=location.protocol.indexOf('https')>-1?'https:':'http:';
var _rsRP=escape(document.referrer);
var _rsND=_rsLP+'//secure-cn.imrworldwide.com/';
if (parseInt(navigator.appVersion)>=4)
{
var _rsRD=(new Date()).getTime();
var _rsSE=1;
var _rsSV="";
var _rsSM=0.01;
_rsCL='<scr'+'ipt language="JavaScript" type="text/javascript" src="'+_rsND+'v51.js"><\/scr'+'ipt>';
}
else
{
_rsCL='<img src="'+_rsND+'cgi-bin/m?ci='+_rsCI+'&cg='+_rsCG+'&si='+_rsSI+'&rp='+_rsRP+'">';
}
document.write(_rsCL);
//-->
</SCRIPT>
<NOSCRIPT><IMG alt="" src="用MIDP实现贪吃蛇游戏(1).files/m.gif"> </NOSCRIPT><!-- END NNR Site Census V5.1 -->
<SCRIPT language=JavaScript src="用MIDP实现贪吃蛇游戏(1).files/nnselect.js"></SCRIPT>
<NOSCRIPT><IMG height=1 src="" width=1> </NOSCRIPT></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -