java五子棋小游戏课程设计.docx
《java五子棋小游戏课程设计.docx》由会员分享,可在线阅读,更多相关《java五子棋小游戏课程设计.docx(39页珍藏版)》请在冰豆网上搜索。
java五子棋小游戏课程设计
五子棋小游戏
1.课程设计的目的
通过此次课程设计,巩固所学Java语言基本知识,增进Java语言编辑基本功,掌握JDK、Editplus、Eclipse、JCreator等开发工具的运用,拓宽常用类库的应用。
使我们通过该教学环节与手段,把所学课程及相关知识加以融会贯通,全面掌握Java语言的编程思想及面向对象程序设计的方法,为今后从事实际工作打下坚实的基础。
2.设计方案论证
2.1设计思路
(1)界面棋盘设计
在对棋盘界面设计方面要考虑简洁友好,符合游戏者需求。
棋子的设计方面系统中设置了两种棋子颜色,white或者black,游戏者可自行选择。
棋子怎样画出来,怎样使棋子按我们所想的方式来绘制出来是设计的主要难题。
运行时要求当每次点击鼠标的时候就在点击鼠标的地方画一个棋子,所以得定义一个棋子的类使点击鼠标时系统把棋子绘制出来。
这样主界面里的棋子就确定了,而且也确定了几个所需要的类。
可以先定义好这些类了。
有了以上的准备就可以把棋盘绘制出来了,下棋时每次在适当位置点击鼠标的时候就在所点击的位置上画出你这个角色的颜色,然后计算机会自动的下棋,计算机自动下棋要有一个控制变量来控制能不能下棋。
人可以随意的下子,可是计算机就要计算在哪个位置下子了。
这里由计算机下子的算法来确定,人人对战的话就不象单机游戏一样,要计算机来判断人下子之后计算机下那一个地方了,人人对战只要在双方下子的时候判断赢棋情况,当然还要同步的控制两个人下棋的顺序,这样的话就要用到线程了,各自都继承或实现线程类或接口,以便各自能随时单独控制接发消息。
(2)算法设计
对于五子棋游戏,无论人机对战,还是双人对战,都需要判断棋盘上是否存在五子连珠情况,这既是游戏名字的由来,也是游戏结束的标志。
判断五子连珠的原理是从横,竖,左斜线,右斜线4条线上判断是否存在5个相连的同类棋子。
对战一方落子后,在该处向8个方向检测连续的同类棋子,如果检测到直线方向上存在5个连续的同类棋子(包含本位置棋子),则判断为“连五”并结束检测循环。
基于检测结果,可以判断游戏是否结束,并根据获胜方的落子代码判断获胜方是谁。
由于不考虑禁手问题,在实现“连五”过程中,我们可以考虑完成“双四”,“四三”,“双三”,“冲四”,“活三”,“活四”来实现目的。
活四:
有两个点能形成“连五”的四就是活四;
冲四:
只有一个点能形成“连五”的四叫做“冲四”,或者叫做“单四”;
活三:
己方在落一子就能形成“活四”的三叫做“活三”。
“活三”分为“连活三”和“跳活三”。
连活三:
在棋盘某一条阳线或阴线上有同色三子相连,且在此三子两端延长线上有一端至少有一个,另一端至少有两个无子的交叉点与此三子紧密相连。
跳活三:
中间仅间隔一个无子交叉点的连三,但两端延长线均至少有一个无子的交叉点与此三子相连。
双三:
由于黑方走一着在无子交叉点上同时形成二个或二个以上黑方"活"的局面。
双四:
由于黑方走一着在无子交叉点上同时形成二个或二个以上黑方"四"的局面。
四三:
指某一方同时具备两个先手,其中一个是"四",一个是"活三"。
在实现上面这些高级算法的时候,我们需要一个基础,就是对制定位置周围情况进行检测。
在棋盘上面,棋子存在8个移动方向,检测时需要对每个方向进行检测。
为了简单直观,这里将每步棋子的移动生成一个新的棋子。
2.2需求分析
一款小游戏的确立是建立在各种各样的需求上面的,这种需求往往来自于玩家的实际需求,其中玩家的实际需求最为重要.面对游戏拥有不同知识和理解层面的玩家,游戏制作人对玩家需求的理解程度,在很大程度上决定了此类游戏开发的成败.因此如何更好地的了解,分析,明确玩家需求,并且能够准确,清晰以文档的形式表达给游戏制作人,保证开发过程按照满足玩家需求为目的正确开发方向进行,是每游戏游戏制作人需要面对的问题。
作为五子棋的设计需要考虑到的最基本的需求莫过于人机对战与人人对战功能的实现,当然还有下棋过程中的下棋悔棋功能以及判断游戏的胜负等方面的要求。
当然最好是要考虑到界面的友好性,作为一个娱乐软件,还应该考虑到玩家在游戏时的舒适性。
2.3功能模块图
图1.功能模块图
2.4设计方法
2.4.1ChessFrame主要功能
类ChessFrame主要功能是创建五子棋游戏主窗体和菜单,主要代码如下:
classChessFrameextendsJFrameimplementsActionListener{
privateString[]strsize={"20x15","30x20","40x30"};
privateString[]strmode={"人机对弈","人人对弈"};
publicstaticbooleaniscomputer=true,checkcomputer=true;
privateintwidth,height;
privateChessModelcm;
privateMainPanelmp;
2.4.2游戏主窗体
构造五子棋游戏的主窗体,主要代码如下:
publicChessFrame(){
this.setTitle("五子棋游戏");
cm=newChessModel
(1);
mp=newMainPanel(cm);
Containercon=this.getContentPane();
con.add(mp,"Center");
this.setResizable(false);
this.addWindowListener(newChessWindowEvent());
MapSize(20,15);
JMenuBarmbar=newJMenuBar();
this.setJMenuBar(mbar);
JMenugameMenu=newJMenu("游戏");
mbar.add(makeMenu(gameMenu,newObject[]{
"开局","棋盘","模式",null,"退出"
},this));
JMenulookMenu=newJMenu("视图");
mbar.add(makeMenu(lookMenu,newObject[]{
"Metal","Motif","Windows"
},this));
JMenuhelpMenu=newJMenu("帮助");
mbar.add(makeMenu(helpMenu,newObject[]{
"关于"
},this));
}
2.4.3主菜单
构造五子棋游戏的主菜单,代码如下:
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;
}
3.设计结果与分析
(1)五子棋游戏的主界面,如图2所示。
图2程序主界面
(2)五子棋游戏的结束界面,如图3所示。
图3游戏结束界面
(3)游戏游戏栏中的各个选项,如图4所示。
图4Game栏中的选项
(4)视图设置栏中的各个选项,如图5所示。
图5Configure栏中的各个选项
(5)Help帮助栏中的选项,如图6所示。
图6Help栏中的选项
(6)点击Help栏中的About选项弹出的界面,如图7所示。
图7About选项弹出时的界面
4.设计体会
通过这次课程设计,我进一步加深对基础理论的理解,扩大专业知识面,对收集资料、查阅文献、方案制定等实践方面得到了很好的锻练,促进对所学知识应用能力的提高。
同时我渐渐的复习了Java使用方法和编程语法,之后的编程过程也相对得心应手,基本完成了预期计划的要求。
在此感谢我的指导老师—冯云老师,她在课题的研究上不遗余力的给予指导。
她严谨的治学态度深深的影响了我,使我受益匪浅!
5.参考文献
[1]耿祥义.JAVA大学实用教程.北京:
电子工业出版社.2005.3:
85-113
[2]朱战立,沈伟.Java程序设计实用指南.北京:
电子工业出版社,2005.1:
48-135
[3]唐大仕.Java程序设计[M].北京:
北方交通大学出版社:
2007.05:
56-92
[4]叶核亚.JAVA2程序设计实用教程[M].北京:
电子工业出版社;2008.4:
64-98
[5]邢素萍.JAVA办公自动化项目方案精解[M].北京:
航空工业出版社,2006.9:
35-120
附录
//Java编程:
五子棋游戏源代码
importjava.awt.*;
importjava.awt.event.*;
importjava.applet.*;
importjavax.swing.*;
importjava.io.PrintStream;
importjavax.swing.JComponent;
importjavax.swing.JPanel;
/*
*main方法创建了ChessFrame类的一个实例对象(cf),
*并启动屏幕显示显示该实例对象。
**/
publicclassFiveChessAppletDemo{
publicstaticvoidmain(Stringargs[]){
ChessFramecf=newChessFrame();
cf.show();
}
}
/*
*类ChessFrame主要功能是创建五子棋游戏主窗体和菜单
**/
classChessFrameextendsJFrameimplementsActionListener{
privateString[]strsize={"20x15","30x20","40x30"};
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(20,15);
JMenuBarmbar=newJMenuBar();
this.setJMenuBar(mbar);
JMenugameMenu=newJMenu("游戏");
mbar.add(makeMenu(gameMenu,newObject[]{
"开局","棋盘","模式",null,"退出"
},this));
JMenulookMenu=newJMenu("视图");
mbar.add(makeMenu(lookMenu,newObject[]{
"Metal","Motif","Windows"
},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;
}
//构造五子棋游戏的单选按钮式菜单项
publicJRadioButtonMenuItemmakeRadioButtonMenuItem(
Objectitem,Objecttarget){
JRadioButtonMenuItemr=null;
if(iteminstanceofString)
r=newJRadioButtonMenuItem((String)item);
elseif(iteminstanceofJRadioButtonMenuItem)
r=(JRadioButtonMenuItem)item;
else
returnnull;
if(targetinstanceofActionListener)
r.addActionListener((ActionListener)target);
returnr;
}
publicvoidMapSize(intw,inth){
setSize(w*20+50,h*20+100);
if(this.checkcomputer)
this.iscomputer=true;
else
this.iscomputer=false;
mp.setModel(cm);
mp.repaint();
}
publicbooleangetiscomputer(){
returnthis.iscomputer;
}
publicvoidrestart(){
intmodeChess=cm.getModeChess();
if(modeChess<=3&&modeChess>=1){
cm=newChessModel(modeChess);
MapSize(cm.getWidth(),cm.getHeight());
}else{
System.out.println("\u81EA\u5B9A\u4E49");
}
}
publicvoidactionPerformed(ActionEvente){
Stringarg=e.getActionCommand();
try{
if(arg.equals("Windows"))
UIManager.setLookAndFeel(
"com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
elseif(arg.equals("Motif"))
UIManager.setLookAndFeel(
"com.sun.java.swing.plaf.motif.MotifLookAndFeel");
else
UIManager.setLookAndFeel(
"javax.swing.plaf.metal.MetalLookAndFeel");
SwingUtilities.updateComponentTreeUI(this);
}catch(Exceptionee){}
if(arg.equals("20x15")){
this.width=20;
this.height=15;
cm=newChessModel
(1);
MapSize(this.width,this.height);
SwingUtilities.updateComponentTreeUI(this);
}
if(arg.equals("30x20")){
this.width=30;
this.height=20;
cm=newChessModel
(2);
MapSize(this.width,this.height);
SwingUtilities.updateComponentTreeUI(this);
}
if(arg.equals("40x30")){
this.width=40;
this.height=30;
cm=newChessModel(3);
MapSize(this.width,this.height);
SwingUtilities.updateComponentTreeUI(this);
}
if(arg.equals("人机对弈")){
this.checkcomputer=true;
this.iscomputer=true;
cm=newChessModel(cm.getModeChess());
MapSize(cm.getWidth(),cm.getHeight());
SwingUtilities.updateComponentTreeUI(this);
}
if(arg.equals("人人对弈")){
this.checkcomputer=false;
this.iscomputer=false;
cm=newChessModel(cm.getModeChess());
MapSize(cm.getWidth(),cm.getHeight());
SwingUtilities.updateComponentTreeUI(this);
}
if(arg.equals("开局")){
restart();
}
if(arg.equals("关于"))
JOptionPane.showMessageDialog(this,"五子棋游戏测试版本","关于",0);
if(arg.equals("退出"))
System.exit(0);
}
}
/*
*类ChessModel实现了整个五子棋程序算法的核心
*/
classChessModel{
//棋盘的宽度、高度、棋盘的模式(如20×15)
privateintwidth,height,modeChess;
//棋盘方格的横向、纵向