基于J2ME五子棋游戏的设计与实现(4)

2019-03-06 07:53

4 游戏设计分析设计

4.1系统设计解决方案

本设计运行的操作系统Microsoft Windows XP,通过开发编译软件eclipse和开发工具Wireless Toolkit 2.52 下来现实。在KToolBar 开发包中菜单编辑中的选择Default Color Phone 模拟器,进行调试和运行。

4.2系统的总体结构

本设计的主要任务是基于J2ME的五子棋游戏能在手机上实现。游戏的操作流程十分简单,用户启动MIDlet 后,马上就可以进行游戏。首先进入用户界面,通过菜单可以选择多项功能。该游戏的驱动循环图4-1:

开始 玩家落子 判断落子合法性 等待用户输入 判断游戏是否结束 电脑落子 结束

图4-1 驱动循环图

棋类游戏通常需要棋盘的绘制,获胜的规则和落子的算法。本设计中最为重要的是电脑的智能算法,也是本设计的一个很大的难点。所以本设计可分为以下几个模块:游戏界面模块,游戏落子模块,游戏算法模块以及游戏胜负模块。

4.2.1游戏界面模块

棋类游戏中棋盘的绘制决定着整个游戏的界面美观性,本游戏采用是国际上标准的“15×15”路线正方形棋盘,共225个交叉点,棋盘正中一点为“天元”;棋子为黑白圆形的两种棋子。

绘制棋盘用到了Canvas类,Canvas是MIDP提供的低级用户界面类。和高级用户界面相比,Canvas拥有更大的灵活性。由于Canvas不能提供任何现成的可视化组件,所有在Canvas上显示的图形和文本都必须通过Graphics上下绘制出来。所编译部分代码:

private static final long serialVersionUID = -8030324395498770191L; //定义序列版本UID

private int A;//棋盘每格的边长

private int alignX,alignY;//棋盘的横轴X,竖轴Y private int chessSize;//棋子半径 private int M,N;//棋盘的行数与列数

private int netStatus[][];//保存格点的棋子状态(黑棋、白棋、还是空白) private int color_1,color_2;//玩家一和玩家二的棋子颜色

private int backcolor,forecolor,caretcolor;//棋盘的北京、网格线、光标颜色 private int caretX,caretY;//光标位置

// 这是为了方便线程间的通讯,通过外部设置sta=false来结束闪烁线程 boolean sta=true;

public ChessContentPane(AiRenju_ME _owner){ super(null); owner=_owner; //将光标设置为手形 //setCursor(new Cursor(Cursor.HAND_CURSOR)); }

棋盘定义的数据信息:

public ChessInformation(int a,int _alignX,int _alignY, int chesssize,int m,int n, int _color1,int _color2,int _backcolor,int _forcolor, int _caretcolor){ A=a;chessSize=chesssize;M=m;N=n; alignX=_alignX;alignY=_alignY; color_1=_color1;color_2=_color2; backcolor=_backcolor;forecolor=_forcolor;caretcolor=_caretcolor;

}

public static ChessInformation getdefaultVision(){ return new ChessInformation( 15,//格子大小 10,//左右边距 10,//上下边距 10,//棋子大小 15,15//多少X多少 ,0x000000,0xFFFFFF,0x00FFFF,0x000000,0xFF0000); }

棋盘菜单界面中功能选择部分代码如下: import javax.microedition.lcdui.Command;

import javax.microedition.lcdui.CommandListener; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.Form; import javax.microedition.lcdui.Gauge; import javax.microedition.lcdui.Item; import javax.microedition.midlet.MIDlet;

import javax.microedition.midlet.MIDletStateChangeException;

import settings.ChessInformation;

public class AiRenju_ME extends MIDlet implements CommandListener { Gauge progress=new Gauge(\思考进度\ ChessContentPane pane=new ChessContentPane(this); Form form=new Form(null, new Item[]{progress,pane}); Command put=new Command(\落子\ Command chooseWhite=new Command

(\选择白棋,手机先下\ Command chooseBlack=new Command

(\选择黑棋,玩家先下\

Command restart=new Command(\重新开始\ Command regret=new Command(\悔棋\

程序中调用了javax.microedition.lcdui包和javax.microedition. midlet包。在javax.microedition.lcdui包 定义了Command和Command Listener ,使用他们可以很好的处理高级事件处理。Command对象代表一个命令按钮,它必须被添加到一个Displayable对象上,当这个Displayable对象被显示时,所有相关的Command 都会显示在手机界面下方的左右两侧,这时用户就可以通过手机的左右键来选择。当用户选择某一个Command 后,与当前

Displayable对象关联的Command Listener就会被自动调用。即当用户通过选择下“落下”选项时,所设置好的功能自动会被调用出来。界面设置完成的效果图如图4-2:

图4-2 界面效果图

4.2.2游戏落子模块

棋类游戏是一方发出落子消息后,另一方根据落子的消息作出回应。该游戏定义的是黑子先下,当黑下在空点落子时,所在空点即马上变成黑子,白子根据黑子发出的消息,进行计算,然后选着最佳位置落子。部分代码:

private void setFirst(int color){ currTurn=color; }

//根据鼠标事件的坐标获得其所属的棋格 private Point getNetPos(int x,int y){ x=x-alignX; y=y-alignY; return new Point((x+A/2)/A,(y+A/2)/A); }

//将当前颜色的棋子放到(m,n)位置 public void stepAt(int m,int n){ if(netStatus[m][n]==NOSTONE){ netStatus[m][n]=currTurn; record.addElement(new Point(m,n));

currTurn=SUM-currTurn; needrepaint=true; caretX=m;caretY=n; Point []ju=win(m,n);

}

一个好的棋类程序必须要考虑到的功能就是它的悔棋功能。人机对弈下,电脑是完全允许玩家悔棋的,但是出于对程序负荷的考虑,本游戏只允许玩家悔当前的两步棋(即电脑一步,玩家一步)。需要说明一点悔棋之后电脑需要清除上一步的记录,不然很容易出错。

4.2.3游戏算法模块

本设计主要的算法为电脑智能算法。算法模块是本设计的重点部分,亦是难点部分,它要求电脑模拟现实人与真实的玩家进行对弈。在设计过程中,既要考虑如何提高计算机的智能程度(即让电脑多赢),又要适时适当地让真实玩家能够赢棋,以免使其失去继续玩下去的兴趣。因此,设计合适合理的算法及决策策略就显得格外重要。

“二人零和、全信息、非偶然”博弈是众多博弈形式中最简单的一种,其含义是:

1 对垒双方A、B轮流采取行动,博弈的结果只有三种情况:A方胜,B方败;B方胜,A方败;双方战成平局。

2 在对垒过程中,任何一方都了解当前的格局及过去的历史。

3 任何一方在采取行动前都要根据当前的实际情况,进行得失分析,选取对自己最为有利而对对方最为不利的对策,不存在“碰运气”的偶然因素。即双方都是很理智地决定自己的行动。

本设计中所涉及的五子棋游戏就是一种“二人零和、全信息、非偶然”的博弈游戏。

部分搜寻代码:

if(progress!=null){ progress.setMaxValue(possibly.length+1); progress.setValue(1); } int bt=Integer.MAX_VALUE; // for (Point move : possibly) { for (int i = 0; i < possibly.length; i++) { Point move = possibly[i];


基于J2ME五子棋游戏的设计与实现(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:主题公园景观设计论文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: