java五子棋.docx
《java五子棋.docx》由会员分享,可在线阅读,更多相关《java五子棋.docx(23页珍藏版)》请在冰点文库上搜索。
java五子棋
《Java语言程序设计》
实训报告
实训题目:
java五子棋小游戏
专业:
计算机网络
班级:
08计算机网络
(2)班
姓名:
XXX
指导教师:
XXX
二00九年11月27日
目录
1.实训目的3
2.实训题目描述和要求3
2.1实训题目描述3
2.2实训要求3
3.实训报告内容5
3.1主框架5
3.2画背景及棋盘、棋子及说明信息等8
3.3实现鼠标侦听及各按钮功能10
3.4判断五连及时间走动17
4.总结21
4.1结论21
4.2心得21
参考书目:
22
实训指导教师评语23
1.实训目的
《Java程序设计》课程实训是学习Java程序开发不可缺少的实践环节。
它可以将理论应用于实践,将所学知识与实际相结合,加深对所学知识的理解和应用。
学完此门课程后,能使用Java开发小型应用程序。
2.实训题目描述和要求
2.1实训题目描述
实训题目:
java五子棋游戏
描述:
通过java的swing组件,实现五子棋简单的双人对战,并通过内部条件判断实现输赢的判断及双方的下棋时间的控制。
2.2实训要求
进程安排:
(1):
游戏界面的实现
(2):
棋盘的绘制及黑白棋子的判定
(3):
完成判断某一横行是否连成五子及所有方向是否连成五子的功能
(4):
防止刷屏及几个简单按钮功能的实现
(5):
完成最后“游戏设置”按钮的实现
游戏功能:
(1)游戏界面:
(2):
判断输赢:
(3):
游戏超时:
3.实训报告内容
3.1主框架
packagechengxu.zhu.chengxuti;
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.Image;
importjava.awt.Toolkit;
importjava.awt.event.MouseEvent;
importjava.awt.event.MouseListener;
importjava.awt.image.BufferedImage;
importjava.io.File.*;
importjava.io.File;
importjava.io.IOException;
importjavax.imageio.ImageIO;
importjavax.swing.JFrame;
importjavax.swing.JOptionPane;
publicclassFiveChessextendsJFrameimplementsMouseListener,Runnable{
//获取电脑屏幕的宽度与高度
intweight=Toolkit.getDefaultToolkit().getScreenSize().width;
intheight=Toolkit.getDefaultToolkit().getScreenSize().height;
//BufferedImageimg=null;
//定义一个Image类型的变量
Imageimage;
//获取鼠标的位置
intx,x1=490;
inty,y1=435;
//用来保存棋子
intqizhi[][]=newint[20][20];
//用来判断所下棋子颜色
booleanheibai=true;
//用来判断游戏是否结束(即:
是否五子相连)
booleanyouxikaishi=false;
//intjiaodian[][]=newint[18][18];
//保存最多拥有多少时间(秒)
intmaxTime=0;
//做倒计时的线程类
Threadt=newThread(this);
//保存黑方与白方的剩余时间
intblackTime=0;
intwhiteTime=0;
//保存双方剩余时间的显示信息
StringblackMessage="无限制";
StringwhiteMessage="无限制";
publicFiveChess(){
//隐藏标题栏
this.setUndecorated(true);
//给窗体命名
this.setTitle("实训作业------>>五子棋");
//设置窗体大小
this.setSize(700,500);
//this.setLocation((weight-500)/2,(height-500)/2);
//窗体始终在最前端(始终d置顶)
this.setAlwaysOnTop(true);
//设置初始位置
this.setLocation((weight-700)/2,(height-500)/2);
//禁止改变窗体大小
this.setResizable(false);
//设置关闭为完全关闭
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//重画背景
this.repaint();
//添加鼠标侦听事件
this.addMouseListener(this);
t.start();
t.suspend();
//通过前面定义的Image类型变量获取图像
image=this.getToolkit().getImage("../image/aa.jpg");
//设置窗口为可见
this.setVisible(true);
/*try{
img=ImageIO.read(newFile("chessbackground.jpg"));
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}*/
}
publicstaticvoidmain(String[]arges){
//主程序开始
newFiveChess();
}
}
3.2画背景及棋盘、棋子及说明信息等
publicvoidpaint(Graphicsg){
//防止闪屏
BufferedImagebi=newBufferedImage(700,500,BufferedImage.TYPE_INT_RGB);
//画出读入的图像
g.drawImage(image,0,0,this);
//输出时间信息
g.setColor(Color.WHITE);
g.setFont(newFont("宋体",0,14));
g.drawString("黑方时间:
"+blackMessage,490,460);
g.drawString("白方时间:
"+whiteMessage,490,480);
//画棋盘
for(inti=0;i<18;i++){
g.setColor(Color.BLUE);
g.drawLine(75+i*22,60,75+i*22,434);
g.drawLine(75,60+i*22,449,60+i*22);
}
//画棋盘的9个黑点
g.fillOval(138,123,6,6);
g.fillOval(248,123,6,6);
g.fillOval(358,123,6,6);
g.fillOval(138,233,6,6);
g.fillOval(248,233,6,6);
g.fillOval(358,233,6,6);
g.fillOval(138,343,6,6);
g.fillOval(248,343,6,6);
g.fillOval(358,343,6,6);
g.setColor(Color.RED);
g.setFont(newFont("宋体",10,30));
g.drawString("★",x1,y1);
for(inti=0;i<18;i++){
for(intj=0;j<18;j++){
if(qizhi[i][j]==1){
g.setColor(Color.BLACK);
inttempX=i*22+60;
inttempY=j*22+60;
g.fillOval(tempX+7,tempY-7,14,14);
}
if(qizhi[i][j]==2){
inttempX=i*22+60;
inttempY=j*22+60;
g.setColor(Color.WHITE);
g.fillOval(tempX+7,tempY-7,14,14);
g.setColor(Color.BLACK);
g.drawOval(tempX+7,tempY-7,14,14);
}
}
}
}
3.3实现鼠标侦听及各按钮功能
publicvoidmouseClicked(MouseEvente){
//游戏设置
if(e.getX()>=546&&e.getX()<=695&&e.getY()>=192&&e.getY()<=236){
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++){
qizhi[i][j]=0;
}
}
//另一种方式allChess=newint[19][19];
//message="黑方先行";
heibai=true;
blackTime=maxTime;
whiteTime=maxTime;
blackMessage="无限制";
whiteMessage="无限制";
this.youxikaishi=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++){
qizhi[i][j]=0;
x1=490;
y1=435;
}
}
//另一种方式allChess=newint[19][19];
//message="黑方先行";
heibai=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.youxikaishi=true;
this.repaint();
}else{
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();
}
}
}catch(NumberFormatExceptione1){
//TODOAuto-generatedcatchblock
JOptionPane.showMessageDialog(this,"请正确输入信息!
");
}
}
//关于
if(e.getX()>=600&&e.getX()<=678&&e.getY()>=74
&&e.getY()<=115){
JOptionPane.showMessageDialog(this,"制作人:
\nQQ:
841043598\n游戏名:
java五子棋");
}
//说明
if(e.getX()>=543&&e.getX()<=692&&e.getY()>=251
&&e.getY()<=291){
JOptionPane.showMessageDialog(this,"五子棋,每人下一次,分别为白子与黑子,\n若谁最先五子相连,谁获胜^_^");
}
//退出
if(e.getX()>=606&&e.getX()<=682&&e.getY()>=370
&&e.getY()<=412){
inttuichu=JOptionPane.showConfirmDialog(this,"游戏结束");
if(tuichu==0){
System.exit(0);
}
}
//开始游戏
if(e.getX()>=544&&e.getX()<=697&&e.getY()>=141
&&e.getY()<=177){
intresult=JOptionPane.showConfirmDialog(this,"是否开始游戏?
");
if(result==0){
//现在重新开始游戏
//重新开始所要做的操作:
1)把棋盘清空,allChess这个数组中全部数据归0.
//2)将游戏信息:
的显示改回到开始位置
//3)将下一步下棋的改为黑方
for(inti=0;i<18;i++){
for(intj=0;j<18;j++){
qizhi[i][j]=0;
}
}
//另一种方式allChess=newint[19][19];
heibai=true;
x1=490;
y1=435;
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.youxikaishi=true;
this.repaint();
}
}
if(e.getX()>=605&&e.getX()<=685&&e.getY()>=313
&&e.getY()<=350){
intresult=JOptionPane.showConfirmDialog(this,"是否确认认输?
");
if(result==0){
if(heibai){
JOptionPane.showMessageDialog(this,"黑方已经认输,游戏结束!
");
}else{
JOptionPane.showMessageDialog(this,"白方已经认输,游戏结束!
");
}
youxikaishi=false;
}
}
}
@Override
publicvoidmouseEntered(MouseEvente){
//TODOAuto-generatedmethodstub
}
@Override
publicvoidmouseExited(MouseEvente){
//TODOAuto-generatedmethodstub
}
@Override
publicvoidmousePressed(MouseEvente){
//TODOAuto-generatedmethodstub
//如果开始为真则开始游戏,反之结束游戏
if(youxikaishi==true){
//获取鼠标位置
x=e.getX();
y=e.getY();
//如果鼠标点击在棋盘范围内则执行下面条件
if(x>70&&x<455&&y>55&&y<440){
//得到棋盘各个相交点的位置
x=(x-75)/22;;
y=(y-60)/22;
//判断该点是否有落子
if(qizhi[x][y]==0){
//判断下黑棋还是白棋
if(heibai==true){
qizhi[x][y]=1;
heibai=false;
x1=490;
y1=435;
//this.setFont(newFont("宋体",Font.BOLD,0));
this.repaint();
}
else{
qizhi[x][y]=2;
heibai=true;
x1=490;
y1=135;
this.repaint();
}
}
else{
JOptionPane.showMessageDialog(this,"当前位置已经有棋子,您不能落子到此处,请重新落子!
");
}
//判断是否五连(即:
是否游戏结束)
booleanwulian=this.wulianzhi();
if(wulian==true){
JOptionPane.showMessageDialog(this,"游戏结束,"+(qizhi[x][y]==1?
"黑方":
"白方")+"获胜!
");
youxikaishi=false;
}
}
}else{
x=e.getX();
y=e.getY();
if(x>70&&x<455&&y>55&&y<440){
JOptionPane.showMessageDialog(this,"请开始游戏");
}
}
}
publicvoidmouseReleased(MouseEvente){
//TODOAuto-generatedmethodstub
}
3.4判断五连及时间走动
publicbooleanwulianzhi(){
booleanwulianzhi=false;
intxianglianshu=1;
intyanse=qizhi[x][y];
xianglianshu=this.checkCount(1,0,yanse);
if(xianglianshu>=