语言程序设计资料java五子棋小游戏.docx
《语言程序设计资料java五子棋小游戏.docx》由会员分享,可在线阅读,更多相关《语言程序设计资料java五子棋小游戏.docx(16页珍藏版)》请在冰豆网上搜索。
语言程序设计资料java五子棋小游戏
五子棋小游戏
1.课程设计的目的
计算机技术的不断发展给人们的日常工作和生活都带来了许多益处,从Windows系统的推出使电脑从高雅的学术殿堂走入了寻常百姓家开始,各行各业的人们无须经过特别的训练就能够使用电脑完成许许多多复杂的工作。
然而,虽然现在世界上已经充满了花样繁多的各种软件,但它们依然不能满足用户的各种特殊需要,人们还不得不开发适合自己特殊需求的软件。
Java语言作为一种面向对象的编程语言,具有分布式,可移植,高性能等特点。
通过系统的学习,就可以使用它开发出功能齐全,满足特殊需求的应用程序。
它对学习者掌握技能,开拓思维都有很大的帮助。
如今Java语言在开发休闲游戏上取得了不小的成就,这些休闲游戏凭借健康、方便、互动性强、益智等诸多优点,成为大部分现代人休闲娱乐的首选。
因此我将学过的Java语言技术综合起来,用JCreatorPro开发工具编写了一个五子棋小游戏,这一实践既是对自己学过的技能进行了一次检验,也系统对学过的知识的复习巩固。
2.设计方案论证
2.1设计思路
(1)界面棋盘设计
在对棋盘界面设计方面要考虑简洁友好,符合游戏者需求。
棋子的设计方面系统中设置了两种棋子颜色,white或者black,游戏者可自行选择。
棋子怎样画出来,怎样使棋子按我们所想的方式来绘制出来是设计的主要难题。
运行时要求当每次点击鼠标的时候就在点击鼠标的地方画一个棋子,所以得定义一个棋子的类使点击鼠标时系统把棋子绘制出来。
这样主界面里的棋子就确定了,而且也确定了几个所需要的类。
可以先定义好这些类了。
有了以上的准备就可以把棋盘绘制出来了,下棋时每次在适当位置点击鼠标的时候就在所点击的位置上画出你这个角色的颜色,然后计算机会自动的下棋,计算机自动下棋要有一个控制变量来控制能不能下棋。
人可以随意的下子,可是计算机就要计算在哪个位置下子了。
这里由计算机下子的算法来确定,人人对战的话就不象单机游戏一样,要计算机来判断人下子之后计算机下那一个地方了,人人对战只要在双方下子的时候判断赢棋情况,当然还要同步的控制两个人下棋的顺序,这样的话就要用到线程了,各自都继承或实现线程类或接口,以便各自能随时单独控制接发消息。
(2)算法设计
对于五子棋游戏,无论人机对战,还是双人对战,都需要判断棋盘上是否存在五子连珠情况,这既是游戏名字的由来,也是游戏结束的标志。
判断五子连珠的原理是从横,竖,左斜线,右斜线4条线上判断是否存在5个相连的同类棋子。
对战一方落子后,在该处向8个方向检测连续的同类棋子,如果检测到直线方向上存在5个连续的同类棋子(包含本位置棋子),则判断为“连五”并结束检测循环。
基于检测结果,可以判断游戏是否结束,并根据获胜方的落子代码判断获胜方是谁。
由于不考虑禁手问题,在实现“连五”过程中,我们可以考虑完成“双四”,“四三”,“双三”,“冲四”,“活三”,“活四”来实现目的。
活四:
有两个点能形成“连五”的四就是活四;
冲四:
只有一个点能形成“连五”的四叫做“冲四”,或者叫做“单四”;
活三:
己方在落一子就能形成“活四”的三叫做“活三”。
“活三”分为“连活三”和“跳活三”。
连活三:
在棋盘某一条阳线或阴线上有同色三子相连,且在此三子两端延长线上有一端至少有一个,另一端至少有两个无子的交叉点与此三子紧密相连。
跳活三:
中间仅间隔一个无子交叉点的连三,但两端延长线均至少有一个无子的交叉点与此三子相连。
双三:
由于黑方走一着在无子交叉点上同时形成二个或二个以上黑方"活"的局面。
双四:
由于黑方走一着在无子交叉点上同时形成二个或二个以上黑方"四"的局面。
四三:
指某一方同时具备两个先手,其中一个是"四",一个是"活三"。
在实现上面这些高级算法的时候,我们需要一个基础,就是对制定位置周围情况进行检测。
在棋盘上面,棋子存在8个移动方向,检测时需要对每个方向进行检测。
为了简单直观,这里将每步棋子的移动生成一个新的棋子。
2.2需求分析
一款小游戏的确立是建立在各种各样的需求上面的,这种需求往往来自于玩家的实际需求,其中玩家的实际需求最为重要.面对游戏拥有不同知识和理解层面的玩家,游戏制作人对玩家需求的理解程度,在很大程度上决定了此类游戏开发的成败.因此如何更好地的了解,分析,明确玩家需求,并且能够准确,清晰以文档的形式表达给游戏制作人,保证开发过程按照满足玩家需求为目的正确开发方向进行,是每游戏游戏制作人需要面对的问题。
作为五子棋的设计需要考虑到的最基本的需求莫过于人机对战与人人对战功能的实现,当然还有下棋过程中的下棋悔棋功能以及判断游戏的胜负等方面的要求。
当然最好是要考虑到界面的友好性,作为一个娱乐软件,还应该考虑到玩家在游戏时的舒适性。
2.3设计方法
(1)五子棋的游戏主界面
五子棋主界面包括ChessBot.java,ChessMap.java,ChessPanel.java和Console.java四个文件。
ChessMap是该五子棋游戏的主运行类,其中有运行整个程序的main方法,该文件生成了ChessMap类的一个实例,从而生成了五子棋游戏的界面。
ChessMap类继承自JApplet类,applet是一种不能单独运行但可嵌入在其他应用程序中的小程序。
Applet类必须是任何嵌入Web页或可用JavaAppletViewer查看的applet的超类。
Applet类提供了applet及其运行环境之间的标准接口。
而Japplet是applet的子类。
ChessMap类将所有的功能集中到菜单栏中,并通过调用其他模块来实现五子棋游戏的各个功能。
(2)机器人部分的设计
机器人部分的设计是由ChessBot.java类来实现的。
该java类首先导入了三个函数,分别是math,lang和awt。
该程序定义了棋盘的边长,棋盘的边长通过定义一个私有的int型变量来实现。
将机器人定义成一个方法,通过0和1来确定按下的棋子是机器人自己下的,还是敌人的棋子。
该ChessBot类中还包括了重开一局的方法,该方法通过for循环语句来实现,即重置棋子。
另外一个方法是悔棋,悔棋同样是通过for语句循环来实现,首先通过二维数组算出最后一步棋下的位置,然后通过Step--实现。
最后一个方法是计算当前位置type方是否有nn子相连,相连的情况。
当横向五子连珠,纵向五子连珠,左斜线五子连珠或者是右斜线五子连珠时,比赛结束,同时显示出获胜方的棋子颜色。
四种方向的连珠用for循环语句分别写出其二维数组也就是棋子的位置,从而进行判断棋子有几个棋子相连。
使用endfor语句结束for循环,利用return语句,重复判断棋子的位置以及是否连珠。
(3)五子棋面板的设计
首先导入swing,awt等java包。
ChessPanel继承JPanel的属性类。
定义一系列的私有变量,如棋盘的背景位图,黑棋子的位图,白棋子的位图,以及插入棋子的位置。
该java包还调用了重开一局的方法,以及悔棋的方法。
publicvoidshowMousePos(Pointp)是用来调试用,显示鼠标位置。
publicPointaddChess(intx,inty,inttype)是调试下一步棋,参数为插入点像素坐标。
publicPointaddChess(intx,inty,inttype,booleanisMatrix)实现的功能是算下一步棋,isMatrix位true参数为插入点棋格坐标,否则参数为插入点像素坐标。
当游戏结束的时候使用Graphicsg调用方法,定义一个super.paint类,当winner是黑色方,弹出一个500*200的对话框,显示持GameOver黑色棋子的一方获胜。
当winner是白色方,弹出一个500*200的对话框,显示GameOver持白色棋子的一方获胜。
给棋盘画线代码如下:
g.setColor(Color.BLACK);
for(j=0;j{g.drawLine(h/N/2,h/N*j+h/N/2,w-w/N+(N%2)*(h/N/2),h/N*j+h/N/2);g.drawLine(w/N*j+h/N/2,h/N/2,w/N*j+h/N/2,h-h/N+(N%2)*(h/N/2));}g.fillRect(w/N*7+h/N/2-3,h/N*7+h/N/2-3,6,6);//画5个黑方块g.fillRect(w/N*3+h/N/2-3,h/N*3+h/N/2-3,6,6);g.fillRect(w/N*11+h/N/2-3,h/N*3+h/N/2-3,6,6);g.fillRect(w/N*3+h/N/2-3,h/N*11+h/N/2-3,6,6);g.fillRect(w/N*11+h/N/2-3,h/N*11+h/N/2-3,6,6);}(4)控制台的设计控制台的设计代码如下://:com:bruceeckel:swing:Console.java//ToolforrunningSwingdemosfromthe//console,bothappletsandJFrames.//packagefivelink;importjavax.swing.*;importjava.awt.event.*;publicclassConsole{//Createatitlestringfromtheclassname:publicstaticStringtitle(Objecto){Stringt=o.getClass().toString();//Removetheword"class":if(t.indexOf("class")!=-1)t=t.substring(6);returnt;}publicstaticvoidrun(JFrameframe,intwidth,intheight){frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(width,height);frame.setVisible(true);}publicstaticvoidrun(JAppletapplet,intwidth,intheight){JFrameframe=newJFrame(title(applet));frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.getContentPane().add(applet);frame.setSize(width,height);applet.init();applet.start();frame.setVisible(true);}publicstaticvoidrun(JPanelpanel,intwidth,intheight){JFrameframe=newJFrame(title(panel));frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.getContentPane().add(panel);frame.setSize(width,height);frame.setVisible(true);}}///:~ 3.设计结果与分析(1)五子棋游戏的主界面,如图1所示。图1程序主界面(2)五子棋游戏的结束界面,如图2所示。图2游戏结束界面(3)游戏Game栏中的各个选项,如图3所示。图3Game栏中的选项(4)Configure设置栏中的各个选项,如图4所示。图4Configure栏中的各个选项 (5)Help帮助栏中的选项,如图5所示。图5Help栏中的选项(6)点击Help栏中的About选项弹出的界面,如图6所示。图6About选项弹出时的界面4.设计体会通过这次课程设计,我进一步加深对基础理论的理解,扩大专业知识面,对收集资料、查阅文献、方案制定等实践方面得到了很好的锻练,促进对所学知识应用能力的提高。同时我渐渐的复习了Java使用方法和编程语法,之后的编程过程也相对得心应手,基本完成了预期计划的要求。在此感谢我的指导老师—原玥老师,她在课题的研究上不遗余力的给予指导。她严谨的治学态度深深的影响了我,使我受益匪浅!5.参考文献[1]埃史尔,陈昊鹏.Java编程思想(第4版)[M].北京:机械工业出版社,2007.6:105-121[2]李钟尉,马文强,陈丹丹.Java从入门到精通[M].北京:清华大学出版社,2008.9:234-250[3]Y.DanielLiang,万波,郑海红,潘蓉.Java语言程序设计:基础篇(原书第6版)[M].北京:机械工业出版社,2008.6:355-363[4]IanF.Darwin,关丽荣,张晓坤.Java经典实例(第2版)[M].北京:中国电力出版社,2009.2:179-203 附录ChessMap.javaimportjavax.swing.*;importjavax.swing.event.*;importjava.awt.*;importjava.awt.event.*;import.*;importjava.applet.*;publicclassChessMapextendsJApplet{privateChessBotbot;//电脑AIprivateImageIconmap;//棋盘背景位图privateImageIconblackchess;//黑子位图privateImageIconwhitechess;//白子位图privateChessPanelcp;//棋盘privateJMenuBarmenubar;//以下为下拉菜单privateJMenu[]menu={newJMenu("Game"),newJMenu("Configure"),newJMenu("Help")};privateJMenuItem[]menuitem1={newJMenuItem("Restart",KeyEvent.VK_R),newJMenuItem("Rollback",KeyEvent.VK_O),newJMenuItem("Exit",KeyEvent.VK_X)};privateJMenuItem[]menuitem2={newJMenuItem("Configure...",KeyEvent.VK_C),newJMenuItem("About...",KeyEvent.VK_A),newJMenuItem("Human",KeyEvent.VK_U)};privateintplayer;//人执黑子还是白子privatebooleanhaveai=true;//人与人下还是人与电脑下,true与电脑下classMouseclickedextendsMouseAdapter//判断鼠标左击并通知棋盘和电脑{publicvoidmouseClicked(MouseEvente){Pointp1=newPoint();Pointp2=newPoint();p1=cp.addChess(e.getX(),e.getY(),player);//play(sound);if(cp.isSuccess(player)==true){cp.gameOver(player);if(player==cp.BLACK_ONE){JOptionPane.showMessageDialog(null,"GameOver!BlackWin!");}elseif(player==cp.WHITE_ONE){JOptionPane.showMessageDialog(null,"GameOver!WhiteWin!");}}elseif(haveai){if(cp.isSuccess((-1)*player)==false){p2=bot.play(p1.x,p1.y);cp.addChess(p2.x,p2.y,(-1)*player,true);if(cp.isSuccess((-1)*player)==true){cp.gameOver((-1)*player);if(player==cp.BLACK_ONE){JOptionPane.showMessageDialog(null,"GameOver!WhiteWin!");}elseif(player==cp.WHITE_ONE){JOptionPane.showMessageDialog(null,"GameOver!BlackWin!");}}}}elseplayer*=(-1);}}classMouseMovedimplementsMouseMotionListener//调试用,获得鼠标位置{publicvoidmouseMoved(MouseEvente){cp.showMousePos(e.getPoint());}publicvoidmouseDragged(MouseEvente){}}classMenuitemclickedimplementsActionListener//菜单消息处理{publicvoidactionPerformed(ActionEvente){JMenuItemtarget=(JMenuItem)e.getSource();StringactionCommand=target.getActionCommand();if(actionCommand.equals("Restart"))//重开一局{cp.reset();bot.restart();//player=cp.BLACK_ONE;}if(actionCommand.equals("Rollback"))//悔棋{cp.rollback();bot.rollback()}elseif(actionCommand.equals("Exit"))//退出{System.exit(1);}elseif(actionCommand.equals("Configure"))//执黑子还是执白子{Object[]options={"Black","White"};intsel=JOptionPane.showOptionDialog(null,"Yourside:","choose:",JOptionPane.DEFAULT_OPTION,JOptionPane.QUESTION_MESSAGE,null,options,options[0]);if(sel==1){cp.reset();player=cp.WHITE_ONE;Pointpt=newPoint(bot.playfirst());cp.addChess(pt.x,pt.y,cp.BLACK_ONE,true);}else{cp.reset();player=cp.BLACK_ONE;}}elseif(actionCommand.equals("Human"))//与人下{haveai=false;}elseif(actionCommand.equals("About"))//版权与帮助{JOptionPane.showConfirmDialog(null,"五子棋\nSongYufeng2011","About",JOptionPane.CLOSED_OPTION,JOptionPane.INFORMATION_MESSAGE);}}}Mouseclickedmouseclicked=newMouseclicked();MouseMovedmousemoved=newMouseMoved();Menuitemclickedmenuclicked=newMenuitemclicked();publicvoidinit()//初始化与默认值{inti;map=newImageIcon(getClass().getResource("map.gif"));blackchess=newImageIcon(getClass().getResource("blackchess.gif"));whitechess=newImageIcon(getClass().getResource("whitechess.gif"));cp=newChessPanel(map,blackchess,whitechess);bot=newChessBot(cp.N);menubar=newJMenuBar();menuitem1[0].setActionCommand("Restart");menuitem1[1].setActionCommand("Rollback");menuitem1[2].setActionCommand("Exit");menuitem2[0].setActionCommand("Configure");menuitem2[1].setActionCommand("About");menuitem2[2].setActionCommand("Human");for(i=0;i<3;i++)menu[0].add(menuitem1[i]);menu[1].add(men
{
g.drawLine(h/N/2,h/N*j+h/N/2,w-w/N+(N%2)*(h/N/2),h/N*j+h/N/2);
g.drawLine(w/N*j+h/N/2,h/N/2,w/N*j+h/N/2,h-h/N+(N%2)*(h/N/2));
}
g.fillRect(w/N*7+h/N/2-3,h/N*7+h/N/2-3,6,6);//画5个黑方块
g.fillRect(w/N*3+h/N/2-3,h/N*3+h/N/2-3,6,6);
g.fillRect(w/N*11+h/N/2-3,h/N*3+h/N/2-3,6,6);
g.fillRect(w/N*3+h/N/2-3,h/N*11+h/N/2-3,6,6);
g.fillRect(w/N*11+h/N/2-3,h/N*11+h/N/2-3,6,6);
(4)控制台的设计
控制台的设计代码如下:
//:
com:
bruceeckel:
swing:
Console.java
//ToolforrunningSwingdemosfromthe
//console,bothappletsandJFrames.
//packagefivelink;
importjavax.swing.*;
importjava.awt.event.*;
publicclassConsole{
//Createatitlestringfromtheclassname:
publicstaticStringtitle(Objecto){
Stringt=o.getClass().toString();
//Removetheword"class":
if(t.indexOf("class")!
=-1)
t=t.substring(6);
returnt;
publicstaticvoid
run(JFrameframe,intwidth,intheight){
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(width,height);
frame.setVisible(true);
run(JAppletapplet,intwidth,intheight){
JFrameframe=newJFrame(title(applet));
frame.getContentPane().add(applet);
applet.init();
applet.start();
run(JPanelpanel,intwidth,intheight){
JFrameframe=newJFrame(title(panel));
frame.getContentPane().add(panel);
}///:
~
3.设计结果与分析
(1)五子棋游戏的主界面,如图1所示。
图1程序主界面
(2)五子棋游戏的结束界面,如图2所示。
图2游戏结束界面
(3)游戏Game栏中的各个选项,如图3所示。
图3Game栏中的选项
(4)Configure设置栏中的各个选项,如图4所示。
图4Configure栏中的各个选项
(5)Help帮助栏中的选项,如图5所示。
图5Help栏中的选项
(6)点击Help栏中的About选项弹出的界面,如图6所示。
图6About选项弹出时的界面
4.设计体会
通过这次课程设计,我进一步加深对基础理论的理解,扩大专业知识面,对收集资料、查阅文献、方案制定等实践方面得到了很好的锻练,促进对所学知识应用能力的提高。
同时我渐渐的复习了Java使用方法和编程语法,之后的编程过程也相对得心应手,基本完成了预期计划的要求。
在此感谢我的指导老师—原玥老师,她在课题的研究上不遗余力的给予指导。
她严谨的治学态度深深的影响了我,使我受益匪浅!
5.参考文献
[1]埃史尔,陈昊鹏.Java编程思想(第4版)[M].北京:
机械工业出版社,2007.6:
105-121
[2]李钟尉,马文强,陈丹丹.Java从入门到精通[M].北京:
清华大学出版社,2008.9:
234-250
[3]Y.DanielLiang,万波,郑海红,潘蓉.Java语言程序设计:
基础篇(原书第6版)[M].北京:
机械工业出版社,2008.6:
355-363
[4]IanF.Darwin,关丽荣,张晓坤.Java经典实例(第2版)[M].北京:
中国电力出版社,2009.2:
179-203
附录
ChessMap.java
importjavax.swing.event.*;
importjava.awt.*;
import.*;
importjava.applet.*;
publicclassChessMapextendsJApplet{
privateChessBotbot;//电脑AI
privateImageIconmap;//棋盘背景位图
privateImageIconblackchess;//黑子位图
privateImageIconwhitechess;//白子位图
privateChessPanelcp;//棋盘
privateJMenuBarmenubar;//以下为下拉菜单
privateJMenu[]menu={newJMenu("Game"),newJMenu("Configure"),newJMenu("Help")};
privateJMenuItem[]menuitem1={newJMenuItem("Restart",KeyEvent.VK_R),newJMenuItem("Rollback",KeyEvent.VK_O),newJMenuItem("Exit",KeyEvent.VK_X)};
privateJMenuItem[]menuitem2={newJMenuItem("Configure...",KeyEvent.VK_C),newJMenuItem("About...",KeyEvent.VK_A),newJMenuItem("Human",KeyEvent.VK_U)};
privateintplayer;//人执黑子还是白子
privatebooleanhaveai=true;//人与人下还是人与电脑下,true与电脑下
classMouseclickedextendsMouseAdapter//判断鼠标左击并通知棋盘和电脑
publicvoidmouseClicked(MouseEvente)
Pointp1=newPoint();
Pointp2=newPoint();
p1=cp.addChess(e.getX(),e.getY(),player);
//play(sound);
if(cp.isSuccess(player)==true)
cp.gameOver(player);
if(player==cp.BLACK_ONE)
{JOptionPane.showMessageDialog(null,"GameOver!
BlackWin!
");}
elseif(player==cp.WHITE_ONE)
JOptionPane.showMessageDialog(null,"GameOver!
WhiteWin!
");
elseif(haveai)
if(cp.isSuccess((-1)*player)==false)
p2=bot.play(p1.x,p1.y);
cp.addChess(p2.x,p2.y,(-1)*player,true);
if(cp.isSuccess((-1)*player)==true)
{cp.gameOver((-1)*player);
elseplayer*=(-1);
classMouseMovedimplementsMouseMotionListener//调试用,获得鼠标位置
publicvoidmouseMoved(MouseEvente)
cp.showMousePos(e.getPoint());
publicvoidmouseDragged(MouseEvente)
{}
classMenuitemclickedimplementsActionListener//菜单消息处理
publicvoidactionPerformed(ActionEvente)
JMenuItemtarget=(JMenuItem)e.getSource();
StringactionCommand=target.getActionCommand();
if(actionCommand.equals("Restart"))//重开一局
cp.reset();
bot.restart();
//player=cp.BLACK_ONE;
if(actionCommand.equals("Rollback"))//悔棋
{cp.rollback();
bot.rollback()}
elseif(actionCommand.equals("Exit"))//退出
System.exit
(1);
elseif(actionCommand.equals("Configure"))//执黑子还是执白子
Object[]options={"Black","White"};
intsel=JOptionPane.showOptionDialog(
null,"Yourside:
","choose:
",
JOptionPane.DEFAULT_OPTION,
JOptionPane.QUESTION_MESSAGE,null,
options,options[0]);
if(sel==1)
{cp.reset();
player=cp.WHITE_ONE;
Pointpt=newPoint(bot.playfirst());
cp.addChess(pt.x,pt.y,cp.BLACK_ONE,true);}
else
player=cp.BLACK_ONE;}
elseif(actionCommand.equals("Human"))//与人下
{haveai=false;}
elseif(actionCommand.equals("About"))//版权与帮助
{JOptionPane.showConfirmDialog(null,"五子棋\nSongYufeng2011","About",JOptionPane.CLOSED_OPTION,JOptionPane.INFORMATION_MESSAGE);
}}}
Mouseclickedmouseclicked=newMouseclicked();
MouseMovedmousemoved=newMouseMoved();
Menuitemclickedmenuclicked=newMenuitemclicked();
publicvoidinit()//初始化与默认值
{inti;
map=newImageIcon(getClass().getResource("map.gif"));
blackchess=newImageIcon(getClass().getResource("blackchess.gif"));
whitechess=newImageIcon(getClass().getResource("whitechess.gif"));
cp=newChessPanel(map,blackchess,whitechess);
bot=newChessBot(cp.N);
menubar=newJMenuBar();
menuitem1[0].setActionCommand("Restart");
menuitem1[1].setActionCommand("Rollback");
menuitem1[2].setActionCommand("Exit");
menuitem2[0].setActionCommand("Configure");
menuitem2[1].setActionCommand("About");
menuitem2[2].setActionCommand("Human");
for(i=0;i<3;i++)
menu[0].add(menuitem1[i]);
menu[1].add(men
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1