《最新java课程设计人机对弈五子棋.doc》由会员分享,可在线阅读,更多相关《最新java课程设计人机对弈五子棋.doc(37页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-datejava课程设计人机对弈五子棋课程设计管理暂行规定Java程序设计课程设计报告学 院: 理学院 班 级: 姓 名: 学 号: 指导教师: 课设时间: 2015-06-23 至2015-06-25 二O一五 年 六月 二十五 日课程设计(论文)任务书 理 学院信息与计算科学 专业 2012-2班一、课程设计(论文)题目: 人机对弈五子棋游戏 二、课程设计(论文)工作:自
2、 2015 年 6 月 23 日起至 2015 年 6 月 25日止三、课程设计(论文) 地点: 5-205 四、课程设计(论文)内容要求:1本课程设计的目的(1)使学生掌握软件开发的基本工作流程; (2)巩固JAVA程序设计课程所学的内容; (3)培养学生的计算机思维能力以及合作的精神;(4)培养学生分析、解决问题的能力;(5)提高学生的科技论文写作能力。 2课程设计的任务及要求1)基本要求:(1)研究课程设计任务,并进行系统需求分析;(2)对系统进行总体设计,分解系统功能模块,进行任务分配,以实现分工合作;(3)实现各功能模块代码; (4)系统组装,测试、完善系统。2)创新要求: 在基本要
3、求达到后,可进行创新设计,如改进界面、增加功能或进行代码优化。3)课程设计论文编写要求(1)要按照书稿的规格打印誊写课程设计论文(2)论文包括封面、设计任务书(含评语)、摘要、目录、设计内容、设计小结(3)论文装订按学校的统一要求完成4)参考文献:(1)丁振凡,JAVA语言程序设计,清华大学出版社(2)丁振凡,JAVA语言程序设计实验指导与习题解答,清华大学出版社(3)5)课程设计进度安排内容 天数 地点系统总体设计 1 实验室软件设计及调试 1 实验室答辩及撰写报告 1 实验室、图书馆 学生签名: 2015年6月25日课程设计(论文)评审意见(1) 课程设计过程(20分):优()、良()、中
4、()、一般()、差( );(2) 是否完成调试,系统运行效果(30分):优()、良()、中()、 一般( )、差( );(3)回答问题(20分):优()、良()、中()、一般()、差();(4)课程设计报告(30分):优()、良()、中()、一般()、差( );(5)格式规范性及考勤是否降等级:是()、否() 评阅人: 职称:教授 2015年 6月25日-人机对弈五子棋游戏设计摘要:近些年来五子棋游戏成为了人们的最爱,游戏的下载量很高可以说一直排在前几位,也是人们日常生活中放松娱乐的最爱,特别是最近IT行业的发展,人工智能的实现,移动客户端的发展和普及为我们五子棋游戏的发展带来了新的生机,新的
5、高潮,人工智能与五子棋的完美结合是五子棋的又一项重要发展,而我们现在开发的人机对弈更是掀起了五子棋发展的新篇章,为五子棋的发展与传播提供了新的机会,但是机会与挑战并存,我们相信通过我们对五子棋程序的不断优化和完善,五子棋一定会越来越受到大家的欢迎。本次课程设计要求利用Java语言设计出一个人机对弈五子棋游戏,能实现人机对弈五子棋。了解五子棋对弈规则后,利用本学期所学的Java高级图形界面编程方法的知识,并通过穷举法,考虑八个方向连成五子的几率高低,让计算机具有人工智能,成功设计出人机对弈五子棋的游戏。除了人机对弈的功能,我们还增加了人人对战的功能。这项功能使得人与人之间能够互下五子棋,不仅仅是
6、人与计算机对弈。除此之外,还增加了再来一局、认输、悔棋、退出游戏的功能,为了让游戏功能更加丰富,还增加了棋盘、模式、外观三个菜单栏供用户选择相应功能的菜单项。 目录1、课程设计的目的及目标11.1课程设计的目的11.2课程设计的目标12、概要设计12.1开发工具及环境12.2 任务及需求分析12.3 工作原理13、具体实现23.1 类设计24、运行调试与分析讨论35、设计体会与小结106、参考文献10附录:(源程序)101、课程设计的目的及目标1.1课程设计的目的:本次课程设计的目的是为了让学生使用java语言编程的知识,通过编写一个简单的五子棋游戏,检验一个学期以来学习java语言的收获成果
7、,以及检查自己在学习java语言的过程中的漏洞来弥补不足,以便以后更好、更熟练地使用java语言来编写方便、娱乐生活的程序。1.2课程设计的目标:本次课程设计所要求的五子棋游戏应达到以下几方面的要求:1.运行程序后即刻出现棋盘并可以开始下棋;2.先手为黑棋,后手为白棋;人为先手,计算机为后手;3.程序能响应鼠标点击并在相应位置画出棋子;4.计算机具有一定的智能,能够与人进行五子棋对弈;5.程序可以正确判断出局面的胜负情况并及时报出结果,终止棋局;6.尽可能实现人人对战功能。2、概要设计2.1开发工具及环境文本编辑器:记事本;运行环境:命令提示符(DOS环境)。2.2 任务及需求分析设计人机对弈
8、五子棋程序,实现人与计算机进行五子棋对弈,具体任务如下:(1)棋盘布局设计;(2)计算机下子的算法分析;(3)编程实现棋子的绘制以及具体的再来一局、认输、悔棋、退出游戏等功能;(4)运行测试程序,调试纠正运行错误。2.3 工作原理(1)工作过程运行程序后,首先出现五子棋游戏窗体,用户点击游戏菜单项,出现相关子菜单,选择模式子菜单中的人机对弈便可进入人机对弈模式。然后移动鼠标,在窗体的棋盘上点击鼠标下子,即可在棋盘中相应位置显示下的对应棋子。接下来计算机会根据用户下的棋,采取穷举法选择八个方向上赢面最大的位置下子,用户与计算机谁先达到五子连成一线,谁便是获胜方。若选择模式子菜单中的人人对战便可进
9、入人人对战模式。两个用户可同时玩游戏,同样谁先达到五子连成一线,谁便是获胜方。若下棋过程中,双方中有一方要认输,便可选择游戏菜单项中的认输按钮,认输的一方显然失败,另外一方获胜。若双方中有一方要悔棋,便可选择游戏菜单项中的悔棋按钮,经过对方的同意后,才能够重新翻盘,再来一局。若双方势均力敌,可选择游戏菜单项中的棋盘子菜单,点击大号棋盘或超大号棋盘,以便避免棋盘空间不足造成无法分出胜负的情况。若觉得窗体外观不太美观,可选择外观菜单中的三个选项进行选择。为了显示程序的相关制作信息,程序提供了版本菜单进行显示。具体功能实现见第四章节图。(2)工作原理利用图形界面编程实现,利用到的知识点包括:q 窗体
10、的创建和应用界面布局;q 事件处理,包括按钮的动作事件处理,鼠标事件,窗体事件;q 接口知识:事件处理中通过接口约束事件监听者必须实现相应接口中定义的方法;q 流程控制语句:通过条件判断区分不同事件源,作不同操作处理。3、 具体实现3.1 类设计(1) 类名:ChessFrame作用:创建五子棋游戏主窗体和菜单。该类继承JFrame类,实现ActionListener接口。类中含有的方法介绍:q ChessFrame()构造方法:构造五子棋游戏的主窗体;q makeMenu()方法:构造五子棋游戏的主菜单;q makeMenuItem()方法:构造五子棋游戏的菜单项;q makeRadioBu
11、ttonMenuItem()方法:构造五子棋游戏的单选按钮式菜单项。(2) 类名:ChessModel作用:规定棋盘的宽度、高度、棋盘的模式;规定棋盘方格的横向、纵向坐标、棋盘方格的横向、纵向坐标所对应的棋子颜色;并且规定了记录棋盘棋子信息数组arrMapShow只有4个值:1,2,3,-1,其中1代表该棋盘方格上下的棋子为黑子,2代表该棋盘方格上下的棋子为白子,3代表为该棋盘方格上没有棋子,-1代表该棋盘方格不能够下棋子;定义了交换棋手的标识符isOdd,棋盘方格上是否有棋子的标识符isExist。类中含有的主要方法介绍:q ChessModel()构造方法:根据不同的棋盘模式(modeCh
12、ess)来构建对应大小的棋盘;q badxy()方法:判断下子的横向、纵向坐标是否越界;q readyplay()方法:判断该坐标位置是否可下棋子;q play()方法:在该坐标位置下棋子;q computerDo()方法:用穷举法判断每一个坐标点的八个方向的的最大棋子数,最后得出棋子数最大值的坐标,计算机再下子(这八个方向分别是:左、右、上、下、左上、左下、右上、右下);q checkMax()方法:计算棋盘上某一方格上八个方向棋子的最大值;q showSuccess()方法:赢棋后的提示;q showDefeat()方法:输棋后的提示。(3) 类名:MainPanel作用:1、构建一个面板
13、,在该面板上画上棋盘;2、处理在该棋盘上的鼠标事件(如鼠标左键点击、鼠标右键点击、鼠标拖动等);该类继承JPanel类,实现MouseListener、MouseMotionListener接口。类中含有的主要方法介绍:q paintComponent()方法:根据坐标计算出棋盘方格棋子的信息(如白子还是黑子),然后调用draw方法在棋盘上画出相应的棋子;q mousePressed ()方法:响应鼠标的点击事件,根据鼠标的点击来下棋,根据下棋判断胜负等;q mouseMoved()方法:响应鼠标的拖动事件。(4) 类名:FiveChessAppletDemo作用:显示五子棋游戏窗体。类中含有
14、的方法介绍:q main()方法:程序运行的入口,创建了ChessFrame类的一个实例对象(cf),并启动屏幕显示显示该实例对象。(5) 类名: ChessWindowEvent作用:响应退出窗口。类中含有的方法介绍:q windowClosing()方法:处理窗口关闭;q ChessWindowEvent ()构造方法:提供无参构造方法。4、运行调试与分析讨论 图4-1 人机对弈模式选择界面 图4-2 人机对弈界面 图4-3 结果信息显示界面 图4-4人人对战模式选择界面 图4-5 悔棋界面 图4-6 悔棋提示界面 图4-7 悔棋后棋盘清空提示界面 图4-8 悔棋后棋盘清空界面 图4-9
15、认输界面 图4-10 认输提示界面图4-11 认输后结果信息界面 图4-12 棋盘选择界面 图4-13 外观类型选择界面 图4-14 版本选择界面 图4-15 版本信息介绍界面5、设计体会与小结 通过独立完成五子棋对弈系统的后,发现自己在进行软件开发方面提高不少,同时积极利用所学到的新技术用于自己的设计开发过程。另外,在整个开发的过程中,时间也比较仓促。因此,该系统必然会存在一些缺陷和不足。如:没有讨论五子棋禁手的问题。另一个就是电脑按即定的算法去与玩家下子。这种算法有“固定”。不太会变,玩家若是仔细观察,可以掌握其规律。还有就是界面不是很华丽有待改进。尽管本系统存在着很多不足,但其实现了最重
16、要的功能就是有人工智能。这也让我对计算机中的人工智能领域有一定的了解。另一个就在做系统的过程中,我学到了Java的一些基本结构,还有就是对于Java有更深一步的认识。6、参考文献1 丁振凡,JAVA语言程序设计,清华大学出版社.2 丁振凡,JAVA语言程序设计实验指导与习题解答,清华大学出版社.3CharlesPetzold.Windows程序设计.北京大学出版社,2002.4 陈明,Java语言程序设计,清华大学出版社.附录:(源程序)import java.awt.*;import java.awt.event.*;import javax.swing.*;class ChessFrame
17、 extends JFrame implements ActionListenerprivate String strsize=标准棋盘,大号棋盘,超大号棋盘;private String strmode=人机对弈,人人对战;public static boolean iscomputer=true,checkcomputer=true;private int width,height;private ChessModel cm;private MainPanel mp;public ChessFrame() this.setTitle(五子棋游戏); cm=new ChessModel(1)
18、; mp=new MainPanel(cm); Container con=this.getContentPane(); con.add(mp,Center); this.setResizable(false); this.addWindowListener(new ChessWindowEvent(); MapSize(14,14); JMenuBar mbar = new JMenuBar(); this.setJMenuBar(mbar); JMenu gameMenu = new JMenu(游戏); mbar.add(makeMenu(gameMenu, new Object 再来一
19、局, null, 棋盘,null,模式, null,认输, null, 悔棋, null, 退出, this); JMenu lookMenu =new JMenu(外观); mbar.add(makeMenu(lookMenu,new Object 类型一,类型二,类型三,this); JMenu helpMenu = new JMenu(版本); mbar.add(makeMenu(helpMenu, new Object 关于, this);public JMenu makeMenu(Object parent, Object items, Object target) JMenu m
20、= 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(棋盘); ButtonGroup group=new ButtonGroup(); JRadioBu
21、ttonMenuItem rmenu; for (int j=0;jstrsize.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(模式); ButtonGroup group=new ButtonGroup(); JRadioButtonMenuItem rmenu; for (int
22、h=0;hstrmode.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 makeMenuItem(Object item, Object target) JMenuItem r = null; if(item instanceof Stri
23、ng) 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;public JRadioButtonMenuItem makeRadioButtonMenuItem( Object item, Object target) JRadioButtonMenuIte
24、m 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 ActionListener) r.addActionListener(ActionListener)target); return r; public void MapSize(int w,int h
25、) setSize(w * 24, h * 27); if(this.checkcomputer) this.iscomputer=true; else this.iscomputer=false; mp.setModel(cm); mp.repaint(); public boolean getiscomputer() return this.iscomputer; public void restart() int modeChess = cm.getModeChess(); if(modeChess = 0) cm = new ChessModel(modeChess); MapSize
26、(cm.getWidth(),cm.getHeight(); public void actionPerformed(ActionEvent e) String arg=e.getActionCommand(); try if (arg.equals(类型三) UIManager.setLookAndFeel( com.sun.java.swing.plaf.windows.WindowsLookAndFeel); else if(arg.equals(类型二) UIManager.setLookAndFeel( com.sun.java.swing.plaf.motif.MotifLookA
27、ndFeel); else UIManager.setLookAndFeel( javax.swing.plaf.metal.MetalLookAndFeel ); SwingUtilities.updateComponentTreeUI(this); catch(Exception ee) if(arg.equals(标准棋盘) this.width=14; this.height=14; cm=new ChessModel(1); MapSize(this.width,this.height); SwingUtilities.updateComponentTreeUI(this); if(
28、arg.equals(大号棋盘) this.width=18; this.height=18; cm=new ChessModel(2); MapSize(this.width,this.height); SwingUtilities.updateComponentTreeUI(this); if(arg.equals(超大号棋盘) this.width=22; this.height=22; cm=new ChessModel(3); MapSize(this.width,this.height); SwingUtilities.updateComponentTreeUI(this); if
29、(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.getModeChess(); MapSize(cm
30、.getWidth(),cm.getHeight(); SwingUtilities.updateComponentTreeUI(this); if(arg.equals(再来一局) restart(); if(arg.equals(悔棋) if(!checkcomputer) int result = JOptionPane.showConfirmDialog(this, (FiveChessAppletDemo.isBlack=false?白方悔棋,黑方是否同意?:黑方悔棋,白方是否同意?); if (result = 0) JOptionPane.showMessageDialog(th
31、is, 双方同意悔棋决定,棋盘清空!请继续.); restart(); if(arg.equals(认输) int result = JOptionPane.showConfirmDialog(this, 是否认输?); if (result = 0) JOptionPane.showMessageDialog(this,游戏结束,+(FiveChessAppletDemo.isBlack=true?黑方认输,白方获胜!:白方认输,黑方获胜!); if(arg.equals(关于) JOptionPane.showMessageDialog(null, 制作者:黄甜,熊婷婷,谭飘宝,汤素娟,邓
32、婷n 制作时间:2015年6月25日, 课程设计制作介绍,JOptionPane.PLAIN_MESSAGE ); if(arg.equals(退出) System.exit(0);class ChessModel private int width,height,modeChess;private int x=0,y=0;private int arrMapShow;private boolean isOdd,isExist;public ChessModel() public ChessModel(int modeChess) this.isOdd=true; if(modeChess =
33、 1)PanelInit(14, 14, modeChess); if(modeChess = 2)PanelInit(18, 18, modeChess); if(modeChess = 3)PanelInit(22, 22, modeChess);private void PanelInit(int width, int height, int modeChess) this.width = width; this.height = height; this.modeChess = modeChess; arrMapShow = new intwidth+1height+1; for(in
34、t i = 0; i = width; i+)for(int j = 0; j = width+20 | x = height+20 | y 0;public boolean chessExist(int i,int j) if(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
35、 play(int x,int y) if(badxy(x,y) return; if(chessExist(x,y) this.isExist=true; return; else 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(
36、true); System.out.println(计算机走棋 .); for(int i = 0; i = width; i+) for(int j = 0; j max) max=max_temp; this.x=i; this.y=j; setX(this.x); setY(this.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
37、this.y;public int checkMax(int x, int y,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; for(int i=1;ithis.width) break; if(this.arrMapShowx_temp1y_temp1=black_or_white) num+; else break; x_temp1=x_temp; for(int i=1;i5;i+) x_temp1-=1; if(x_temp10) break; if(this.arrMapShowx_temp1y_temp1=black_or_white) num+; else break; if(num5) max_temp=num; x_temp1=x_temp; y_temp1=y_temp; num=0; for(int i=1;i5;i+) y_temp1-=1; if(y_temp10) break; if(this.arrMapShowx_temp1y_temp1=black_or_white) num+; else break; y_temp1=y_temp;
限制150内