




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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()方法,用这个方法代替paint()方法,可解决这个问题。2,下面是文件读取的方法中一段代码:try fileinputstream fout = new fileinputstream(file);datainputstream din =
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 调研地理考试题及答案
- 人力资源管理系统操作手册
- 地震操场考试题及答案
- 企业团队建设与协作方案集
- 地理简单考试题及答案
- 《中西古典文学比较:大学文学概论教学教案》
- 大坝管理考试题及答案
- 心中的英雄:写关于英雄的作文4篇范文
- 销售预算编制与执行分析工具助力业务决策
- 销售业绩目标分解与考核指标模板
- 2025年新能源电动摆渡车景区运营绿色出行解决方案报告
- 安全素养提升培训考试题及答案解析
- 动量守恒定律模型归纳(11大题型)(解析版)-2025学年新高二物理暑假专项提升(人教版)
- 2025股权转让合同签订股权认购协议书
- 某小区改造配电室(电力)工程监理大纲
- Z20+名校联盟(浙江省名校新高考研究联盟)2026届高三第一次联考化学及答案
- DB65-T 4803-2024 冰川厚度测量技术规范
- 护理专业新进展介绍
- 2025年保监会保险机构高级管理人员任职资格考试题库附答案
- 2025年湖北省武汉市《公共基础知识》事业单位招聘考试国考真题(附答案)
- 企业PaaS云平台应用交付方案
评论
0/150
提交评论