《JAVA程序设计》课程设计五子棋小游戏.docx
- 文档编号:10839258
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:25
- 大小:192.21KB
《JAVA程序设计》课程设计五子棋小游戏.docx
《《JAVA程序设计》课程设计五子棋小游戏.docx》由会员分享,可在线阅读,更多相关《《JAVA程序设计》课程设计五子棋小游戏.docx(25页珍藏版)》请在冰豆网上搜索。
《JAVA程序设计》课程设计五子棋小游戏
《JAVA程序设计》课程设计-五子棋小游戏
《JAVA程序设计》
课程设计
题目:
五子棋小游戏
业:
信息与计算科学专
学号:
070930205等姓名:
指导教师:
成绩:
二00九年十二月九日
1.课程设计研究背景及意义
五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。
发展于日本,流行于欧美。
容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
然则看似很简单的一个小游戏,却对我们这组刚接触JAVA编程的成员来说却是一个不错的挑战,由于水平不限不能做成和电脑进行对战,也对于和其它电脑联机对战的模式不太清楚,故做成一个自己和自己对战的五子棋来考验我们的JAVA的技术。
2.课程设计题目描述和要求
题目:
五子棋小游戏
游戏主要界面如下:
游戏规则:
1,棋子分为黑白两色,采用19×19棋盘。
2,自己和自己对战,白子和黑子交替下,直到白子或黑子一方有五粒子连在一起,最先完成五粒子连在一起的一方为胜利的一方(可以是横、竖、斜、反斜)。
3,允许悔棋,且允许一直悔到棋盘上没有棋子了,悔棋后允许恢复。
当悔棋后下子了,则不允许再恢复了。
4,有棋子的地方不允许再下棋子了
5,落子后不能移动或拿掉。
7,胜利后,棋局重新开始。
主要功能:
1,鼠标点棋盘上的任意一点,棋子会落入离这点最近的一个交叉点处。
2,白子和黑子交替下。
3,当下到一半时,可以保存进度。
4,关闭再打开后,可以重新读取进度再接着下。
5,允许悔棋,且允许一直悔到棋盘上没有棋子了。
6,悔棋后允许恢复。
当悔棋后下子了,则不允许再恢复了。
7,下棋的过程中,随时可以重新开始。
8,有棋子的地方不允许再下子了。
9,当悔到没有棋子的时候会弹出消息。
10,任意一方胜利后会弹出消息
11,恢复的步数超过了悔棋的步数的时候会弹出消息
12,当任意一方胜利后,棋局重新开始。
13,设有菜单栏,玩家可以点菜单来完成某种操作。
14,当最小化后,能重新还原棋子(棋子不会消失)。
15,点菜单栏的“帮助”—>“关于„”会显示这个课程设计小组的成员。
3.课程设计报告内容
3.1题目求解的理论依据及算法
1,利用JAVA的Swing组件可以实现游戏主界面的设置和菜单的添加。
本次发开的小游戏界面比较简单,就一个面板外加一个菜单栏,在面板中绘图。
菜单条中有三项分别为:
文件(保存进度、读取进度、退出),编辑(悔棋、恢复、重来),帮助(关于„)。
2,利用JAVA的输入输出类库和文件操作来完成文件的读写来完成保存进度和读取进度的功能。
3,利用JAVA的事件处理来完成鼠标,菜单的事件处理。
4,利用JAVA的类来生成棋子
5,利用JAVA的类的继承和多态,自定义Mypanel来继承JPanel,在Mypanel中重写paintComponent()方法来实现画在面板中图形的重绘。
6,利用JAVA的绘图类Graphics在面板中绘制棋盘,当点鼠标的时候绘制棋子,以及完成重绘。
7,利用JAVA的动态数组ArrayList来存储棋子的坐标等等信息。
8,建立一个19*19的矩阵来存储棋盘上黑白棋子的信息,初始值全为0,例如:
当每12行7列下了一个黑子后,hflag[12][7]=1。
如果是白子则bflag[12][7]=1下一个棋子便对胜负进行一次判断,当hflag或bflag有五个1连在一起的时候则判hflag和bflag对应的一方胜利。
9,建立一个棋子的类,有属性:
X:
棋子在棋盘上的横坐标、Y:
棋子在棋盘上的纵坐标
num:
这是玩家下的第几个棋子
xflag:
矩阵的行、yflag:
矩阵的列
当下一个棋子后产生一个棋子实例,将棋子在棋盘的位置和这是下的第
几个子以及第几行和第几列分别赋值给x,y,num,xflag,yflag。
10,当num%2==0的时候画白子,当num%2==1的时候画黑子。
3.2主要事件处理:
1,鼠标事件处理(MouseListener):
publicvoidmouseClicked(MouseEvente){
intx=e.getX();/**棋子在棋盘上的横坐标*/
y=e.getY()/**棋子在棋盘上的纵坐标*/;int
intit=0,jt=0;/**矩阵的行和列*/
//绝对定位棋子即当点在交叉点附近,棋子会落在交叉点
if(y>53){//下子不会落到菜单栏上,菜单和标题共高53个像素
(inti=0;i<19;i++){for
for(intj=0;j<19;j++){
if(pal.hen[i][j]-13<=x&&(pal.hen[i][j]
+13)>=x&&(y-53>=pal.shu[i][j]-13)&&(y-53<=
pal.shu[i][j]+13)){
x=(int)pal.hen[i][j];
y=(int)pal.shu[i][j];
it=i;jt=j;
}
}
}
//当绝对定位交叉处没有棋子时画棋子
if(bflag[it][jt]==0&&hflag[it][jt]==0){
if(a%2==0){
pal.drawBai(x,y);
bflag[it][jt]=1;//下了一子后这点便不能下子了
}
if(a%2==1){
pal.drawHei(x,y);
hflag[it][jt]=1;//下了一子后这点便不能下子了
}
Qiziqi=newQizi(x,y);//将信息保存在棋子属性中
qi.setFlagx(it);qi.setFlagy(jt);
qi.setX(x);qi.setY(y);qi.setNum(a);
pal.list.add(qi);//把棋子实例保存到动态数组中
huiqiNum=0;//下子后,便不能悔棋了,悔棋步数重置为0
a++;
}
Shengfu();//每下一子对胜负情况进行判断
}
2、动作事件处理(点菜单的时候)(ActionListener):
publicvoidactionPerformed(ActionEvente){
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.getActionCommand().equals("重来")){
Restart();
}
if(e.getActionCommand().equals("关于...")){
handleAbout();
}
3、窗口事件处理(WindowAdapter):
publicvoidwindowClosing(WindowEvente){
System.exit(0);
}
3.3简要的操作流程(要求画流程图)
界面大体构造
保存进度handleSave窗口事件处理(关闭)
文件读取进度handleRead
退出Exit(0)
悔棋handleHuiqi
窗口菜单编辑恢复handleHuifu
重来Restart
鼠标事件处理(下子)帮助关于„handAbout
简要的设计流程:
创建窗口
初始化菜单、面板
对各个菜单项添加
事件监听以及鼠标
事件监听
窗口事件处理动作事件处理鼠标事件处理
完成java源代码编写
调试修改程序,完善功能
3.4事件处理的几个重要方法:
1、保存进度(handleSave)
publicvoidhandleSave(){
inttemp=filec.showSaveDialog(this);
if(temp==JFileChooser.APPROVE_OPTION){
Stringpath=filec.getSelectedFile().getAbsolutePath();
file=newFile(path);
try{
file.createNewFile();
FileOutputStreamfout=newFileOutputStream(file);
DataOutputStreamdout=newDataOutputStream(fout);
for(inti=0;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.get(i).getX()); dout.writeInt(pal.list.get(i).getY()); } fout.close(); }catch(FileNotFoundExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); } } 2、读取进度(handleRead) publicvoidhandleRead(){ inttemp=filec.showOpenDialog(this); if(temp==JFileChooser.APPROVE_OPTION){ Restart();//读取进程前必须清空所有变量 Stringpath= filec.getSelectedFile().getAbsolutePath(); file=newFile(path); try{ FileInputStreamfout=newFileInputStream(file); DataInputStreamdin=newDataInputStream(fout); //readInt以4个字节表示一个Int,故要除4,一个循环读了5次,故要除20 for(inti=0;i Qizite=newQizi(); te.setFlagx(din.readInt()); te.setFlagy(din.readInt()); te.setNum(din.readInt()); te.setX(din.readInt()); te.setY(din.readInt()); a=te.getNum(); if(a%2==0){ bflag[te.getFlagx()][te.getFlagy()]=1; } if(a%2==1){ hflag[te.getFlagx()][te.getFlagy()]=1; } pal.list.add(te); } din.close(); }catch(FileNotFoundExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); } a++; } repaint(); } 3、处理悔棋(handleHuiqi) publicvoidhandleHuiqi(){ if(pal.list.size()>0){ Qizitemp=pal.list.get(pal.list.size()-1); pal.beiyong.add(temp); inttempx=temp.getFlagx(); inttempy=temp.getFlagy(); if(a%2==1){ bflag[tempx][tempy]=0; } if(a%2==0){ hflag[tempx][tempy]=0; } pal.list.remove(pal.list.size()-1); a--; huiqiNum++; repaint(); }else{ JOptionPane.showMessageDialog(this,"已经没棋子了~","警告", JOptionPane.INFORMATION_MESSAGE); } } 4、处理恢复(handleHuifu) publicvoidhandleHuifu(){ if(huiqiNum>0){ Qizitemp=pal.beiyong.get(pal.beiyong.size()-1); pal.list.add(temp); inttempx=temp.getFlagx(); tempy=temp.getFlagy();int if(a%2==1){ [tempx][tempy]=1;bflag } if(a%2==0){ hflag[tempx][tempy]=1; } pal.beiyong.remove(pal.beiyong.size()-1); a++; huiqiNum--; repaint(); }else{ JOptionPane.showMessageDialog(this,"对不起,系统不充许恢复~","警告",JOptionPane.INFORMATION_MESSAGE); } } 5、重来(Restart) publicvoidRestart(){ pal.list.clear(); for(inti=0;i<19;i++){ for(intj=0;j<19;j++){ bflag[i][j]=0; hflag[i][j]=0; } } repaint(); } 6、处理关于„(handleAbout) voidhandleAbout(){public JOptionPane.showMessageDialog(this,ABOUT,"About", JOptionPane.INFORMATION_MESSAGE); } 7、判断胜负(Shengfu) publicvoidShengfu(){ /**是否白棋有五粒连在一起*/ intba=0; /**是否黑棋有五粒连在一起*/ inthe=0; //横线上有五粒 for(inti=0;i<19;i++){ for(intj=0;j<15;j++){ if(bflag[i][j]==1&&bflag[i][j+1]==1&& bflag[i][j+2]==1&&bflag[i][j+3]==1&&bflag[i][j+4]==1){ ba=1; } if(hflag[i][j]==1&&hflag[i][j+1]==1&& hflag[i][j+2]==1&&hflag[i][j+3]==1&&hflag[i][j+4]==1){ he=1; } } } //竖线上有五粒斜、线上有五粒、反斜线上有五粒略,和第一种情况相似 if(ba==1){ JOptionPane.showMessageDialog(this,"白棋胜利","结果",JOptionPane.INFORMATION_MESSAGE); Restart(); } if(he==1){ JOptionPane.showMessageDialog(this,"黑棋胜利","结 果",JOptionPane.INFORMATION_MESSAGE); Restart(); } 详细操作步骤(含部分源程序代码)3.5 1,产生棋子的类的主要属性(文件Qizi.java)publicclassQizi{ privateintx;//棋子在棋盘上的横坐标 privateinty;//棋子在棋盘上的纵坐标 privateintnum;//这是玩家下的第几个棋子 privateintflagx;//矩阵的行 privateintflagy;//矩阵的列 } 2,产生面板文件MyPanel.java的大概内容: publicclassMyPanelextendsJPanel{ /**白子的图片*/ Imagebai; /**黑子的图片*/ Imagehei; /**19*19的棋盘图片*/ Imageqipan; /**动态数组,保存棋子实例*/ ArrayList /**动态数组,暂存悔棋时从list移出的棋子实例*/ ArrayList /**保存棋盘交叉点的横坐标*/ doublehen[][]=newdouble[19][19]; /**保存棋盘交叉点的纵坐标*/ doubleshu[][]=newdouble[19][19]; //重写这个方法用来完成图形的重绘 protectedvoidpaintComponent(Graphicsg){ );g.drawImage(qipan,0,0,this if(list.size()! =0){ for(inti=0;i Qiziqizi=(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); } } } } //方法—画白棋子 publicvoiddrawBai(intx,inty){ this.getGraphics().drawImage(bai,x-12,y-12,this); } //方法—画白棋子 publicvoiddrawHei(intx,inty){ this.getGraphics().drawImage(hei,x-12,y-12,this); } //初始化棋盘交叉点坐标 publicvoidstartxy(){ for(inti=0;i<19;i++){ for(intj=0;j<19;j++){ hen[i][j]=18.0+j*25.8; shu[i][j]=18.0+i*25.8; } } } 3、五子棋的主要文件Wuziqi.java的大概内容: publicclassWuziqiextendsJFrameimplementsMouseListener { finalStringABOUT="0709302班JAVA课程设计小组\n本组成员: \n组长: 沈村敬\n组员: 刘新琳、雷艳飞、李云、黄生涯"; ;JMenuBarmb MyPanelpal; JMenuwenjian,bianji,help; JMenuItemread,save,exit,huiqi,huifu,restart,about; Processpro=newProcess(); JFileChooserfilec=newJFileChooser(); Filefile; /**控制白棋和黑棋的交替*/ inta; /**判断坐标上有没有白子*/ intbflag[][]=newint[19][19]; /**判断坐标上有没有黑子*/ inthflag[][]=newint[19][19]; /**连续悔了几步棋*/ inthuiqiNum=0; /**标题栏的图标*/ Imagetop; classProcessimplementsActionListener{//处理菜单事件 publicvoidactionPerformed(ActionEvente){ 略,重复 } publicvoidhandleSave(){//保存文件 略,重复 } publicvoidhandleRead(){//读取文件 略,重复 } publicvoidhandleHuiqi(){//处理悔棋 略,重复 } publicvoidhandleHuifu(){//恢复悔棋 略,重复 } publicvoidhandleAbout(){//弹出消息,小组名称 略 } publicvoidRestart(){//重新开始 略,重复 } publicvoidinit(){//初始化菜单 略 } publicvoidmouseClicked(MouseEv
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA程序设计 JAVA 程序设计 课程设计 五子棋 小游戏
![提示](https://static.bdocx.com/images/bang_tan.gif)