JAVA程序设计课程设计五子棋小游戏

上传人:仙*** 文档编号:137176185 上传时间:2022-08-18 格式:DOC 页数:19 大小:314KB
收藏 版权申诉 举报 下载
JAVA程序设计课程设计五子棋小游戏_第1页
第1页 / 共19页
JAVA程序设计课程设计五子棋小游戏_第2页
第2页 / 共19页
JAVA程序设计课程设计五子棋小游戏_第3页
第3页 / 共19页
资源描述:

《JAVA程序设计课程设计五子棋小游戏》由会员分享,可在线阅读,更多相关《JAVA程序设计课程设计五子棋小游戏(19页珍藏版)》请在装配图网上搜索。

1、JAVA程序设计课程设计题 目: 五子棋小游戏 专 业: 信息与计算科学 学 号: 070930205等 姓 名: 指导教师: 成 绩: 二00九 年 十二 月 九 日1.课程设计研究背景及意义五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。发展于日本,流行于欧美。容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。然则看似很简单的一个小游戏,却对我们这组刚接触JAVA编程的成员来说却是一个不错的挑战,由于水平不限不能做成和电脑进行对战,也对于和其它电脑联机对战的模式不太清楚,故做成一个自己和自己对战的五子棋来考验

2、我们的JAVA的技术。2.课程设计题目描述和要求题目:五子棋小游戏游戏主要界面如下:游戏规则:1,棋子分为黑白两色,采用1919棋盘。2,自己和自己对战,白子和黑子交替下,直到白子或黑子一方有五粒子连在一起,最先完成五粒子连在一起的一方为胜利的一方(可以是横、竖、斜、反斜)。3,允许悔棋,且允许一直悔到棋盘上没有棋子了,悔棋后允许恢复。当悔棋后下子了,则不允许再恢复了。4,有棋子的地方不允许再下棋子了5,落子后不能移动或拿掉。7,胜利后,棋局重新开始。主要功能:1,鼠标点棋盘上的任意一点,棋子会落入离这点最近的一个交叉点处。2,白子和黑子交替下。3,当下到一半时,可以保存进度。4,关闭再打开后

3、,可以重新读取进度再接着下。5,允许悔棋,且允许一直悔到棋盘上没有棋子了。6,悔棋后允许恢复。当悔棋后下子了,则不允许再恢复了。7,下棋的过程中,随时可以重新开始。8,有棋子的地方不允许再下子了。9,当悔到没有棋子的时候会弹出消息。10,任意一方胜利后会弹出消息11,恢复的步数超过了悔棋的步数的时候会弹出消息12,当任意一方胜利后,棋局重新开始。13,设有菜单栏,玩家可以点菜单来完成某种操作。14,当最小化后,能重新还原棋子(棋子不会消失)。15,点菜单栏的“帮助”“关于”会显示这个课程设计小组的成员。3.课程设计报告内容3.1 题目求解的理论依据及算法1,利用JAVA的Swing组件可以实现

4、游戏主界面的设置和菜单的添加。本次发开的小游戏界面比较简单,就一个面板外加一个菜单栏,在面板中绘图。菜单条中有三项分别为:文件(保存进度、读取进度、退出),编辑(悔棋、恢复、重来),帮助(关于)。2,利用JAVA的输入输出类库和文件操作来完成文件的读写来完成保存进度和读取进度的功能。3,利用JAVA的事件处理来完成鼠标,菜单的事件处理。4,利用JAVA的类来生成棋子5,利用JAVA的类的继承和多态,自定义Mypanel来继承JPanel,在Mypanel 中重写paintComponent()方法来实现画在面板中图形的重绘。6,利用JAVA的绘图类Graphics在面板中绘制棋盘,当点鼠标的时

5、候绘制棋子,以及完成重绘。7,利用JAVA的动态数组ArrayList来存储棋子的坐标等等信息。8,建立一个19*19的矩阵来存储棋盘上黑白棋子的信息,初始值全为0,例如:当每12行7列下了一个黑子后,hflag127=1。如果是白子则bflag127=1下一个棋子便对胜负进行一次判断,当hflag或bflag有五个1连在一起的时候则判hflag和bflag对应的一方胜利。9,建立一个棋子的类,有属性:X:棋子在棋盘上的横坐标、Y: 棋子在棋盘上的纵坐标num:这是玩家下的第几个棋子xflag:矩阵的行、yflag:矩阵的列当下一个棋子后产生一个棋子实例,将棋子在棋盘的位置和这是下的第几个子以

