版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、天津商业大学宝德学院Java程序设计课程报告201201学年第二学期题目五子棋游戏的设计与开发学号学生姓名所在专业所在班级目 录1 引言11.1 设计目的11.2 设计说明22 总体设计32.1 功能模块设计32.2 流程图设计43 测试与运行53.1程序测试53.2程序运行54 总结10参考文献111 引言五子棋是起源于中国古代的传统黑白棋种之一。现代五子棋日文称之为连珠,英译为Renju,英文称之为Gobang或FIR(Five in a Row 的缩写),亦有连五子、五子连、串珠、五目、五目碰、五格等多种称谓。五子棋起源于古代中国,发展于日本,风靡于欧洲。对于它与围棋的关系有两种说法,一
2、说早于围棋,早在 “ 尧造围棋 ” 之前,民间就已有五子棋游戏;一说源于围棋,是围棋发展的一个分支。在中国的文化里,倍受人们的青睐。五子棋是一项老少皆宜、简单易学的棋盘游戏。深受大家喜爱。本次开发的是一个五子棋游戏,这是一个综合性的题目,可以对Java语言中的各项功能有更好的理解和使用,通过具体的程序来加深对Java语言的掌握,提高自己的编程水平,为以后的工作打下一定的基础。11 设计目的五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。发展于日本,流行于欧美。容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。本文
3、使用Java语言编写一个五子棋游戏。具体功能如下:(1)五子棋游戏分为人机对弈和人人对弈两种模式。单击游戏菜单可以在模式中选择人机对弈或人人对弈,在棋盘下选择棋盘大小,开局和退出。(2)在视图菜单下可以选择Metal、Motif、Windows三种棋盘背景视图,(3)在帮助菜单下单击关于弹出对话框“五子棋游戏测试版本”,单击确定进入测试版。(4) 选择棋盘大小后将出现相应大小的五子棋区域,用户使用鼠标左键单击棋盘中任何一个网格交点下棋。 (5)无论是横着、竖着、斜着,只要五个一样颜色的棋子连到一起就是游戏胜利。(6) 程序会自动判断输赢。五子棋胜利后,程序弹出“你赢了,好厉害!”的对话框。五子
4、棋输棋后,程序弹出“你赢了,好厉害!”的对话框。12 设计说明本程序采用Java程序设计语言,在Eclipse平台下编辑、编译与调试。具体程序由2人组成的小组开发而成。小组成员的具体分工如表1所示:表1各成员分工表成员名称完成的主要工作程序设计课程报告* *负责整个程序前期的需求分析和整体功能的架构程序中棋盘的布局设计程序编码程序后期的测试与运行报告的第2章、第3章报告的第1章目录、总结和参考文献的整理报告后期的格式设置2 总体设计21 功能模块设计本程序需实现的主要功能有:(1) 用户可以任意选择人机对弈或人人对弈;(2) 用户可以任意选择棋盘大小;(3) 具有三种不同视图,用户可以随意选择
5、喜欢的棋盘背景;(4) 自动判断输赢。程序的总体功能如图1所示:图1 总体功能图 2. 2 流程图设计程序总体流程如图2所示:图2 总体流程图3 测试与运行31 程序测试在程序代码基本完成后,经过不断的调试与修改,最后测试本次所设计的五子棋游戏能够正常运行,在基本功能与画面上与一般的五子棋游戏没有太大差别,没有出现明显的错误和漏洞,但是在一些细节方面仍然需要完善,比如在游戏中可以加入一些不同语音的提示,在游戏完成和失败的时候可以弹出一些小的Flash动画等。总的来说本次设计在功能上已经基本达到要求,其他细节方面有待以后完善。32 程序运行程序运行主界面如图3所示:图3 程序主界面程序游戏菜单如
6、图4所示:图4 程序主菜单程序视图菜单如图5所示:图5 五子棋视图菜单关于五子棋,如图6所示:图6 关于五子棋各种视图效果如图7所示:图7 Motif视图图13 Motif视图图13 Windows视图5总结一个编程语言最强大的地方不是它是容易学,或者难学,而是它拥有一个强大的库。JAVA是一个完全面向对象的语言,JAVA的命名规则是很容易让人接受的。而且容易被编程人员记住。经过实践训练,对JAVA的综合应用能力有了较大的提高,另外对JAVA的特点有了更深层次的认识。这次实践中使用的代码虽然不长,但类与类之间也有很强的逻辑关系,这就是面向对象语言的最大优势,这样可使我们更轻松的运用JAVA。通
7、过此次课程设计,将我本学期所学的JAVA知识得到巩固和应用,在设计的过程中我遇到了很到问题,不过在老师和同学们的帮助和自己的思考下还是很好的完成了。这此课程设计还让我懂得了写程序不能闭门造车,要努力拓宽知识面,开阔视野,拓展思维。它还让我学会了在网上查阅那些无限的资料。通过对此课题的开发,使我对用Eclipse开发平台有了一个比较清楚的认识,体会到理论和实践的重要性。由于自己的分析设计和程序经验不足,该系统设计和实现过程中,还有许多没有完善的地方,比如用户界面设计不够美观等多方面问题,这些都有待进一步完善和提高。经过编写这个五子棋游戏,我认识到应该注意细节问题,虽然是很小的问题,但可以提高自己
8、编程的能力,而且还可以培养自己编程的严谨性,同时还可以为以后的编程积累经验。编写完这个五子棋游戏,我发现自己有很多的不足,我想如果让我来单独来编写这个游戏,我感觉很吃力,因为这个游戏涉及到好多算法。感触最深的就是我们真的要扎扎实实的打基础!并且我感觉到只要我们自己肯下功夫学习,我们也可以做出很好的东西,不需要每次都抄袭别人的,只有自己的才是最珍贵的!通过该课程设计,全面系统的理解了程序构造的一般原理和基本实现方法。把死板的课本知识变得生动有趣,激发了学习的积极性。把学过的计算机编译原理的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。现在通过自己动手做实验,从
9、实践上认识了操作系统是如何处理命令的,课程设计中程序比较复杂,在调试时应该仔细。 28参考文献1 陈国君Java程序设计基础(第4版)M清华大学出版社,20132 王国全等Java程序设计与应用开发M北京:清华大学出版社,20093 洪维恩Java2面向对象程序设计M北京:中国铁道出版社,20054 教学视频5 各种百度/Java编程:五子棋游戏源代码/导入所需要的包import java.awt.*;import java.awt.event.*;import java.applet.*;import javax.swing.*;import java.io.PrintStream;impo
10、rt javax.swing.JComponent;import javax.swing.JPanel;/*main方法创建了ChessFrame类的一个实例对象(cf),*并启动屏幕显示显示该实例对象。*/public class MyChessFrame public static void main(String args) ChessFrame cf = new ChessFrame(); cf.show(); /*类ChessFrame主要功能是创建五子棋游戏主窗体和菜单*/class ChessFrame extends JFrame implements ActionListen
11、er private String strsize="20x15","30x20","40x30" private String strmode="人机对弈","人人对弈" public static boolean iscomputer=true,checkcomputer=true; private int width,height; private ChessModel cm; private MainPanel mp; /构造五子棋游戏的主窗体 public ChessFrame() t
12、his.setTitle("五子棋游戏");/设置窗口标题为"五子棋游戏" cm=new ChessModel(1); mp=new MainPanel(cm); Container con=this.getContentPane(); con.add(mp,"Center"); this.setResizable(false); this.addWindowListener(new ChessWindowEvent(); MapSize(20,15);/默认棋盘的大小为20*15 JMenuBar mbar = new JMenuB
13、ar(); this.setJMenuBar(mbar); JMenu gameMenu = new JMenu("游戏");/创建"游戏"菜单gameMenu mbar.add(makeMenu(gameMenu, new Object "开局", "棋盘","模式", null, "退出" , this); JMenu lookMenu =new JMenu("视图");/创建"视图"菜单gameMenu mbar.add(make
14、Menu(lookMenu,new Object "Metal","Motif","Windows" ,this);/ JMenu helpMenu = new JMenu("帮助");/创建"帮助"菜单helpMenu mbar.add(makeMenu(helpMenu, new Object "关于" , this);/构造五子棋游戏的主菜单public JMenu makeMenu(Object parent, Object items, Object target)
15、 JMenu m = null; if(parent instanceof JMenu) m = (JMenu)parent; else if(parent instanceof String) m = new JMenu(String)parent); else return null; for(int i = 0; i < items.length; i+) if(itemsi = null) m.addSeparator(); else if(itemsi = "棋盘") JMenu jm = new JMenu("棋盘"); ButtonG
16、roup group=new ButtonGroup(); JRadioButtonMenuItem rmenu; for (int j=0;j<strsize.length;j+) rmenu=makeRadioButtonMenuItem(strsizej,target); if (j=0) rmenu.setSelected(true); jm.add(rmenu); group.add(rmenu); m.add(jm); else if(itemsi = "模式") JMenu jm = new JMenu("模式"); ButtonGr
17、oup group=new ButtonGroup(); JRadioButtonMenuItem rmenu; for (int h=0;h<strmode.length;h+) rmenu=makeRadioButtonMenuItem(strmodeh,target); if(h=0) rmenu.setSelected(true); jm.add(rmenu); group.add(rmenu); m.add(jm); else m.add(makeMenuItem(itemsi, target); return m;/构造五子棋游戏的菜单项public JMenuItem ma
18、keMenuItem(Object item, Object target) JMenuItem r = null; if(item instanceof String) r = new JMenuItem(String)item); else if(item instanceof JMenuItem) r = (JMenuItem)item; else return null; if(target instanceof ActionListener) r.addActionListener(ActionListener)target); return r;/构造五子棋游戏的单选按钮式菜单项p
19、ublic JRadioButtonMenuItem makeRadioButtonMenuItem( Object item, Object target) JRadioButtonMenuItem r = null; if(item instanceof String) r = new JRadioButtonMenuItem(String)item); else if(item instanceof JRadioButtonMenuItem) r = (JRadioButtonMenuItem)item; else return null; if(target instanceof Ac
20、tionListener) r.addActionListener(ActionListener)target); return r; public void MapSize(int w,int h) setSize(w * 20+50 , h * 20+100 ); if(this.checkcomputer) this.iscomputer=true; else this.iscomputer=false; mp.setModel(cm); mp.repaint(); public boolean getiscomputer() return this.iscomputer; public
21、 void restart() int modeChess = cm.getModeChess(); if(modeChess <= 3 && modeChess >= 1) cm = new ChessModel(modeChess); MapSize(cm.getWidth(),cm.getHeight(); else System.out.println("u81EAu5B9Au4E49"); public void actionPerformed(ActionEvent e) String arg=e.getActionCommand()
22、; try if (arg.equals("Windows") UIManager.setLookAndFeel( "com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); else if(arg.equals("Motif") UIManager.setLookAndFeel( "com.sun.java.swing.plaf.motif.MotifLookAndFeel"); else UIManager.setLookAndFeel( "javax
23、.swing.plaf.metal.MetalLookAndFeel" ); SwingUtilities.updateComponentTreeUI(this); catch(Exception ee) if(arg.equals("20x15") this.width=20; this.height=15; cm=new ChessModel(1); MapSize(this.width,this.height); SwingUtilities.updateComponentTreeUI(this); if(arg.equals("30x20&quo
24、t;) this.width=30; this.height=20; cm=new ChessModel(2); MapSize(this.width,this.height); SwingUtilities.updateComponentTreeUI(this); if(arg.equals("40x30") this.width=40; this.height=30; cm=new ChessModel(3); MapSize(this.width,this.height); SwingUtilities.updateComponentTreeUI(this); if(
25、arg.equals("人机对弈") this.checkcomputer=true; this.iscomputer=true; cm=new ChessModel(cm.getModeChess(); MapSize(cm.getWidth(),cm.getHeight(); SwingUtilities.updateComponentTreeUI(this); if(arg.equals("人人对弈") this.checkcomputer=false; this.iscomputer=false; cm=new ChessModel(cm.get
26、ModeChess(); 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);/*类ChessMo
27、del实现了整个五子棋程序算法的核心*/class ChessModel /棋盘的宽度、高度、棋盘的模式(如20×15)private int width,height,modeChess;/棋盘方格的横向、纵向坐标private int x=0,y=0;/棋盘方格的横向、纵向坐标所对应的棋子颜色,/数组arrMapShow只有3个值:1,2,3,-5,/其中1代表该棋盘方格上下的棋子为黑子,/2代表该棋盘方格上下的棋子为白子,/3代表为该棋盘方格上没有棋子,/-5代表该棋盘方格不能够下棋子private int arrMapShow;/交换棋手的标识,棋盘方格上是否有棋子的标识符p
28、rivate boolean isOdd,isExist;public ChessModel() /该构造方法根据不同的棋盘模式(modeChess)来构建对应大小的棋盘public ChessModel(int modeChess) this.isOdd=true; if(modeChess = 1) PanelInit(20, 15, modeChess); if(modeChess = 2) PanelInit(30, 20, modeChess); if(modeChess = 3) PanelInit(40, 30, modeChess); /按照棋盘模式构建棋盘大小private
29、void PanelInit(int width, int height, int modeChess) this.width = width; this.height = height; this.modeChess = modeChess; arrMapShow = new intwidth+1height+1; for(int i = 0; i <= width; i+) for(int j = 0; j <= height; j+) arrMapShowij = -5; /获取是否交换棋手的标识符public boolean getisOdd() return this.i
30、sOdd;/设置交换棋手的标识符public void setisOdd(boolean isodd) if(isodd) this.isOdd=true; else this.isOdd=false;/获取某棋盘方格是否有棋子的标识值public boolean getisExist() return this.isExist;/获取棋盘宽度public int getWidth() return this.width;/获取棋盘高度public int getHeight() return this.height;/获取棋盘模式public int getModeChess() retur
31、n this.modeChess;/获取棋盘方格上棋子的信息public int getarrMapShow() return arrMapShow;/判断下子的横向、纵向坐标是否越界private boolean badxy(int x, int y) if(x >= width+20 | x < 0) return true; return y >= height+20 | y < 0;/计算棋盘上某一方格上八个方向棋子的最大值,/这八个方向分别是:左、右、上、下、左上、左下、右上、右下public boolean chessExist(int i,int j) i
32、f(this.arrMapShowij=1 | this.arrMapShowij=2) return true; return false;/判断该坐标位置是否可下棋子public void readyplay(int x,int y) if(badxy(x,y) return; if (chessExist(x,y) return; this.arrMapShowxy=3;/在该坐标位置下棋子public void play(int x,int y) if(badxy(x,y) return; if(chessExist(x,y) this.isExist=true; return; el
33、se this.isExist=false; if(getisOdd() setisOdd(false); this.arrMapShowxy=1; else setisOdd(true); this.arrMapShowxy=2; /计算机走棋/*说明:用穷举法判断每一个坐标点的四个方向的的最大棋子数,*最后得出棋子数最大值的坐标,下子*/public void computerDo(int width,int height) int max_black,max_white,max_temp,max=0; setisOdd(true); System.out.println("计算
34、机走棋 ."); for(int i = 0; i <= width; i+) for(int j = 0; j <= height; j+) if(!chessExist(i,j)/算法判断是否下子 max_white=checkMax(i,j,2);/判断白子的最大值 max_black=checkMax(i,j,1);/判断黑子的最大值 max_temp=Math.max(max_white,max_black); if(max_temp>max) max=max_temp; this.x=i; this.y=j; setX(this.x); setY(thi
35、s.y); this.arrMapShowthis.xthis.y=2;/记录电脑下子后的横向坐标public void setX(int x) this.x=x;/记录电脑下子后的纵向坐标public void setY(int y) this.y=y;/获取电脑下子的横向坐标public int getX() return this.x;/获取电脑下子的纵向坐标public int getY() return this.y;/计算棋盘上某一方格上八个方向棋子的最大值,/这八个方向分别是:左、右、上、下、左上、左下、右上、右下public int checkMax(int x, int y,
36、int black_or_white) int num=0,max_num,max_temp=0; int x_temp=x,y_temp=y; int x_temp1=x_temp,y_temp1=y_temp; /judge right for(int i=1;i<5;i+) x_temp1+=1; if(x_temp1>this.width) break; if(this.arrMapShowx_temp1y_temp1=black_or_white) num+; else break; /judge left x_temp1=x_temp; for(int i=1;i<
37、;5;i+) x_temp1-=1; if(x_temp1<0) break; if(this.arrMapShowx_temp1y_temp1=black_or_white) num+; else break; if(num<5) max_temp=num; /judge up x_temp1=x_temp; y_temp1=y_temp; num=0; for(int i=1;i<5;i+) y_temp1-=1; if(y_temp1<0) break; if(this.arrMapShowx_temp1y_temp1=black_or_white) num+;
38、else break; /judge down y_temp1=y_temp; for(int i=1;i<5;i+) y_temp1+=1; if(y_temp1>this.height) break; if(this.arrMapShowx_temp1y_temp1=black_or_white) num+; else break; if(num>max_temp&&num<5) max_temp=num; /judge left_up x_temp1=x_temp; y_temp1=y_temp; num=0; for(int i=1;i<5
39、;i+) x_temp1-=1; y_temp1-=1; if(y_temp1<0 | x_temp1<0) break; if(this.arrMapShowx_temp1y_temp1=black_or_white) num+; else break; /judge right_down x_temp1=x_temp; y_temp1=y_temp; for(int i=1;i<5;i+) x_temp1+=1; y_temp1+=1; if(y_temp1>this.height | x_temp1>this.width) break; if(this.ar
40、rMapShowx_temp1y_temp1=black_or_white) num+; else break; if(num>max_temp&&num<5) max_temp=num; /judge right_up x_temp1=x_temp; y_temp1=y_temp; num=0; for(int i=1;i<5;i+) x_temp1+=1; y_temp1-=1; if(y_temp1<0 | x_temp1>this.width) break; if(this.arrMapShowx_temp1y_temp1=black_or
41、_white) num+; else break; /judge left_down x_temp1=x_temp; y_temp1=y_temp; for(int i=1;i<5;i+) x_temp1-=1; y_temp1+=1; if(y_temp1>this.height | x_temp1<0) break; if(this.arrMapShowx_temp1y_temp1=black_or_white) num+; else break; if(num>max_temp&&num<5) max_temp=num; max_num=ma
42、x_temp; return max_num;/判断胜负public boolean judgeSuccess(int x,int y,boolean isodd) int num=1; int arrvalue; int x_temp=x,y_temp=y; if(isodd) arrvalue=2; else arrvalue=1; int x_temp1=x_temp,y_temp1=y_temp; /判断右边 for(int i=1;i<6;i+) x_temp1+=1; if(x_temp1>this.width) break; if(this.arrMapShowx_t
43、emp1y_temp1=arrvalue) num+; else break; /判断左边 x_temp1=x_temp; for(int i=1;i<6;i+) x_temp1-=1; if(x_temp1<0) break; if(this.arrMapShowx_temp1y_temp1=arrvalue) num+; else break; if(num=5) return true; /判断上方 x_temp1=x_temp; y_temp1=y_temp; num=1; for(int i=1;i<6;i+) y_temp1-=1; if(y_temp1<0
44、) break; if(this.arrMapShowx_temp1y_temp1=arrvalue) num+; else break; /判断下方 y_temp1=y_temp; for(int i=1;i<6;i+) y_temp1+=1; if(y_temp1>this.height) break; if(this.arrMapShowx_temp1y_temp1=arrvalue) num+; else break; if(num=5) return true; /判断左上 x_temp1=x_temp; y_temp1=y_temp; num=1; for(int i=
45、1;i<6;i+) x_temp1-=1; y_temp1-=1; if(y_temp1<0 | x_temp1<0) break; if(this.arrMapShowx_temp1y_temp1=arrvalue) num+; else break; /判断右下 x_temp1=x_temp; y_temp1=y_temp; for(int i=1;i<6;i+) x_temp1+=1; y_temp1+=1; if(y_temp1>this.height | x_temp1>this.width) break; if(this.arrMapShowx_
46、temp1y_temp1=arrvalue) num+; else break; if(num=5) return true; /判断右上 x_temp1=x_temp; y_temp1=y_temp; num=1; for(int i=1;i<6;i+) x_temp1+=1; y_temp1-=1; if(y_temp1<0 | x_temp1>this.width) break; if(this.arrMapShowx_temp1y_temp1=arrvalue) num+; else break; /判断左下 x_temp1=x_temp; y_temp1=y_tem
47、p; for(int i=1;i<6;i+) x_temp1-=1; y_temp1+=1; if(y_temp1>this.height | x_temp1<0) break; if(this.arrMapShowx_temp1y_temp1=arrvalue) num+; else break; if(num=5) return true; return false;/赢棋后的提示public void showSuccess(JPanel jp) JOptionPane.showMessageDialog(jp,"你赢了,好厉害!","win", JOptionPane.INFORMATION_MESSAGE);/输棋后的提示public void showDefeat(JPanel jp) JOptionPane.showMessageDialog(jp,"你输了,请重
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安徽省导游资格考试(导游基础知识)模拟试卷2(题后含答案及解析)
- 医保年度考核个人工作总结(7篇)
- 单位防疫不力检讨书(7篇)
- 《煤气的甲烷化》课件
- 条口穴在脏腑调理中的应用-洞察分析
- 舆情传播中的群体极化现象-洞察分析
- 虚拟化资源管理技术-洞察分析
- 污水处理自清洁技术进展-洞察分析
- 新材料技术推广策略研究-洞察分析
- 园林工程信息化管理-洞察分析
- GB/T 13738.2-2017红茶第2部分:工夫红茶
- 第十一章英国自然风景式园林
- 燃气锅炉安全检查表分析(SCL)+评价记录
- 小学四年级除数是两位数的除法练习题
- 消防控制室值班记录1
- 货物质量保证措施
- 工作简化方法改善与流程分析课件
- 部编人教版道德与法治四年级下册《合理消费》优质课件
- 一般自我效能感量表及说明
- 《建筑工程类别划分标准》-全
- 工艺变更通知单
评论
0/150
提交评论