Java五子棋游戏设计报告.docx
- 文档编号:26783557
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:17
- 大小:144.99KB
Java五子棋游戏设计报告.docx
《Java五子棋游戏设计报告.docx》由会员分享,可在线阅读,更多相关《Java五子棋游戏设计报告.docx(17页珍藏版)》请在冰豆网上搜索。
Java五子棋游戏设计报告
Java五子棋游戏设计报告
1、题目描述
本系统实现五子棋游戏的基本功能及时间限制等附加功能,并进行了游戏界面的开发。
五子棋游戏的功能:
1.在单击鼠标时,在相应的位置显示棋子。
2.当白棋或黑棋连到5个时,自动判断游戏结束,白方或黑方胜利。
3.可以对游戏时间进行设置,判断是否超出规定时间。
开发步骤:
1.新建项目。
2.新建一个类FiveChessFrame,大部分程序代码都在这个类中完成。
3.测试代码。
4.运行程序。
2、总体设计思路
3、详细设计
游戏界面开发:
首先开发出游戏界面。
计算棋盘中每一条线的间距:
19*19的棋盘。
总宽度360像素,分为18份,每份为20像素。
总高度与宽度相同。
在编写代码时,需用到图形的绘制类Graphics。
绘制棋子:
在棋盘的鼠标单击位置显示一个棋子。
需要在publicvoidmousePressed(MouseEvente)事件中书写代码。
mousePressed代表鼠标按下操作,当鼠标被按下时将绘制一个棋子。
其中,黑子用一个实心的黑圆来表示,白子用一个空心的黑圆加一个实心的白圆来表示。
保存棋局:
保存之前下过的棋子。
棋子都有x,y坐标,所以可以通过一个二维的数组来保存之前下过的所有棋子。
数据原型为int[][]allChess=newint[19][19]。
19代表棋盘的的大小,数组中各个元素的值,0表示这个点没有棋子,1表示这个点是黑子,2表示这个点是白子。
判断游戏胜负:
根据五子棋的游戏规则,判断是否有同一颜色的棋子连成5个,是五子棋游戏的核心。
使用的算法为直接判断最后下的棋子是否能和本方的棋子连成5个。
通过循环来做棋子各个方向相连的判断。
处理屏幕闪烁的问题:
程序代码基本完成,但在运行程序的时候,发现屏幕总是会闪烁,这样是不可以的。
通过查阅资料,发现应该运用双缓冲技术。
运用Java中已经做好的一个类,BufferImage。
实现各个功能按钮:
开始游戏:
重新开始新的游戏。
游戏设置:
设置倒计时。
游戏说明:
用来说明游戏规则和操作。
认输:
表示某一方放弃游戏,认输。
关于:
联系方式。
退出:
结束程序。
4、具体实现
导入部分:
packageorg.liky.game.frame;
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.Toolkit;
importjava.awt.event.MouseEvent;
importjava.awt.event.MouseListener;
importjava.awt.image.BufferedImage;
importjava.io.File;
importjava.io.IOException;
importjavax.imageio.ImageIO;
importjavax.swing.JFrame;
importjavax.swing.JOptionPane;
publicclassFiveChessFrameextendsJFrameimplementsMouseListener,Runnable{
属性设置:
intwidth=Toolkit.getDefaultToolkit().getScreenSize().width;
intheight=Toolkit.getDefaultToolkit().getScreenSize().height;
BufferedImagebgImage=null;
intx=0;
inty=0;
int[][]allChess=newint[19][19];
booleanisBlack=true;
booleancanPlay=true;
Stringmessage="黑方先行";
intmaxTime=0;
Threadt=newThread(this);
intblackTime=0;
intwhiteTime=0;
StringblackMessage="无限制";
StringwhiteMessage="无限制";
主类的构造函数:
publicFiveChessFrame(){
this.setTitle("五子棋");
this.setSize(500,500);
this.setLocation((width-500)/2,(height-500)/2);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.addMouseListener(this);
this.setVisible(true);
t.start();
t.suspend();
StringimagePath="";
try{
imagePath=System.getProperty("user.dir")+"/bin/image/background.jpg";
bgImage=ImageIO.read(newFile(imagePath.replaceAll("\\\\","/")));
}catch(IOExceptione){
e.printStackTrace();
}
this.repaint();
}
Paint方法:
publicvoidpaint(Graphicsg){
BufferedImagebi=newBufferedImage(500,500,
BufferedImage.TYPE_INT_RGB);
Graphicsg2=bi.createGraphics();
g2.setColor(Color.BLACK);
g2.drawImage(bgImage,1,20,this);
g2.setFont(newFont("黑体",Font.BOLD,20));
g2.drawString("游戏信息:
"+message,130,60);
g2.setFont(newFont("宋体",0,14));
g2.drawString("黑方时间:
"+blackMessage,30,470);
g2.drawString("白方时间:
"+whiteMessage,260,470);
for(inti=0;i<19;i++){
g2.drawLine(10,70+20*i,370,70+20*i);
g2.drawLine(10+20*i,70,10+20*i,430);
}
g2.fillOval(68,128,4,4);
g2.fillOval(308,128,4,4);
g2.fillOval(308,368,4,4);
g2.fillOval(68,368,4,4);
g2.fillOval(308,248,4,4);
g2.fillOval(188,128,4,4);
g2.fillOval(68,248,4,4);
g2.fillOval(188,368,4,4);
g2.fillOval(188,248,4,4);
for(inti=0;i<19;i++){
for(intj=0;j<19;j++){
if(allChess[i][j]==1){
inttempX=i*20+10;
inttempY=j*20+70;
g2.fillOval(tempX-7,tempY-7,14,14);
}
if(allChess[i][j]==2){
inttempX=i*20+10;
inttempY=j*20+70;
g2.setColor(Color.WHITE);
g2.fillOval(tempX-7,tempY-7,14,14);
g2.setColor(Color.BLACK);
g2.drawOval(tempX-7,tempY-7,14,14);
}
}
}
g.drawImage(bi,0,0,this);
}
监控鼠标:
publicvoidmouseClicked(MouseEvente){
}
publicvoidmouseEntered(MouseEvente){
}
publicvoidmouseExited(MouseEvente){
}
publicvoidmousePressed(MouseEvente){
if(canPlay==true){
x=e.getX();
y=e.getY();
if(x>=10&&x<=370&&y>=70&&y<=430){
x=(x-10)/20;
y=(y-70)/20;
if(allChess[x][y]==0){
if(isBlack==true){
allChess[x][y]=1;
isBlack=false;
message="轮到白方";
}else{
allChess[x][y]=2;
isBlack=true;
message="轮到黑方";
}
booleanwinFlag=this.checkWin();
if(winFlag==true){
JOptionPane.showMessageDialog(this,"游戏结束,"
+(allChess[x][y]==1?
"黑方":
"白方")+"获胜!
");
canPlay=false;
}
}else{
JOptionPane.showMessageDialog(this,"当前位置已经有棋子,请重新落子!
");
}
this.repaint();
}
}
if(e.getX()>=400&&e.getX()<=470&&e.getY()>=70
&&e.getY()<=100){
intresult=JOptionPane.showConfirmDialog(this,"是否重新开始游戏?
");
if(result==0){
for(inti=0;i<19;i++){
for(intj=0;j<19;j++){
allChess[i][j]=0;
}
}
message="黑方先行";
isBlack=true;
blackTime=maxTime;
whiteTime=maxTime;
if(maxTime>0){
blackMessage=maxTime/3600+":
"
+(maxTime/60-maxTime/3600*60)+":
"
+(maxTime-maxTime/60*60);
whiteMessage=maxTime/3600+":
"
+(maxTime/60-maxTime/3600*60)+":
"
+(maxTime-maxTime/60*60);
t.resume();
}else{
blackMessage="无限制";
whiteMessage="无限制";
}
this.canPlay=true;
this.repaint();
}
}
if(e.getX()>=400&&e.getX()<=470&&e.getY()>=120
&&e.getY()<=150){
Stringinput=JOptionPane
.showInputDialog("请输入游戏的最大时间(单位:
分钟),如果输入0,表示没有时间限制:
");
try{
maxTime=Integer.parseInt(input)*60;
if(maxTime<0){
JOptionPane.showMessageDialog(this,"请输入正确信息,不允许输入负数!
");
}
if(maxTime==0){
intresult=JOptionPane.showConfirmDialog(this,
"设置完成,是否重新开始游戏?
");
if(result==0){
for(inti=0;i<19;i++){
for(intj=0;j<19;j++){
allChess[i][j]=0;
}
}
message="黑方先行";
isBlack=true;
blackTime=maxTime;
whiteTime=maxTime;
blackMessage="无限制";
whiteMessage="无限制";
this.canPlay=true;
this.repaint();
}
}
if(maxTime>0){
intresult=JOptionPane.showConfirmDialog(this,
"设置完成,是否重新开始游戏?
");
if(result==0){
for(inti=0;i<19;i++){
for(intj=0;j<19;j++){
allChess[i][j]=0;
}
}
message="黑方先行";
isBlack=true;
blackTime=maxTime;
whiteTime=maxTime;
blackMessage=maxTime/3600+":
"
+(maxTime/60-maxTime/3600*60)+":
"
+(maxTime-maxTime/60*60);
whiteMessage=maxTime/3600+":
"
+(maxTime/60-maxTime/3600*60)+":
"
+(maxTime-maxTime/60*60);
t.resume();
this.canPlay=true;
this.repaint();
}
}
}catch(NumberFormatExceptione1){
JOptionPane.showMessageDialog(this,"请正确输入信息!
");
}
}
if(e.getX()>=400&&e.getX()<=470&&e.getY()>=170
&&e.getY()<=200){
JOptionPane.showMessageDialog(this,
"这个一个五子棋游戏程序,黑白双方轮流下棋,当某一方连到五子时,游戏结束。
");
}
if(e.getX()>=400&&e.getX()<=470&&e.getY()>=270
&&e.getY()<=300){
intresult=JOptionPane.showConfirmDialog(this,"是否确认认输?
");
if(result==0){
if(isBlack){
JOptionPane.showMessageDialog(this,"黑方已经认输,游戏结束!
");
}else{
JOptionPane.showMessageDialog(this,"白方已经认输,游戏结束!
");
}
canPlay=false;
}
}
if(e.getX()>=400&&e.getX()<=470&&e.getY()>=320
&&e.getY()<=350){
JOptionPane.showMessageDialog(this,
"E-mail:
smilekylinchen@");
}
if(e.getX()>=400&&e.getX()<=470&&e.getY()>=370
&&e.getY()<=400){
JOptionPane.showMessageDialog(this,"游戏结束");
System.exit(0);
}
}
publicvoidmouseReleased(MouseEvente){
}
判断胜负:
privatebooleancheckWin(){
booleanflag=false;
intcount=1;
intcolor=allChess[x][y];
count=this.checkCount(1,0,color);
if(count>=5){
flag=true;
}else{
count=this.checkCount(0,1,color);
if(count>=5){
flag=true;
}else{
count=this.checkCount(1,-1,color);
if(count>=5){
flag=true;
}else{
count=this.checkCount(1,1,color);
if(count>=5){
flag=true;
}
}
}
}
returnflag;
}
判断有几个棋子已经连接起来:
privateintcheckCount(intxChange,intyChange,intcolor){
intcount=1;
inttempX=xChange;
inttempY=yChange;
while(x+xChange>=0&&x+xChange<=18&&y+yChange>=0
&&y+yChange<=18
&&color==allChess[x+xChange][y+yChange]){
count++;
if(xChange!
=0)
xChange++;
if(yChange!
=0){
if(yChange>0)
yChange++;
else{
yChange--;
}
}
}
xChange=tempX;
yChange=tempY;
while(x-xChange>=0&&x-xChange<=18&&y-yChange>=0
&&y-yChange<=18
&&color==allChess[x-xChange][y-yChange]){
count++;
if(xChange!
=0)
xChange++;
if(yChange!
=0){
if(yChange>0)
yChange++;
else{
yChange--;
}
}
}
returncount;
}
publicvoidrun(){
if(maxTime>0){
while(true){
if(isBlack){
blackTime--;
if(blackTime==0){
JOptionPane.showMessageDialog(this,"黑方超时,游戏结束!
");
}
}else{
whiteTime--;
if(whiteTime==0){
JOptionPane.showMessageDialog(this,"白方超时,游戏结束!
");
}
}
blackMessage=blackTime/3600+":
"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 五子棋 游戏 设计 报告