java五子棋的设计与实现.docx
《java五子棋的设计与实现.docx》由会员分享,可在线阅读,更多相关《java五子棋的设计与实现.docx(23页珍藏版)》请在冰豆网上搜索。
java五子棋的设计与实现
安阳工学院
JAVA课程综合项目报告
项目题目:
五子棋
专业班级:
学生姓名:
学生学号:
指导教师姓名:
2012年6月
安阳工学院计算机学院制
目录
一、系统目标1
1.1系统使用范围要求1
1.2功能要求1
1.3性能需求1
二、系统设计思路2
2.1界面棋盘设计2
2.2算法设计2
三、系统详细设计3
3.1工作原理图3
3.2类图4
3.3具体类方法介绍5
四、系统实现12
五、系统设计总结16
六、参考文献17
五子棋
一、系统目标
1.1系统使用范围要求
此系统为智力游戏,适合于各类游戏爱好者。
由于其经典性及其游戏的简单性,各类人士都可以也都爱玩。
人们在与电脑对战享受娱乐的同时,也会体会到自己的智力也会有所提升。
1.2功能要求
该款游戏主要由一下几个模块组成:
(1)人机对弈模式:
选择该模式可以实现人与电脑之间的对弈,电脑会智能的
选择该在哪处下子,并会在每次下棋结束后判断是否有哪方已经获胜,如果获胜则结束本局游戏,并提示玩家游戏结束。
(2)人人对弈模式:
选择该模式可以实现人与人之间的对弈,系统会提示哪方先下,然后玩家之间交替的下棋,同样系统会在下完每次棋后判断是否有哪方已经获胜,如果获胜则结束本局游戏,并提示玩家游戏结束。
(3)更换棋盘背景:
该功能可以根据玩家的爱好任意更换棋盘的背景颜色,由于每个人对颜色的喜好不一样,因此这个功能也是非常必需的。
也行更换一种玩家所喜欢的颜色,玩家能发挥得更好。
(4)更换棋盘大小:
该功能可以根据玩家的水平更换棋盘大小,由于每个人水平不同,需要的棋盘大小也不一样,有的几个回合就可以结束的可以用小棋盘,棋力差不多相当的可以用中等或者大棋盘。
1.3性能需求
该款五子棋游戏功能虽然简单,但最主要的还是实现了人人对弈模式和人机对弈两种模式,所以从这个角度来说,该款游戏需要能很好的在两种模式间良好的转换。
虽然系统不大,但要在满足玩家的基本要求的情况下,电脑有一定的智能,能给于新手一定的帮助。
二、系统设计思路
2.1界面棋盘设计
在对棋盘界面设计方面要考虑简洁友好,符合游戏者需求。
棋子的设计方面系统中设置了两种棋子颜色,黑和白。
棋子怎样画出来,怎样使棋子按我们所想的方式来绘制出来是设计的主要难题。
运行时要求当每次点击鼠标的时候就在点击鼠标的地方画一个棋子,所以得定义一个棋子的类使点击鼠标时系统把棋子绘制出来。
这样主界面里的棋子就确定了,而且也确定了几个所需要的类。
可以先定义好这些类了。
有了以上的准备就可以把棋盘绘制出来了,下棋时每次在适当位置点击鼠标的时候就在所点击的位置上画出你这个角色的颜色,然后计算机会自动的下棋,计算机自动下棋要有一个控制变量来控制能不能下棋。
人可以随意的下子,可是计算机就要计算在哪个位置下子了。
这里由计算机下子的算法来确定,人人对战的话就不象单机游戏一样,要计算机来判断人下子之后计算机下那一个地方了,人人对战只要在双方下子的时候判断赢棋情况,当然还要同步的控制两个人下棋的顺序,这样的话就要用到线程了,各自都继承或实现线程类或接口,以便各自能随时单独控制接发消息。
2.2算法设计
对于五子棋游戏,无论人机对战,还是双人对战,都需要判断棋盘上是否存在五子珠情况,这既是游戏名字的由来,也是游戏结束的标志。
判断五子连珠的原理是从横,竖,左斜线,右斜线4条线上判断是否存在5个相连的同类棋子。
对战一方落子后,在该处向8个方向检测连续的同类棋子,如果检测到直线方向上存在5个连续的同类棋子(包含本位置棋子),则判断为“连五”并结束检测循环。
基于检测结果,可以判断游戏是否结束,并根据获胜方的落子代码判断获胜方是谁。
由于不考虑禁手问题,在实现“连五”过程中,我们可以考虑完成“双四”,“四三”,“双三”,“冲四”,“活三”,“活四”来实现目的。
活四:
有两个点能形成“连五”的四就是活四;
冲四:
只有一个点能形成“连五”的四叫做“冲四”,或者叫做“单四”;
活三:
己方在落一子就能形成“活四”的三叫做“活三”。
“活三”分为“连活三”和“跳活三”。
连活三:
在棋盘某一条阳线或阴线上有同色三子相连,且在此三子两端延长线上有一端至少有一个,另一端至少有两个无子的交叉点与此三子紧密相连。
跳活三:
中间仅间隔一个无子交叉点的连三,但两端延长线均至少有一个无子的交叉点与此三子相连。
双三:
由于黑方走一着在无子交叉点上同时形成二个或二个以上黑方"活"的局面。
双四:
由于黑方走一着在无子交叉点上同时形成二个或二个以上黑方"四"的局面。
四三:
指某一方同时具备两个先手,其中一个是“四”,一个是"活三"。
在实现上面这些高级算法的时候,我们需要一个基础,就是对制定位置周围情况进行检测。
在棋盘上面,棋子存在8个移动方向,检测时需要对每个方向进行检测。
为了简单直观,这里将每步棋子的移动生成一个新的棋子。
三、系统详细设计
3.1工作原理图
图3.1工作原理图
3.2类图
图3.2类图一
图3.3类图二
图3.4类图三
图3.5类图四
3.3具体类方法介绍
main方法创建了ChessFrame类的一个实例对象,
用类ChessFrame创建五子棋游戏主窗体和菜单
importjava.awt.*;
importjava.awt.event.*;
importjava.applet.*;
importjavax.swing.*;
importjava.io.PrintStream;
importjavax.swing.JComponent;
importjavax.swing.JPanel;
classChessFrameextendsJFrameimplementsActionListener{
privateString[]strsize={"标准棋盘","改进棋盘","扩大棋盘"};
privateString[]strmode={"人机对战","人人对战"};
publicstaticbooleaniscomputer=true,checkcomputer=true;
privateintwidth,height;
privateChessModelcm;
privateMainPanelmp;
构造五子棋游戏的主窗体
publicChessFrame(){
this.setTitle("五子棋游戏");
cm=newChessModel
(1);
mp=newMainPanel(cm);
Containercon=this.getContentPane();
con.add(mp,"Center");
this.setResizable(false);
this.addWindowListener(newChessWindowEvent());
MapSize(14,14);
JMenuBarmbar=newJMenuBar();
this.setJMenuBar(mbar);
JMenugameMenu=newJMenu("游戏");
mbar.add(makeMenu(gameMenu,newObject[]{
"开局",null,"棋盘",null,"模式",null,"退出"
},this));
JMenulookMenu=newJMenu("外观");
mbar.add(makeMenu(lookMenu,newObject[]{
"类型一","类型二","类型三"
},this));
JMenuhelpMenu=newJMenu("版本");
mbar.add(makeMenu(helpMenu,newObject[]{
"关于"
},this));
}
构造五子棋游戏的主菜单
publicJMenumakeMenu(Objectparent,Objectitems[],Objecttarget){
JMenum=null;
if(parentinstanceofJMenu)
m=(JMenu)parent;
elseif(parentinstanceofString)
m=newJMenu((String)parent);
else
returnnull;
for(inti=0;iif(items[i]==null)
m.addSeparator();
elseif(items[i]=="棋盘"){
JMenujm=newJMenu("棋盘");
ButtonGroupgroup=newButtonGroup();
JRadioButtonMenuItemrmenu;
for(intj=0;jrmenu=makeRadioButtonMenuItem(strsize[j],target);
if(j==0)
rmenu.setSelected(true);
jm.add(rmenu);
group.add(rmenu);
}
m.add(jm);
}elseif(items[i]=="模式"){
JMenujm=newJMenu("模式");
ButtonGroupgroup=newButtonGroup();
JRadioButtonMenuItemrmenu;
for(inth=0;hrmenu=makeRadioButtonMenuItem(strmode[h],target);
if(h==0)
rmenu.setSelected(true);
jm.add(rmenu);
group.add(rmenu);
}
m.add(jm);
}else
m.add(makeMenuItem(items[i],target));
returnm;
}
构造五子棋游戏的菜单项
publicJMenuItemmakeMenuItem(Objectitem,Objecttarget){
JMenuItemr=null;
if(iteminstanceofString)
r=newJMenuItem((String)item);
elseif(iteminstanceofJMenuItem)
r=(JMenuItem)item;
else
returnnull;
if(targetinstanceofActionListener)
r.addActionListener((ActionListener)target);
returnr;
}
用类ChessModel实现了整个五子棋程序算法的核心
importjava.awt.*;
importjava.awt.event.*;
importjava.applet.*;
importjavax.swing.*;
importjava.io.PrintStream;
importjavax.swing.JComponent;
importjavax.swing.JPanel;
classChessModel{
规定棋盘的宽度、高度、棋盘的模式
privateintwidth,height,modeChess;
规定棋盘方格的横向、纵向坐标
privateintx=0,y=0;
棋盘方格的横向、纵向坐标所对应的棋子颜色,
数组arrMapShow只有3个值:
1,2,3,-1,
其中1代表该棋盘方格上下的棋子为黑子,
2代表该棋盘方格上下的棋子为白子,
3代表为该棋盘方格上没有棋子,
-1代表该棋盘方格不能够下棋子
privateint[][]arrMapShow;
交换棋手的标识,棋盘方格上是否有棋子的标识符
privatebooleanisOdd,isExist;
publicChessModel(){}
该构造方法根据不同的棋盘模式(modeChess)来构建对应大小的棋盘
publicChessModel(intmodeChess){
this.isOdd=true;
if(modeChess==1){
PanelInit(14,14,modeChess);
}
if(modeChess==2){
PanelInit(18,18,modeChess);
}
if(modeChess==3){
PanelInit(22,22,modeChess);
}
}
按照棋盘模式构建棋盘大小
privatevoidPanelInit(intwidth,intheight,intmodeChess){
this.width=width;
this.height=height;
this.modeChess=modeChess;
arrMapShow=newint[width+1][height+1];
for(inti=0;i<=width;i++){
for(intj=0;j<=height;j++){
arrMapShow[i][j]=-1;
}
}
}
用类MainPanel主要完成如下功能:
1、构建一个面板,在该面板上画上棋盘;
2、处理在该棋盘上的鼠标事件(如鼠标左键点击、鼠标右键点击、鼠标拖动等)
importjava.awt.*;
importjava.awt.event.*;
importjava.applet.*;
importjavax.swing.*;
importjava.io.PrintStream;
importjavax.swing.JComponent;
importjavax.swing.JPanel;
classMainPanelextendsJPanel
implementsMouseListener,MouseMotionListener{
设定棋盘的宽度和高度
privateintwidth,height;
privateChessModelcm;
根据棋盘模式设定面板的大小
MainPanel(ChessModelmm){
cm=mm;
width=cm.getWidth();
height=cm.getHeight();
addMouseListener(this);
}
根据棋盘模式设定棋盘的宽度和高度
publicvoidsetModel(ChessModelmm){
cm=mm;
width=cm.getWidth();
height=cm.getHeight();
}
根据坐标计算出棋盘方格棋子的信息(如白子还是黑子),
然后调用draw方法在棋盘上画出相应的棋子
publicvoidpaintComponent(Graphicsg){
super.paintComponent(g);
for(intj=0;j<=height;j++){
for(inti=0;i<=width;i++){
intv=cm.getarrMapShow()[i][j];
draw(g,i,j,v);
}
}
}
根据提供的棋子信息(颜色、坐标)画棋子
publicvoiddraw(Graphicsg,inti,intj,intv){
intx=20*i+20;
inty=20*j+20;
画棋盘
if(i!
=width&&j!
=height){
g.setColor(Color.darkGray);
g.drawRect(x,y,20,20);
}
画黑色棋子
if(v==1){
g.setColor(Color.gray);
g.drawOval(x-8,y-8,16,16);
g.setColor(Color.black);
g.fillOval(x-8,y-8,16,16);
}
画白色棋子
if(v==2){
g.setColor(Color.gray);
g.drawOval(x-8,y-8,16,16);
g.setColor(Color.white);
g.fillOval(x-8,y-8,16,16);
}
if(v==3){
g.setColor(Color.cyan);
g.drawOval(x-8,y-8,16,16);
}
}
响应鼠标的点击事件,根据鼠标的点击来下棋,
根据下棋判断胜负等
publicvoidmousePressed(MouseEventevt){
intx=(evt.getX()-10)/20;
inty=(evt.getY()-10)/20;
System.out.println(x+""+y);
if(evt.getModifiers()==MouseEvent.BUTTON1_MASK){
cm.play(x,y);
System.out.println(cm.getisOdd()+""+cm.getarrMapShow()[x][y]);
repaint();
if(cm.judgeSuccess(x,y,cm.getisOdd())){
cm.showSuccess(this);
evt.consume();
ChessFrame.iscomputer=false;
}
判断是否为人机对弈
if(ChessFrame.iscomputer&&!
cm.getisExist()){
puterDo(cm.getWidth(),cm.getHeight());
repaint();
if(cm.judgeSuccess(cm.getX(),cm.getY(),cm.getisOdd())){
cm.showDefeat(this);
evt.consume();
}
}
}
}
publicvoidmouseClicked(MouseEventevt){}
publicvoidmouseReleased(MouseEventevt){}
publicvoidmouseEntered(MouseEventmouseevt){}
publicvoidmouseExited(MouseEventmouseevent){}
publicvoidmouseDragged(MouseEventevt){}
响应鼠标的拖动事件
publicvoidmouseMoved(MouseEventmoveevt){
intx=(moveevt.getX()-10)/20;
inty=(moveevt.getY()-10)/20;
cm.readyplay(x,y);
repaint();
}
}
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
响应退出窗口
classChessWindowEventextendsWindowAdapter{
publicvoidwindowClosing(WindowEvente){
System.exit(0);
}
ChessWindowEvent()
{
}
}
四、系统实现
程序开发界面如图4.1
图4.1程序开发界面
运行程序结果如图4.2:
图4.2运行界面
棋盘界面一共有三种如下图所示
标准棋盘:
改进棋盘:
图4.2棋盘一
图4.5棋盘三
扩大棋盘:
图4.5棋盘三
外观类型一共三种如下图所示
外观类型一:
外观类型二:
图4.6外形一图4.7外形二
外观类型三:
图4.8外形三
人机对战如图4.9所示:
图4.9人机对战
对战结果如图4.10所示:
图4.10结果图
版本如图4.11所示:
图4.11版本
五、系统设计总结
一个编程语言最强大的地方不是它是容易学,或者难学,而是它拥有一个强大的库。
JAVA是一个完全面向对象的语言,JAVA的命名规则是很容易让人接受的。
而且容易被编程人员记住。
经过实践训练,对JAVA的综合应用能力有了较大的提高,另外对JAVA的特点有了更深层次的认识。
这次实践中使用的代码虽然不长,但类与类之间也有很强的逻辑关系,这就是面向对象语言的最大优势,这样可使我们更轻松的运用JAVA。
经过努力,查阅相关资料,终于完成该课题,虽然效果不是很好,但亲手做过之后还是很有成就感的。
设计过程中,将我本学期所学的JAVA知识得到巩固和应用,在设计的过程中我遇到了很到问题,不过在老师和同学们的帮助和自己的思考下还是很好的完成了。
这此课程设计还让我懂得了写程序不能闭门造车,要努力拓宽知识面,开阔视野,拓展思维。
它还让我学会了在网上查阅那些无限的资料。
通过对此课题的开发,使我对用JCreator开发平台有了一个比较清楚的认识,体会到理论和实践的重要性。
由于自己的分析设计和程序经验不足,该系统设计和实现过程中,还有许多没有完善的地方,比如用户界面设计不够美观,没有能设置禁手,没有能设置悔棋,异常出错处理比较差等多方面问题,这些都有待进一步完善和提高。
对于文中出现的不足和系统中出现的问题敬请老师指导。
通过这次课程设计,我进一步加深对基础理论的理解,扩大专业知识面,对收集资料、查阅文献、方案制定等实践方面得到了很好的锻练,促进对所学知识应用能力的提高。
同时我渐渐的复习了Java使用方法和编程语法,之后的编程过程也相对得心应手,基本完成了预期计划的要求。
在此感谢我的指导老师许研,她在课题的研究上不遗余力的给予指导。
她严谨的治学态度深深的影响了我,老师精心的指导和严格的教诲,无论从学术水平还是学术造诣上都使我受益匪浅!
六、参考文献
[1]耿祥义.JAVA大学实用教程.北京:
电子工业出版社,2005.3;
[2]朱战立,沈伟.Java程序设计实用指南.北京:
电子工业出版社,2005.1;
[3]唐大仕.Java程序设计.北京:
北方交通大学出版社,2007.6;
[4]叶核亚.JAVA2程序设计实用教程.北京:
电子工业出版社,2008.4;
[