6、及第几行和第几列分别赋值给x,y,num,xflag,yflag。10,当num % 2=0的时候画白子,当num % 2=1的时候画黑子。3.2 主要事件处理:1,鼠标事件处理(MouseListener):public void mouseClicked(MouseEvent e) int x = e.getX();/*棋子在棋盘上的横坐标*/int y = e.getY()/*棋子在棋盘上的纵坐标*/;int it = 0, jt = 0; /*矩阵的行和列*/绝对定位棋子即当点在交叉点附近,棋子会落在交叉点if (y 53) /下子不会落到菜单栏上,菜单和标题共高53个像素for (i

7、nt i = 0; i 19; i+) for (int j = 0; j 19; j+) if (pal.henij - 13 = x& (y - 53 = pal.shuij - 13) & (y - 53 = pal.shuij + 13) x = (int) pal.henij;y = (int) pal.shuij;it = i; jt = j;/当绝对定位交叉处没有棋子时画棋子if (bflagitjt = 0 & hflagitjt = 0) if (a % 2 = 0) pal.drawBai(x, y);bflagitjt = 1;/下了一子后这点便不能下子了if (a %

8、2 = 1) pal.drawHei(x, y);hflagitjt = 1; /下了一子后这点便不能下子了Qizi qi = new Qizi(x, y); /将信息保存在棋子属性中qi.setFlagx(it); qi.setFlagy(jt);qi.setX(x); qi.setY(y); qi.setNum(a);pal.list.add(qi);/ 把棋子实例保存到动态数组中huiqiNum = 0;/下子后,便不能悔棋了,悔棋步数重置为0a+;Shengfu();/每下一子对胜负情况进行判断2、动作事件处理(点菜单的时候)(ActionListener):public void a

9、ctionPerformed(ActionEvent e) if (e.getActionCommand().equals(保存进度) handleSave();if (e.getActionCommand().equals(读取进度) handleRead();if (e.getActionCommand().equals(退出) System.exit(0);if (e.getActionCommand().equals(悔棋) handleHuiqi();if (e.getActionCommand().equals(恢复) handleHuifu();if (e.getActionCo

10、mmand().equals(重来) Restart();if (e.getActionCommand().equals(关于.) handleAbout();3、窗口事件处理(WindowAdapter):public void windowClosing(WindowEvent e) System.exit(0);3.3 简要的操作流程(要求画流程图)界面大体构造RestarthandleHuifuhandleHuiqihandleReadhandleSavehandAboutExit(0)退出读取进度保存进度悔棋恢复关于重来帮助文件编辑窗口事件处理(关闭)窗口菜单鼠标事件处理(下子)简要

11、的设计流程:创建窗口初始化菜单、面板对各个菜单项添加事件监听以及鼠标事件监听窗口事件处理动作事件处理鼠标事件处理完成java源代码编写调试修改程序,完善功能3.4事件处理的几个重要方法:1、保存进度(handleSave)public void handleSave() int temp = filec.showSaveDialog(this);if (temp = JFileChooser.APPROVE_OPTION) String path=filec.getSelectedFile().getAbsolutePath();file = new File(path);try file.c

12、reateNewFile();FileOutputStream fout = new FileOutputStream(file);DataOutputStream dout = new DataOutputStream(fout);for (int i = 0; i pal.list.size(); i+) dout.writeInt(pal.list.get(i).getFlagx();dout.writeInt(pal.list.get(i).getFlagy();dout.writeInt(pal.list.get(i).getNum();dout.writeInt(pal.list.

13、get(i).getX();dout.writeInt(pal.list.get(i).getY();fout.close(); catch (FileNotFoundException e) e.printStackTrace(); catch (IOException e) e.printStackTrace();2、读取进度(handleRead)public void handleRead() int temp = filec.showOpenDialog(this);if (temp = JFileChooser.APPROVE_OPTION) Restart();/读取进程前必须清

14、空所有变量String path = filec.getSelectedFile().getAbsolutePath();file = new File(path);try FileInputStream fout = new FileInputStream(file);DataInputStream din = new DataInputStream(fout);/ readInt以4个字节表示一个Int,故要除4,一个循环读了5次,故要除20for (int i = 0; i 0) Qizi temp = pal.list.get(pal.list.size() - 1);pal.beiy

15、ong.add(temp);int tempx = temp.getFlagx();int tempy = temp.getFlagy();if (a % 2 = 1) bflagtempxtempy = 0;if (a % 2 = 0) hflagtempxtempy = 0;pal.list.remove(pal.list.size() - 1);a-;huiqiNum+;repaint(); else JOptionPane.showMessageDialog(this, 已经没棋子了!, 警告,JOptionPane.INFORMATION_MESSAGE);4、处理恢复(handle

16、Huifu)public void handleHuifu() if (huiqiNum 0) Qizi temp = pal.beiyong.get(pal.beiyong.size() - 1);pal.list.add(temp);int tempx = temp.getFlagx();int tempy = temp.getFlagy();if (a % 2 = 1) bflagtempxtempy = 1;if (a % 2 = 0) hflagtempxtempy = 1;pal.beiyong.remove(pal.beiyong.size() - 1);a+;huiqiNum-

17、;repaint(); else JOptionPane.showMessageDialog(this, 对不起,系统不充许恢复!, 警告,JOptionPane.INFORMATION_MESSAGE);5、重来(Restart)public void Restart() pal.list.clear();for (int i = 0; i 19; i+) for (int j = 0; j 19; j+) bflagij = 0;hflagij = 0;repaint();6、处理关于(handleAbout)public void handleAbout() JOptionPane.sh

18、owMessageDialog(this, ABOUT, About,JOptionPane.INFORMATION_MESSAGE);7、判断胜负(Shengfu)public void Shengfu() /*是否白棋有五粒连在一起*/int ba = 0;/*是否黑棋有五粒连在一起*/int he = 0;/ 横线上有五粒for (int i = 0; i 19; i+) for (int j = 0; j 15; j+) if (bflagij = 1 & bflagij + 1 = 1& bflagij + 2 = 1 & bflagij + 3 = 1& bflagij + 4 =

19、 1) ba = 1;if (hflagij = 1 & hflagij + 1 = 1& hflagij + 2 = 1 & hflagij + 3 = 1& hflagij + 4 = 1) he = 1;/ 竖线上有五粒斜、线上有五粒、反斜线上有五粒略,和第一种情况相似if (ba = 1) JOptionPane.showMessageDialog(this, 白棋胜利, 结果,JOptionPane.INFORMATION_MESSAGE);Restart();if (he = 1) JOptionPane.showMessageDialog(this, 黑棋胜利, 结果,JOpti

20、onPane.INFORMATION_MESSAGE);Restart();3.5 详细操作步骤(含部分源程序代码)1,产生棋子的类的主要属性(文件Qizi.java)public class Qizi private int x; /棋子在棋盘上的横坐标private int y; /棋子在棋盘上的纵坐标private int num;/ 这是玩家下的第几个棋子private int flagx; / 矩阵的行private int flagy; / 矩阵的列2,产生面板文件MyPanel.java的大概内容:public class MyPanel extends JPanel /*白子的

21、图片*/Image bai;/*黑子的图片*/Image hei;/*19*19的棋盘图片*/Image qipan;/*动态数组,保存棋子实例*/ArrayList list = new ArrayList();/*动态数组,暂存悔棋时从list移出的棋子实例*/ArrayList beiyong = new ArrayList();/*保存棋盘交叉点的横坐标*/double hen = new double1919;/*保存棋盘交叉点的纵坐标*/double shu = new double1919;/重写这个方法用来完成图形的重绘protected void paintComponent

22、(Graphics g) g.drawImage(qipan, 0, 0, this);if (list.size() != 0) for (int i = 0; i list.size(); i+) Qizi qizi = (Qizi) list.get(i);if (i % 2 = 0) g.drawImage(bai, qizi.getX() - 12, qizi.getY() - 12, this); else g.drawImage(hei, qizi.getX() - 12, qizi.getY() - 12, this);/方法画白棋子public void drawBai(in

23、t x, int y) this.getGraphics().drawImage(bai, x - 12, y - 12, this);/方法画白棋子public void drawHei(int x, int y) this.getGraphics().drawImage(hei, x - 12, y - 12, this);/初始化棋盘交叉点坐标public void startxy() for (int i = 0; i 19; i+) for (int j = 0; j 19; j+) henij = 18.0+j * 25.8;shuij = 18.0+i * 25.8;3、五子棋的

24、主要文件Wuziqi.java的大概内容:public class Wuziqi extends JFrame implements MouseListener final String ABOUT = 0709302班JAVA课程设计小组n本组成员:n组长:沈村敬n组员:刘新琳、雷艳飞、李云、黄生涯;JMenuBar mb;MyPanel pal;JMenu wenjian, bianji, help;JMenuItem read, save, exit, huiqi, huifu, restart, about;Process pro = new Process();JFileChoose

25、r filec = new JFileChooser();File file;/* 控制白棋和黑棋的交替*/int a;/*判断坐标上有没有白子*/int bflag = new int1919;/* 判断坐标上有没有黑子*/int hflag = new int1919;/*连续悔了几步棋*/int huiqiNum = 0;/*标题栏的图标*/Image top;class Process implements ActionListener / 处理菜单事件public void actionPerformed(ActionEvent e) 略,重复public void handleSa

26、ve() / 保存文件略,重复public void handleRead() / 读取文件略,重复public void handleHuiqi() / 处理悔棋略,重复public void handleHuifu() / 恢复悔棋略,重复public void handleAbout() /弹出消息,小组名称略public void Restart() / 重新开始略,重复public void init() / 初始化菜单略public void mouseClicked(MouseEvent e) / 处理鼠标点击事件略,重复public void Shengfu() / 判断胜负略

27、,重复;public Wuziqi() / 构造方法/*设置框架大小*/this.setSize(506, 556);/*设置标题*/this.setTitle(五子棋);/*设置标题图标*/this.setIconImage(top);init();/*获取容器*/Container co = getContentPane();co.add(pal);/*使框架居中*/Dimension c = Toolkit.getDefaultToolkit().getScreenSize();Dimension self = this.getSize();double x = c.getWidth()

28、 / 2 - self.getWidth() / 2;double y = c.getHeight() / 2 - self.getHeight() / 2;this.setLocation(int) x, (int) y);/*设置不能改变大小*/this.setResizable(false);/*增加鼠标事件侦听*/this.addMouseListener(this);/*初始化棋盘的坐标*/pal.startxy();/*关闭窗口*/this.addWindowListener(new WindowAdapter() public void windowClosing(WindowE

29、vent e) System.exit(0););/*增加菜单*/this.setJMenuBar(mb);/*显示所有*/this.setVisible(true);/ main()public static void main(String args) new Wuziqi();3.6 程序调试出错信息及解决方法制作过程中遇到的最主要的错误如下:(这两个错误都困扰了我们相当长一段时间,很有代表性)1,当在框架里绘图的时候,会重写paint()方法,但加了菜单后,菜单弹出再收缩后,界面不能及时刷新,会留下白色的一片。解决方法:写一个类继承JPanel类,重写paintComponent()方

30、法,用这个方法代替paint()方法,可解决这个问题。2,下面是文件读取的方法中一段代码:try FileInputStream fout = new FileInputStream(file);DataInputStream din = new DataInputStream(fout);for (int i = 0; i 关于弹出界面:5、当悔棋一直悔到棋盘上没有棋子了会弹出:6、当你恢复的步数超过你悔棋的步数或者悔棋后又下子了,点恢复后会弹出以下消息:7、胜利后会弹出消息:3.8 心得体会虽然只是一个看似很简单的小程序,但在开发的过程中遇到了各种各样的问题,但最后都被我们小组成员在一起商

31、量讨论,并上网和到图书馆去求助、查阅资料,向老师请教,终于一个一个的问题都被我们联手解决了,在这其中我们都学到了很多东西,从一开始看到出错就烦恼,变成了一看到错误就兴奋。因为只有通过不断去解决错误才能更好的提高我们自己的编程水平,通过这次的开发过程后,我们意识到要多做这种还算比较大型的系统(游戏)才能使自己的水平得到质的提高。同时,在发开过程中我们也意识到了我们的基础还不是很扎实,我们要走的路还很长,但我们坚信,我们一直在路上,我们会不断的超越自我,不断的挑战自我,总有一天,我们能在这个领域找到自己的一片天空。4. 本组成员及分工:组长:沈村敬(0709302-05)组员:刘新琳(070930

32、2-25)、雷艳飞(0709302-12)、李云(0709302-26)、黄生涯(0709302-01)分工:沈村敬:菜单保存进度和菜单读取进度事件的处理以及paintCompoent方法的重写刘新琳:鼠标事事件处理,游戏主界面的生成雷艳飞:菜单重来事件处理和窗口事件处理以及棋盘交叉点坐标的初始化李去:菜单悔棋事件处理和菜单恢复事件处理以及棋子类的编写黄生涯:方法胜负判断的编写,菜单(关于)事件的处理5.总结通过这次的开发,我们一起讨论,我们总结出有以下几点:1, 一定要养成良好的写代码的习惯,注意缩进和一些变量名要取的有意义,一看就知道这是大概是控制什么东西的。2, 代码要减少控制语句的嵌套,不要过长,过长多用函数来增加可读性。3, 养成写注释的习惯,这样你自己看的懂,别人也看得懂。4, 算法很重要,写代码之前先要弄清楚算法大概的流程。5, 多和别人交流,这样你的思想才不会局限。6, 多上网查资料,网络是把双刃剑,但用于这方面是不会有什么很大的坏处的。7, 多动手,多试验,在错误中成长。参考书目:(五号,宋体加粗)1 李尊朝,苏军,JAVA语言设计,中国铁道出版社,2007年12月

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!