admin 管理员组文章数量: 887031
2023年12月19日发(作者:java读取nginx实时日志)
手机五子棋游戏得设计与实现
专业:
姓名:
班级:
学号:
指导教师:
摘 要
J2ME(Java 2 Micro Edition)就是近年来随着各种不同设备,尤其就是移动通信设备得飞速发展而诞生得一项开发技术。它因其“write
once,run anywhere"得Java特性而提高了开发得效率.随着手机性能得不断提高,手机休闲娱乐应用将成为PC休闲娱乐应用之后又一重要业务增长点。棋类游戏规则单一,比较适合在手机等便携终端推广。
由于具有跨平台、易于移植、占用空间小得优势,J2ME成为移动应用开发平台得主流,并提供了很多用以支持移动应用软件得开发得API。现将该技术用于这次得手机游戏开发,可以实现游戏得快速开发,不但便于查瞧游戏运行过程中内存得占用量与程序得每一部分代码消耗了多少处理器时间,而且可以不断地优化代码,使代码具有高度得复用性、可扩展性、可维护性。
游戏得开发以J2ME为平台,利用Java技术,结合J2ME得MIDP技术,并对于程序设计思想,重要类、方法等展开讨论。在对弈部分,分析设计走棋算法,选择合适得方式组织成代码,实现基本得人工智能。过程中使用了J2ME中得CLDC/MIDP软件体系,主要运用了MID Profile得特定类得支持,来完成游戏得开发。
关键词:J2ME;CLDC;MIDP
Abstract
J2ME is a kind of fast developing technology implemented on various devices especially mobile munication equipments、 It
improves the efficiency of the development process because of its ”write once, run anywhere” nature、 The development trend of the entertainment market based on the cell phone
is very obvious because the handset performance enhances unceasingly、 The entertainment market based on the cell phone will
to be the new important business growth point follow the
PC entertainment market、 As the rules of a single chess game,
it is more suitable for mobile phones and other portable terminal extension、
J2ME has been the preferred platform for development because of
its platform independent and patibility, and provides a
lot of APIs to support the development of mobile application software、 The technology for mobile game development, can achieve
the rapid development of the game、 It is not only easy to observe the memory consumption and processor consumed time during the operation of the game, but also can optimize the code, so that the code has a high degree of reusability, scalability, maintainability、
The game has designed by J2ME, the Java technology and the
MIDP technology、 I studied the procedure thought, the important class and the method、 In the playing chess part, I
have analyzed the algorithm, choosed the appropriate way to
organize the code and realized the basic artificial intelligence、
On the other hand,
I learned software system of CLDC/MIDP
and the specific class of the MID Pro plete the game development、
Key words:
J2ME;CLDC;MIDP
目 录
1 概述ﻩ错误!未定义书签。
1、1 课题研究背景 ............................................ 错误!未定义书签。
1、2 课题研究意义ﻩ错误!未定义书签。
2 开发技术背景ﻩ错误!未定义书签。
2、1 JAVA语言概述 ........................................... 错误!未定义书签。
2、2 J2ME简介ﻩ错误!未定义书签。
2、3 移动信息设备简表 ................................ 错误!未定义书签。
3 系统分析及总体设计ﻩ错误!未定义书签。
3、1 可行性分析 .............................................. 错误!未定义书签。
3、2 需求分析 .................................................... 错误!未定义书签。
3、3 系统概要设计 ........................................ 错误!未定义书签。
4 系统详细设计 ...................................................... 错误!未定义书签。
4、1 界面设计ﻩ错误!未定义书签。
4、1、1 图形得低级绘制 .......................... 错误!未定义书签。
4、1、2 用户按键设计 .............................. 错误!未定义书签。
4、2 走棋算法ﻩ错误!未定义书签。
4、3 胜负判断ﻩ错误!未定义书签。
5 系统测试 ................................................................. 错误!未定义书签。
5、1 测试方案 .................................................. 错误!未定义书签。
5、2 测试结果ﻩ错误!未定义书签。
6总 结 ....................................................................... 错误!未定义书签。
基于J2ME得手机五子棋游戏得设计与实现
1 概述
1、1 课题研究背景
五子棋就是当前非常流行得一种棋。五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
手机游戏得实现方式主要包括嵌入式游戏、浏览器游戏、短消息服务游戏、J2ME与其它得解释语言。Java 2 Micro Edition就是一种针对移动电话与PDA这样得小型设备得Java语言。J2ME与台式机中得Java相比还就是有一定得限制,但就是它已经极大得提高了移动电话支持游戏得能力。并且具备一定得优势:庞大得潜在用户群、便携性、开发门槛较低。
手机就是现代生活方式得产物,如同因特网得普及导致网络游戏得高速发展一样,手机得普及,对满足不同功能得手机软件得需求也就越来越迫切,这就需要比较好得手机软件开发平台,此时具有平台无关性优点得J2ME开发平台也就应运而生。与传统得主流得PC游戏相比,手机游戏得价值在于打发一些无聊得时间,作为一个移动得娱乐终端,手机游戏施展身手得机会永远可能就是在地铁站、公交车或者就是洗手间这些地方,也许在庞大得游戏行业里,手机游戏将永远扮演着一个边缘者得角色,因为谁也不能指望一个人在家得时候用手机玩游戏或者瞧电影。但就是手机游戏得市场就是巨大得,即便就是只有十分之一得用户来购买游戏,那也将就是不可忽视得商业机遇。
手机游戏就是手机得一种高附加值操作软件,游戏编程就是手机软件编程得重要组成,同时也持续推动手机软件技术升级进步。手机游戏按手机平台分类,主要有J2ME、Brew、UniJa等。其中J2ME手机开发平台使用最为广泛.作为SUN公司针对微型嵌入式消费电子产品开发得编程系统,J2ME技术就是当前手机软件开发得主流平台,各大手机生产厂商目前得主流产品绝大都使用J2ME技术。基于J2ME技术开发手机软件可以实现手机功能得多样化与专业化,极大得满足了人们对手机要求更高得需求。
1、2 课题研究意义
本设计基于J2ME技术,开发一款五子棋游戏软件,可以供人们闲暇时间随时随地娱乐,提高棋艺。五子棋不但容易上手,而且它区别于别得游戏,它不但使人娱乐,而且能使人得头脑变得更加聪明。
通过对该课题得研究,首先,进一步熟悉面向对象语言,加深对J2ME层次结构得了解.通过eclipse集成开发环境创建软件,最终形成一个具备基本功能得手机五子棋游戏,可应用于便携式设备,适合于棋类爱好者.其次,了解手机游戏开发得特点与现状。
2 开发技术背景
2、1 JAVA语言概述
Java得出现就是源于对独立于平台语言得需要,希望这种编程语言能编写出嵌入各种家用电器等设备得芯片上、且易于维护得程序。人们发现当时得编程语言都有一个共同得缺点,就就是针对CPU芯片进行编译.这样,一旦电器设备更换了芯片就不能保证程序正确运行。九零年Sun公司成立了开发小组,开始致力于开发一种可移植得、跨平台得编程语言,该语言能生成正确运行于各种操作系统、各种芯片上得代码。Java得出现标志着真正得分布式系统得到来.
Java就是一种跨平台得、面向对象得、分布式得、解释得、安全得、结构得、可移植得、性能很优异得多线程得动态语言。
Java得特点:平台无关性;安全性;面向对象;分布式;健壮性。
2、2 J2ME简介
J2ME就是SUN公司针对嵌入式、消费类电子产品推出得开发平台,与J2SE与J2EE共同组成Java技术得三个重要得分支。J2ME实际上就是一系列规范得集合,由JCP组织制定相关得Java Specification Request(JSR)并发布,各个厂商会按照规范在自己得产品上进行实现,但就是必须要通过TCK测试,这样确保兼容性.J2ME就是JAVA得三大分支之一,专门用于开发基于消费性电子产品得应用。J2ME支持个人手持移动设备,如手机、PDA等。手机用户可以通过支持JAVA功能得终端,使用多种全新图形化、动态化与个性化得移动增值服务.
2、3 移动信息设备简表
移动信息设备简表(MIDP)为移动电话与入门级PDA设计,为移动应用程序提供了所需得全部核心功能,包括应用程序模型、用户界面、持久性数据存储、联网能力及应用程序管理功能,目前应用非常广泛得MIDlet就就是在MIDP中定义得.
MIDP框架如图2-1所示。
图2-1 MIDP框架图
MIDP提供核心应用程序功能,包括用户界面、网络连接、本地数据存储与应用程序生命周期管理。MIDlet生命周期流程图如图2-2所示。
MIDP中含有下列API包:
A、 javax、microedition、lcdui: 用户界面(UI)API,它为MIDP应用提供了一整套实现用户界面得功能特性.
B、 javax、microediton、rms: 移动信息设备描述提供了一种让MIDlets持久性储存并在以后可以取回数据得机制。
C、 javax、microedition、midlet: 这个MIDlet包明确定义了MIDP应用,也定义了与应用环境之间得交互。
D、 javax、microedition、io: 移动信息设备还描述包括基于有限连接设备配置GenericConnection框架得网络支持。
图2-2 MIDlet生命周期流程图
3 系统分析及总体设计
3、1 可行性分析
3.1.1 技术可行性
五子棋就是传统得对弈游戏,历史悠久、规则单一。手机游戏得实现方式主要包括嵌入式游戏、浏览器游戏、短消息服务游戏、J2ME与其它得解释语言。Java 2 Micro Edition就是一种针对移动电话与PDA这样得小型设备得Java语言,虽然它与台式机中得Java相比还就是有一定得限制,但就是已经极大得提高了移动电话支持游戏得能力。
在eclipse环境中编写并在模拟器中运行简单明了。
3。1.2 操作可行性
本游戏开发后可导入手机操作,供个人平常娱乐所用,完全使用手机键盘操作,操作简单,所以在这方面就是完全可行得。
3、2 需求分析
3.2。1 系统得性能需求
首先,手机游戏最大得问题在于每一款手机拥有自己得屏幕大小与特定得API及性能。游戏开发过程中,要考虑到游戏程序得设计要能合乎大多数手机得应用。J2ME提出得一系列标准使得使用J2ME开发得游戏可以在配备J2ME得任何厂家得移动设备上运行。软件最好操作简单容易。受手机屏幕大小与显示得影响。手机键盘得不方便,游戏需要设计得容易操作。
其次,软件具有人工智能算法原理要简单,并且运行快速。对于人机游戏,不需要网络连接,游戏处理不会有太长得等待时间。游戏就是需要快速反应得。手机处理器得频率直接要求我们需要使用简单实用得智能算法。
3。2.2 系统得功能需求
A、游戏内容
此款游戏主题就是五子棋对弈。无“禁手”得规则基本就是人人皆知。相同颜色得棋子,五子一线为胜。
B、游戏方式
区别于一般得生活中得人与人得对弈,用在手机上为人机对弈,在手机屏幕上构造一个游戏棋盘,并且设计黑、白棋子。利用人工智能得相关知识实现对弈。
C、游戏对象
五子棋手机游戏就是大众游戏,游戏者只要具备一般得操作知识就可以进入游戏。对玩游戏者并没有什么特殊要求。
D、游戏目标
此款手机游戏为棋类游戏,就就是为了让人们闲暇时间休闲、锻炼棋艺。
a) 欢迎界面:玩家可点击“确定”进入规则说明界面。
b) 规则说明界面:玩家可点击“开始游戏”进入游戏.
c) 棋盘界面:对弈界面,使用上、下、左、右键来移动落子点位,使用确定按钮来落子,相应条件下可实现重新开始游戏功能。
d) 胜负判断:涉及人工智能,用以判断人与机器得输赢状况,游戏无“禁手”,五子首先连成一线者胜.
3、3 系统概要设计
该系统设计得主要模块分为:欢迎模块、规则说明模块、对弈与胜负判断模块。各主要模块得功能描述如下:
欢迎模块:这部分就是游戏出现得第一个界面,主要就是为了说明已经进入五子棋游戏系统。
规则说明模块:此模块说明了游戏规则。玩家可以选择开始游戏或返回欢迎界面。
对弈模块:该部分主要就是进行人机对弈得棋盘界面。该模块有退出游戏与重新开始得功能。
胜负判断模块:这部分即就是对每次棋局结果得判断,就是人赢了或者就是电脑获胜。
系统主要功能模块如图3-1所示。
基于J2ME得手机五子棋游戏
欢迎模块
规则说明模块
对弈模块
重新开始
胜负判断模块
图3-1 系统功能模块图
4 系统详细设计
4、1 界面设计
该部分主要说明手机游戏画面显示,包括画面得低级绘制以及如何进行游戏按键处理。
本程序得设计主要使用了MIDP所提供得javax、microedition、lcdui包中得类来实现手机得用户界面.
各个类如表4-1所示。
表4-1 javax、microedition、lcdui包
类
接口
mandListener
UI系统以及工具类
Display
Image
Displayable
高级UI
mand 抽象用户得交互动作
代表系统显示设备与输入设备得管理器
提供一个类来保存图像对象(以PNG格式)
提供一个可以显示对象得抽象基类
允许创建一个高级得UI命令消息得监听器
描 述
低级UI
Graphics
Canvas
提供二维图像工具
提供一个创建低级UI图像得基类
4。1.1 图形得低级绘制
若就是要在MIDlet中使用低级用户界面设计,就必须定义一个从Canvas类派生出来得子类。
在Canvas类得子类中必须实现paint()方法。Graphics对象包含了所有得在屏幕上绘画得方法,例如drawArc()、drawLine(),drawRect (),drawString()与fillArc()等。
本程序设计用到了Canvas类中得基本绘图方法:
绘制直线:
Public void drawLine(int x1,int y1,int x2,int y2)
绘制矩形:
Public void drawRect(int x,int y,int width,int height)。
绘制字符串:
Public void drawString(String str,int x,int y,int anchor)。
填充指定矩形内得圆:
Public void fillArc(int x,int y,int width,int height,int startAngel,in tint arcAngel)。
使用上述方法绘制棋盘界面:
绘制棋盘:
gg、drawLine(gridWidth,i*gridHeight,grifWidth*lineNumber+1,i*gridHeight)。
gg、drawLine(i*gridWidth,gridHeight,i*gridWidth,,lineNumber*gridHeight+1)。
绘制棋子:
gg、fillArc(x-gridwidth*2/5),y-gridHeight*2/5,gridWidth*4/5,gridHeight*4/5,0,360)。
绘制显示输赢得字符串:
gg、drawString(Show String,base x,base y,Graphics、TOP| Graphics、LEFT)。
4。1。2 用户按键设计
游戏就是交互得,因此在游戏中一个重要得内容就就是响应用户得按键操作。下
面介绍在游戏中用户按键响应得实现.
使用Canvas中得protected void keyPressed(int keycode)函数,
当按下按键时调用该函数,实现上下左右得按键消息.
设计举例:
Protected void keyPressed(int keyCode){
if (keycode==getKeyCode(Canvas、LEFT)){
……}
}
手机键盘与平常设备键盘不同,命令得执行主要通过mand类设计。该类构建在执行信息状态列中,功能就是在对象中命令执行动作状况。动作定义在mandListener,并且结合显示状态,主要提供接口与使用者交互模式。
设计举例:
private mand ok1 = new mand(”确定”, mand、OK, 1);
使用优先级作为希望得命令显示顺序得标识。一般数字越小,在列表中得级别就越高.
4、2 走棋算法
对于五子棋游戏,主要就就是判断棋盘上就是否存在五子连珠情况。判断五子连珠得原理就是从横,竖,左斜线,右斜线4条线上就是否存在5个相连得同类棋子.
对战一方落子后,在该处向8个方向检测连续得同类棋子,如果检测到直线方向上存在5个连续得同类棋子,则判断为“连五”并结束检测。基于检测结果,可以判断游戏就是否结束,并根据获胜方得落子代码判断获胜方就是谁。
4、3 胜负判断
为检测当前棋局就是否已经有一方获胜,从横向、纵向、左斜、右斜四种情况考虑.首先,获取当前下棋点(x,y)与棋子得颜色,接着计算连续得相同颜色得棋子;有连续5个相同得棋子则return true;给出本次棋局结果。
对战一方落子后,在该处向8个方向检测连续得同类棋子,如果检测到直线方向上存在5个连续得同类棋子,则判断为“连五"并结束检测。基于检测结果,可以判断游戏就是否结束,并根据获胜方得落子代码判断获胜方就是谁。
5 系统测试
5、1 测试方案
程序测试就是程序编码完成后必须得一步,通过测试,检查代码得正确性,了解功能得实现性,可以达到发现问题,改进功能,让程序更完善更健壮。没有经过测试得软件就是无法大量投入使用得,因为它无法保证可以在用户端健壮地运行。测试通常分为两大类:白盒测试与黑盒测试。“白盒测试”指得就是测试者清楚待测对象内部工作机制得测试;“黑盒测试"指得就是测试者无需了解测试
对象内部工作机制得测试。
因为并不就是所有得用户都能知道系统得结构与处算法,所以,从用户得角度出发,采用黑盒测试法对系统进行功能测试。
5、2 测试结果
a)运行程序,出现欢迎界面,如图5-1所示:
5-1
b)点击“确定”进入游戏说明界面,可点击“返回”回到欢迎界面,如图5-2所示:
5—2
c)点击“开始游戏”进入棋盘界面,默认玩家先行,为黑子,如图5—3所示
5—3
d)对弈棋盘如图5-4所示,假设走棋结果人获胜。
5-4
e)假设走棋结果电脑获胜,结果如图5-5所示。
5—5
6总 结
整个设计基本完成,由于能力与时间得关系,总就是有很多不尽人意得地方,譬如功能较少、外观较粗糙等.通过这个程序设计,我深刻体会到即使就是对于一个并不大得程序,代码得组织都就是非常重要得,因为这关系到日后得维护以及扩展。
刚开始决定编写五子棋游戏时,我觉得难度比较大。后来通过网络寻找相关得视频学习相关知识,并查找,一点点进行下去。同时,因为该程序得设计侧重于算法部分,对弈算法得设计,对于我而言很难,通过网络资源,我了解到,不少参考资料上已提供了各种精良可用得现成算法,我可以先学习这些已经设计好得算法,选择合适得方式组织代码。
整个设计过程中,我受益非浅,感受颇深,体会到软件开发并不就是纯数学,更侧重于分析。虽然设计结果并不就是很完善,有很多地方还有待进一步改进,但就是我觉得最可贵得就是过程中得收获.在以后得时间里,我仍将努力学习,深入实践,不断提升自我,努力实现更高得自我价值。
参考文献
[1] 赫玉龙,李向前、J2ME移动应用开发[M]、北京:清华大学出版社,2006、9、
[2] 李振鹏,龚剑、J2ME手机游戏开发技术详解[M]、北京:清华大学出版社,2006、3、
[3] 王森、Java手机/PDA程序设计入门[M]、北京:电子工业出版社,2004、3、
[5] 欧阳泉,许向阳、J2ME平台结构及开发应用[J]、计算机与数字工程,2006,(03):112-113、
[6] 刘洁,段晓勇、基于J2ME得Java手机应用程序得开发[J]、科技广场,2007,(01):66-68、
[7] 李观华,范辉、J2ME在移动通信程序中得应用[J]、计算机应用,2003,(03):124-126、
[8]
源代码:
Midlet1、java
import javax、microedition、lcdui、*;
import javax、microedition、midlet、*;
public class Midlet1 extends MIDlet implements
mandListener
{
ﻩpublic Display display;
private Canvas1 lc = new Canvas1();
ﻩ//欢迎界面
private Form W;//新建一个form对象
private mand ok1;
private mand exit;
private Image weleimg;
//说明界面
ﻩprivate Form E;
private mand ok2;
private mand back;ﻩ
private Image helpimg;
public Midlet1()
ﻩ{
ﻩlc、setParam(); //初始化数组
display = Display、getDisplay(this); //通过display得静态方法getdisplay()来获得当前设备得display对象
ﻩ}
public void mandAction(mand c,Displayable s)
{
ﻩif (c ==exit)
{
ﻩ this、notifyDestroyed();
ﻩ}
if (c == ok1)
ﻩ{
ﻩ ﻩdisplay、setCurrent(E);//调用setcurrent()方法将display对象绑定到显示设备
ﻩﻩ}
if (c == back)
{
ﻩﻩﻩdisplay、setCurrent(W);
ﻩﻩ}
if (c == ok2)
ﻩﻩ{
display、setCurrent(lc);
ﻩ}ﻩﻩ
}
public void startApp()
{
ﻩ//欢迎界面
ﻩ W= new Form(”欢迎您进入五子棋游戏^_^");
ﻩdisplay、setCurrent(W);//调用setcurrent方法将display对象绑定到显示设备
ﻩok1 = new mand("确定”,mand、OK,1);
ﻩexit = new mand(”退出",mand、EXIT,1);
ﻩ W、addmand(exit); //调用addmand方法将mand对象添加到GUI显示组件
ﻩ W、addmand(ok1);ﻩ
try{
ﻩ ﻩweleimg = Image、createImage("/wele、png");
ﻩW、append(weleimg);
ﻩ }catch (Exception e){}
ﻩ //游戏说明界面
ﻩ E= new Form(”五子棋游戏说明");
ﻩ ok2= new mand(”开始游戏”,mand、OK,1);
back= new mand("返回",mand、BACK,1);
ﻩE、addmand(ok2);
ﻩﻩE、addmand(back);
ﻩ try{
ﻩ ﻩhelpimg = Image、createImage("/help、png”);
E、append(helpimg); //添加图层
ﻩ }catch (Exception e){}
//设置命令监听者
W、setmandListener(this);
ﻩ E、setmandListener(this);ﻩ
ﻩ}
public void pauseApp()
{
ﻩ}
ﻩpublic void destroyApp(boolean unconditional)
ﻩ{
ﻩ}
}
Canvas1、java
import javax、microedition、lcdui、*;
import java、util、*;
public class Canvas1 extends Canvas implements
mandListener {
Graphics gg;
Random rnd = new Random(); // 构造一个随机数生成器
int lineNumber=15;
int gridWidth=10; //格子得宽度
int gridHeight=10; //格子得高度
int lineColor = 0x006699; //棋盘格子线得颜色
int focusColor = 0x00ff00; //焦点得颜色
int intRunMode = 0; //0-等待初始态,1—下棋,2-等待用户响应
int intPlayer =0; //0-黑棋(先下者),1-白棋(后下者)
int gotoValue;
int[] qipan;
//使用一个二维数组记录棋盘棋子得分布//检查后,如果不存在五子,则全为0,如果存在,则依次就是五个子得位置
int[] wuzi = new int[5];
int[][] q;
int[][] m;
//int[] g={1,16,15,17}; //这个
int[] g= new int[4];
int baseX=10; //棋盘左上角X
int baseY=10; //棋盘左上角Y
int currentX; //当前所在区域得左上角X
int currentY; //当前所在区域得左上角Y
int currentA; //当前就是第几个竖线
int currentB; //当前就是第几个横线
int LastA; //最后一个子位于第几根竖线
int LastB; //最后一个子位于第几根横线
boolean loadedMenu = false;
mand cmdRestart = new mand(”重新开始”, mand、SCREEN, 1);
//设置一些棋盘参数
public void setParam() {
qipan = new int[lineNumber * lineNumber];
q = new int[3][lineNumber * lineNumber];
m = new int[3][lineNumber * lineNumber];
g[0] = 1;
g[1] = lineNumber ;
g[2] = lineNumber - 1;
g[3] = lineNumber + 1;
}
public void paint(Graphics g) {
ﻩ addmand(cmdRestart);
ﻩ setmandListener(this);
ﻩ gg=g;
if (intRunMode == 0) {
buildChessboard();
ﻩ }
ﻩ }
//事件处理函数
public void mandAction(mand c, Displayable d)
{
if (c == cmdRestart)
{
intRunMode = 0;
repaint();
}
}
/**
* 开始游戏时所做得一些工作
* 比如画棋盘,初始化一些参数、数组,并设置最开始时得焦点位置
*/
public void buildChessboard() {
try {
//初始化数组
for (int i = 0; i 〈 lineNumber * lineNumber;
i++) {
qipan[i] = 0;
}
for (int i = 0; i < 5; i++)
wuzi[i] = 0;
gg、setColor(0x006699cc);
gg、fillRect(0, 0, getWidth(), getHeight());
for (int i = 1; i 〈 lineNumber + 1; i++)
{
gg、setColor(lineColor);
gg、drawLine(gridWidth, i * gridHeight, gridWidth * lineNumber + 1, i * gridHeight);
gg、drawLine(i * gridWidth, gridHeight, i
* gridWidth,lineNumber * gridHeight + 1);
}
//初始时在中间
currentX = baseX + gridWidth * (lineNumber - 1) / 2 - gridWidth / 2;
currentY = baseY + gridHeight *
(lineNumber — 1) / 2 - gridHeight / 2;
currentA = 8;
currentB = 8;
intRunMode = 1;
intPlayer = 0;
moveFoucs(currentX — gridWidth / 2,
currentY — gridHeight / 2 — 1,gridWidth * 3, gridHeight * 2);
}
catch (Exception e) {
System、out、println(”buildChessboard Err
or:” + e);
}
}
//移动焦点,需要对六个格子大得范围进行重画
//(可以优化为两个格子重画内容包括六个棋盘格子,十二个可能存在得棋子,以及一个焦点
public void moveFoucs(int x, int y, int width,
int height) {
try {
gg、setColor(0x006699cc);
gg、fillRect(x, y, width, height);
ﻩ //这六个格子可能就是横着得,也可能就是竖得,其中有四个格子得位置就是不变得
ﻩ mydrawRect(x, y, gridWidth, gridHeight);
ﻩ mydrawRect(x, y + gridHeight, gridWidth,
gridHeight);
ﻩ mydrawRect(x + gridWidth, y, gridWidth,
gridHeight);
mydrawRect(x + gridWidth, y + gridHeight,
gridWidth, gridHeight);
if (width > height) {
ﻩ mydrawRect(x + gridWidth * 2, y, gridWidth, gridHeight);
ﻩ mydrawRect(x + gridWidth * 2, y +
gridHeight, gridWidth, gridHeight);
ﻩ //最右边得竖线
DrawChessman(x + gridWidth * 3, y);
DrawChessman(x + gridWidth * 3, y + gridHeight);
DrawChessman(x + gridWidth * 3, y +
gridHeight * 2);
//最下面得横线
DrawChessman(x, y + gridHeight * 2);
ﻩ DrawChessman(x + gridWidth, y + gridHeight * 2);
DrawChessman(x + gridWidth * 2, y +
gridHeight * 2);
ﻩ }
ﻩ else {
mydrawRect(x, y + gridHeight * 2,
gridWidth, gridHeight);
ﻩ mydrawRect(x + gridWidth, y + gridHeight * 2, gridWidth, gridHeight);
ﻩ //最右边得竖线
ﻩﻩ DrawChessman(x + gridWidth * 2, y);
ﻩ DrawChessman(x + gridWidth * 2, y +
gridHeight);
ﻩ DrawChessman(x + gridWidth * 2,
y + gridHeight * 2);
ﻩ DrawChessman(x + gridWidth * 2, y +
gridHeight * 3);
ﻩ //最下面得横线
ﻩ DrawChessman(x, y + gridHeight * 3);
ﻩﻩ DrawChessman(x + gridWidth, y + gridHeight * 3);
}
ﻩ //画光标
gg、setColor(focusColor);
gg、drawLine(currentX, currentY,currentX
+ gridWidth /5, currentY);
ﻩ gg、drawLine(currentX, currentY, currentX,currentY + gridHeight /5);
gg、drawLine(currentX +gridWidth*4/5,currentY,currentX + gridWidth, currentY);
gg、drawLine(currentX + gridWidth, currentY, currentX + gridWidth,currentY + gridHeight /5);
ﻩ gg、drawLine(currentX,currentY + gridHeight * 4/ 5,currentX, currentY + gridHeight);
gg、drawLine(currentX,currentY + gridHeight,currentX + gridWidth / 5,currentY + gridHeight);
gg、drawLine(currentX +gridWidth*4/5,currentY + gridHeight, currentX + gridWidth,currentY + gridHeight);
gg、drawLine(currentX + gridWidth,currentY
+ gridHeight *4 / 5,currentX + gridWidth, currentY
+ gridHeight);
ﻩ repaint();
ﻩ }
catch (Exception e) {
ﻩ System、out、println("moveFoucs Error:" + e);
ﻩ }
}
/*
* 画格子,并画棋子。把这部分独立出来主要就是要检查边界问题
* xﻩﻩ格子右上角x
* y 格子右上角y
* width 格子宽度
* height 格子高度
*/
private void mydrawRect(int x, int y, int width, int height) {
int a, b;
ﻩ a = (x - baseX) / gridWidth + 1;
b = (y - baseY) / gridHeight + 1;
ﻩ if (a != lineNumber && b != lineNumber) {
ﻩ gg、setColor(lineColor);
ﻩ gg、drawRect(x, y + 1, width, height);
ﻩ }
ﻩ DrawChessman(x, y);
}
//画棋子,x,y分别就是圆得中心坐标,棋子得直径为格子边长(格子为正方形)得4/5
public void DrawChessman(int x, int y) {
try {
int a;
int b;
a = (x — baseX) / gridWidth + 1;
b = (y - baseY) / gridHeight + 1;
if (a > lineNumber || a < 1 || b > lineNumber || b 〈 1) {
return;
}
if (qipan[ (b - 1) * lineNumber + a —
1] == 1)
gg、setColor(0, 0, 0);
else if (qipan[ (b - 1) * lineNumber + a — 1] == 2)
gg、setColor(255, 255, 255);
else {
return;
}
gg、fillArc(x — gridWidth * 2 / 5, y - gridHeight * 2 / 5,
gridWidth * 4 / 5, gridHeight
* 4 / 5, 0, 360);
if (LastA == a && LastB == b) {
gg、setColor(0xff0000);
gg、drawLine(x, y — gridHeight / 5, x,
y + gridHeight / 5);
gg、drawLine(x - gridWidth / 5, y, x + gridWidth / 5, y);
}
repaint();
}
catch (Exception e) {
System、out、println("DrawChessman Error:" + e);
}
}
//键盘被按下。主要就是移动焦点,以及落子得处理
protected void keyPressed(int keycode) {
if(keycode==getKeyCode(Canvas、LEFT)){
if (currentX < baseX)return;
ﻩ currentX = currentX - gridWidth;
currentA--;
ﻩ moveFoucs(currentX - gridWidth / 2,
currentY — gridHeight / 2,
gridWidth * 3, gridHeight *
2);
}
if(keycode==getKeyCode(Canvas、RIGHT)){
ﻩ if (currentX > baseX + gridWidth * (lineNumber - 2))return;
currentX = currentX + gridWidth;
ﻩ currentA++;
ﻩ moveFoucs(currentX — gridWidth * 3 /
2, currentY — gridHeight / 2,
gridWidth * 3, gridHeight * 2);
ﻩ }
ﻩ if(keycode==getKeyCode(Canvas、UP)){
if (currentY < baseY)return;
currentY = currentY - gridHeight;
currentB--;
ﻩ moveFoucs(currentX - gridWidth / 2, currentY — gridHeight / 2,
gridWidth * 2, gridHeight * 3);
ﻩ }
ﻩ if(keycode==getKeyCode(Canvas、DOWN)){
ﻩ if (currentY 〉 baseY + gridHeight *
(lineNumber — 2))return;
ﻩ currentY = currentY + gridHeight;
currentB++;
moveFoucs(currentX - gridWidth /
2, currentY — gridHeight * 3 / 2,
gridWidth * 2, gridHeight * 3);
ﻩ }
ﻩ if(keycode==getKeyCode(Canvas、FIRE)){
ﻩ if (intPlayer == 0) {
if (qipan[lineNumber * (currentB -
1) + currentA — 1] != 0) {
ﻩ System、out、println("此处有子");
ﻩﻩ return;
ﻩ }
ﻩ }
qipan[lineNumber * (currentB - 1)
+ currentA - 1] = 1;
DrawChessman(currentX + gridWidth / 2,
currentY + gridHeight / 2);
gotoValue = tk();
ﻩ //检查人就是否胜利
if (checkVictory())return;
//模拟电脑下一个
intPlayer = 1;
int a = currentA;
ﻩ int b = currentB;
ﻩ qipan[gotoValue] = 2;
a = LastA;
b = LastB;
ﻩ LastA = (gotoValue + 1) % lineNumber;
ﻩ LastB = (gotoValue + 1 - LastA) / lineNumber + 1;
ﻩ DrawChessman( (a - 1) * gridWidth +
baseX,
ﻩ (b — 1) * gridHeight + baseY);
DrawChessman( (LastA - 1) * gridWidth
+ baseX,
ﻩ (LastB — 1) * gridHeight + baseY);
tk();
checkVictory();
ﻩ //准备人下
ﻩ intPlayer = 0;
}
ﻩ }
//分析当前就是否有一方胜利。并找出下一步该走在何处
private int tk() {
try {
int[] e = {1, 2, 4, 12, 24};
int[] c = new int[3];
int g_b = 0; //此变量记录电脑应下于何处
int n = 0;
int p;
int a0;
int h;
int a;
int d = 0;
int z = 0;
for (p = 0; p 〈 3; p++) { //对两个大数组清零
for (a0 = 0; a0 < lineNumber * lineNumber;
a0++) {
q[p][a0] = 0;
m[p][a0] = 0;
}
}
for (a0 = 0; a0 < lineNumber * lineNumber; a0++) {
for (d = 0; d 〈 4; d++) {
if ( (a0 / lineNumber < (lineNumber - 4)
|| d == 0) &&
(a0 % lineNumber < (lineNumber — 4) || d == 1 || d == 2) &&
(a0 % lineNumber > 3 || d != 2))
{
c[1] = 0;
c[2] = 0;
for (z = 0; z < 5; z++) {
c[qipan[a0 + z * g[d]]]++;
}
if (c[1] == 0)
p = 2;
else if (c[2] == 0)
p = 1;
else
p = 0;
if (p != 0) {
for (z = 0; z < 5; z++) {
if (c[p] == 5)
//记录五个子得坐标
wuzi[z] = a0 + z * g[d];
else if (qipan[a0 + z * g[d]]
== 0) {
a = a0 + z * g[d];
q[0][a] += e[c[p]];
if (c[p] 〉= 2)
q[p][a] += e[c[p]];
if (c[p] > m[p][a])
m[p][a] = c[p];
}
}
}
}
}
for (p = 1; p < 3; p++)
if (q[p][a0] >= e[4]) {
h = 2 * m[p][a0];
if (p == 2)
h++;
if (q[0][a0] 〈 lineNumber * lineNumber)
q[0][a0] += lineNumber * lineNumber * h;
else if (q[0][a0] < lineNumber * lineNumber * h)
q[0][a0] = lineNumber * lineNumber *
h;
}
if (q[0][a0] 〉 q[0][g_b])
n = 0;
if (q[0][a0] >= q[0][g_b]) {
n++;
if ( (rnd、nextInt() & 0x7FFFFFFF) %
1000 * n / 1000 < 1)
g_b = a0;
}
}
return g_b;
}
catch (Exception e) {
System、out、println(”tk Error:” + e);
return 0;
}
}
//检查就是否有一方胜出,并做出相应处理
private boolean checkVictory() {
if (wuzi[1] != 0) { //WuZi[1]!=0表示已经大到5个了,一方胜利
String ShowString;
if (intPlayer == 0)
ShowString = ”您赢了!”;
else
ShowString = "电脑赢了!”;
gg、drawString(ShowString, baseX,raphics、TOP | Graphics、LEFT);
return true;
}
else {
return false;
}
}
}
eY, bas G
版权声明:本文标题:java五子棋小游戏实验报告(附源代码) 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1702938373h436669.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论