制作图形化手机游戏new_第1页
制作图形化手机游戏new_第2页
制作图形化手机游戏new_第3页
制作图形化手机游戏new_第4页
制作图形化手机游戏new_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、引言现在的手机作为一种娱乐性的电子通信设备,早已超出原先的通话、短信息等基本通信功能,越来越多的娱乐、休闲性软件如手机游戏、电子书、音乐编辑、拍照与图象处理等也都流行于当今各种品牌的手机。其中,游戏软件占有相当大的比重。既然我们已经掌握了手机软件的开发过程,为什么不自己开发一个个性化的手机游戏呢?本文将介绍一个简单的图象化手机游戏-花皮猫大战流氓兔的制作过程。花皮猫自然是笔者养的爱猫了,感兴趣的读者也完全可以让自己喜欢的阿猫阿狗担当游戏中的主角,充分展示DIY的魅力!游戏的设计手机游戏的开发首先需要规划好整体流程和具体的游戏规则(或游戏剧本),然后才能根据此剧本进行具体的编码实现。受文章篇幅限

2、制,本游戏剧本设计不能太复杂。首先将游戏定位为人机对弈类游戏,程序运行开始首先显示本游戏的封面画面,停留几秒后自动转入角色选择画面,在玩家选择某一角色后开始游戏。游戏开始时随机决定哪一方先行。人机分别在3乘3大小的棋盘网格中交替落子(双方棋子图案是有区别的),而且只允许在没有落过子的空网格中下子。只要有一方所落棋子在横、竖、斜任何一方向上的总数达到三颗即获胜。如棋盘被填满时双方均未在上述方向达到三颗棋子则该局为平局。无论结果如何,在每局结束后均显示当局胜负结果与总比分。玩家可以选择退出或是重新开始新的一局。以上便是本游戏的主体框架和基本游戏规则,随后进行的编码工作便以此为依据。游戏框架的搭建图

3、1首先建立项目并新建一Midlet TicTacToe加入其中,继续添加ChoosePieceScreen、GameScreen和Game三个类到项目。作为一款游戏,如果仍拿文字来作软件封面显得也太不专业了。如果要在J2ME程序中使用图片,必须预先将其转换为png格式图片然后在项目上点击鼠标右键,从新建菜单下选择文件菜单项将弹出如上所示对话框。刚开始下半部分是隐藏的,需要通过点击高级按钮将其显示出来。选中链接至文件系统中的文件并通过浏览对话框指定要添加的图片路径。最后在文件名一栏输入图片的文件名并点击完成,将图片添加到项目。下面只须在startApp()中通过如下代码装载图片并通过信息框将其显

4、示出来即可:Image logo = null;try logo = Image.createImage(/logo.png);catch (IOException e) Alert splashScreen = new Alert(null, 郎锐2004年作n版权所有(c)n2004-2005, logo, AlertType.INFO);splashScreen.setTimeout(4000); / 延迟4秒图2 图3 图4 图5在持续显示图2四秒后进入角色选择界面(图3):choosePieceScreen = new ChoosePieceScreen(this);Display.

5、getDisplay(this).setCurrent(splashScreen, choosePieceScreen);此任务在ChoosePieceScreen类中实现,主要的功能有对角色图标的装载显示、对选定角色的确认等。在其构造函数中首先指定当前界面为列表选择方式,然后通过append()将装载的图象与相应的列表文字建立关联。最后,为了响应用户的输入选择还必须调用setCommandListener()来检测按键事件的发生,并在commandAction()方法中实现对选定角色的确认:super(请选择:, List.IMPLICIT); / 设置列表选择this.midlet = m

6、idlet;append(CAT_TEXT, loadImage(/cat.png); / 添加图象选项到列表append(RABBIT_TEXT, loadImage(/rabbit.png);setCommandListener(this); / 侦听按键响应public void commandAction(Command arg0, Displayable arg1) if (arg0 = List.SELECT_COMMAND)/ 检测是否为列表按键响应/ 检测用户选中的选项boolean isPlayerCat = getString(getSelectedIndex().equa

7、ls(CAT_TEXT); midlet.choosePieceScreenDone(isPlayerCat); / 进入游戏画面这里是通过检测用户选择的列表项文字来判断玩家选择的是花皮猫还是流氓兔并通过变量isPlayerCat来标识,在choosePieceScreenDone()方法中新建一个GameScreen对象并将其作为当前显示界面来开始一局新的游戏。GameScreen类负责游戏界面的绘制,如对棋盘和双方棋子的绘制以及对光标移动的处理等工作。游戏界面编程对弈游戏最主要的界面就是棋盘与棋子的绘制。这首先要根据屏幕大小计算棋盘网格间距和棋子的大小:screenWidth = getW

8、idth();/ 获取屏幕大小screenHeight = getHeight();if (screenWidth screenHeight) / 计算网格大小boardCellSize = (screenHeight - 2) / 3;boardLeft = (screenWidth - (boardCellSize * 3) / 2;boardTop = 1;elseboardCellSize = (screenWidth - 2) / 3;boardLeft = 1;boardTop = (screenHeight - boardCellSize * 3) / 2;绘制棋盘时,首先用背景

9、色清空整个画布然后再分别按行列绘制出黑色网格即可:g.setColor(WHITE);g.fillRect(0, 0, screenWidth, screenHeight);g.setColor(BLACK);for (int i = 0; i tallyMsgWidth)strWidth = statusMsgWidth;int x = (screenWidth - strWidth) / 2; / 计算字符绘制位置x = x 0 ? 0 : x;int y = (screenHeight - 2 * strHeight) / 2;y = y 0 ? 0 : y;g.setColor(WHI

10、TE); / 白色清空画布g.fillRect(0, 0, screenWidth, screenHeight);g.setColor(BLACK); / 黑色显示信息g.drawString(statusMsg, x, y, (Graphics.TOP | Graphics.LEFT);g.drawString(tallyMsg, x, (y + 1 + strHeight), (Graphics.TOP | Graphics.LEFT);在显示此界面时,如果用户按下退出或开始键,则在commandAction方法中将通过如下代码分别执行程序退出处理或是重新开始下一局新的游戏:if (arg

11、0 = exitCommand) / 退出midlet.quit();else if (arg0 = newGameCommand) / 开始游戏initialize();人工智能的实现如果说前面介绍的框架是骨骼,界面是皮肉的话,那么接下来将要介绍的人工智能部分则可以说是整个程序的灵魂了。它将进行对弈双方落子的合法性检测、计算机行棋的智能计算、游戏结束检测以及对胜负结果的判定等工作。以上这些都需要有合理的设计才能实现较高的游戏运行效率。考虑到游戏规则始终是围绕双方棋子的排列形状来进行的,因此可以把棋盘网格作为主要因素进行设计。按从左到右,从上到下的次序从0开始依次对棋盘的9个网格进行编号,可以

12、得出如下几组获胜条件:0,1,2;3,4,5;6,7,8;0,3,6;1,4,7;2,5,8;0,4,8;2,4,6。只要有一方有三颗棋子的位置符合其中任何一组即可认定该方获胜(读者可以在纸上验证一下)。在程序实现过程中以WINS数组记录上述几种获胜条件,并在每一次行棋完毕后进行比对,以判断游戏是否有获胜方产生。限于篇幅,下面主要对计算机行棋思路的人工智能设计进行介绍。首先明确计算机的对弈目的:获胜,如果暂时无法获胜则阻止选手获胜,如果双方都暂时无法获胜则可以下一些随手棋。在计算出合适的下子位置后将其添加到己方的行棋记录(打谱)以备后用。由此可以写出如下代码:int move = getWin

13、ningComputerMove();/如能立即获胜则在获胜位置下子if (move = -1) /如选手即将获胜则在选手将获胜的位置下子move = getRequiredBlockingComputerMove();if (move = -1) / 如双方均暂时无法获胜则下随手棋move = getRandomComputerMove();computerState |= bit(move); / 当前计算机占用的所有位置其中,getWinningComputerMove方法通过对所有可能下子位置(即尚未落子的网格)的枚举,智能判断计算机下一步走到哪里才能获胜:int move = -1;for (int i = 0; i 9;+i) if (isFree(i) & isWin(computerState | bit(i) move = i; / 找到获胜位置时中断break;如果循环完毕仍没

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论