java五子棋游戏源代码汇总.docx
《java五子棋游戏源代码汇总.docx》由会员分享,可在线阅读,更多相关《java五子棋游戏源代码汇总.docx(21页珍藏版)》请在冰豆网上搜索。
java五子棋游戏源代码汇总
packagegame.frame;
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.HeadlessException;
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;
//保存之前下過的全部棋子的座標
//其中數據內容0表示這個點並沒有棋子,1表示這個點是黑子,2表示這個點是
白點
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.setVisible(true);
//将窗体加入监听器
this.addMouseListener(this);
t.start();
t.suspend();
//刷新屏幕,防止游戏打开时无法显示。
this.repaint();
try{
bgimage=ImageIO.read(newFile("F:
/background.jpg"));
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
publicvoidpaint(Graphicsg){
//双缓冲技术防止画面闪烁
BufferedImagebi=newBufferedImage(500,500,BufferedImage.TYPE_INT_ARGB);
Graphicsg2=bi.createGraphics();
g2.drawImage(bgimage,3,22,this);
g2.setFont(newFont("宋体",Font.BOLD,20));
g2.setColor(Color.black);
g2.drawString("游戏信息:
"+message,120,60);
g2.setFont(newFont("华文行楷",0,18));
//设置时间界面
g2.drawString("黑方时间:
"+blackMessage,28,470);
g2.drawString("白方时间:
"+whiteMessage,250,470);
for(inti=0;i<19;i++){
//画棋盘线
g2.drawLine(13,72+20*i,373,72+20*i);
g2.drawLine(13+20*i,72,13+20*i,432);
}
//标注点位
g2.fillOval(71,130,4,4);
g2.fillOval(71,370,4,4);
g2.fillOval(311,130,4,4);
g2.fillOval(311,370,4,4);
g2.fillOval(191,250,5,5);
g2.fillOval(71,250,4,4);
g2.fillOval(311,250,4,4);
g2.fillOval(191,130,4,4);
g2.fillOval(191,370,4,4);
//繪製棋子
/*
*x=(x-13)/20*20+10;y=(y-72)/20*20+70;g.fillOval(x-4,y-4,10,10);
*/
//繪製全部棋子
for(inti=0;i<19;i++){
for(intj=0;j<19;j++){
if(allChess[i][j]==1){
//黑子
inttempX=i*20+13;
inttempY=j*20+73;
g2.fillOval(tempX-7,tempY-7,14,14);
}
if(allChess[i][j]==2){
//繪製白子
inttempX=i*20+13;
inttempY=j*20+73;
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);
}
@Override
publicvoidmouseClicked(MouseEvente){
//TODOAuto-generatedmethodstub
}
@Override
publicvoidmousePressed(MouseEvente){
//TODOAuto-generatedmethodstub
//System.out.println("X:
"+e.getX());
//System.out.println("Y:
"+e.getY());
if(canPlay==true){
x=e.getX();
y=e.getY();
if(x>=13&&x<=373&&y>=73&&y<=433){
x=(x-13)/20;
y=(y-72)/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;
}
//this.checkWin();
}else{
JOptionPane.showMessageDialog(this,"当前位置已经有子,请重新落
子!
");
}
this.repaint();
}
}
//System.out.println(e.getX()+"---"+e.getY());
//点击开始按钮
if(e.getX()>=404&&e.getX()<=472&&e.getY()>=74&&e.getY()<=104){
intresult=JOptionPane.showConfirmDialog(this,"是否重新开始游戏?
");
if(result==0){
//现在重新开始游戏
//重新开始游戏所需的操作,1.把棋盘清空allcChess这个数组中的数全部
归零;
//2将游戏信息设置为初始位置;
//3将下一步器=棋设置为黑方开始;
for(inti=0;i<19;i++){
for(intj=0;j<19;j++){
allChess[i][j]=0;
}
}
}
//另一种方式allChess=newint[19][19];
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.repaint();
}
//点击游戏设置
if(e.getX()>=404&&e.getX()<=472&&e.getY()>=124&&e.getY()<=154){
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;
}
}
//另一种方式allChess=newint[19][19];
message="黑色先行";
isBlack=true;
blackTime=maxTime;
whiteTime=maxTime;
blackMessage="无限制";
whiteMessage="无限制";
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;
}
}
//另一种方式allChess=newint[19][19];
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();
输入负数!
");
}
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;
}
}
//另一种方式allChess=newint[19][19];
message="黑色先行";
isBlack=true;
blackTime=maxTime;
whiteTime=maxTime;
blackMessage="无限制";
whiteMessage="无限制";
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;
}
}
//另一种方式allChess=newint[19][19];
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();
intcolor=allChess[x][y];
/*
*if(color==allChess[x+1][y]){count++;if(color==allChess[x+
*2][y]){count++;if(color==allChess[x+3][y]){count++;}}}
*/
//通过循环未做棋子相连的判断
//判断横向是否有5个棋子相连,特点是横纵坐标相同,即allChess[x][y]中y值
是否相同
/*
*inti=1;while(color==allChess[x+i][y]){count++;i++;}i=
*1;while(color==allChess[x-i][y]);{count++;i++;}if(count
*>=5){flag=true;}
*/
/*
*//縱方向的inti2=1;intcount2=1;while(color==allChess[x][y+i2]){
*count2++;i2++;}i2=1;while(color==allChess[x][y-i2]);{count2++;
*i2++;}if(count2>=5){flag=true;}//判斷斜右上的左下inti3=1;intcount3
*=1;while(color==allChess[x+i][y-i]){count3++;i3++;}i3=1;
*while(color==allChess[x-i][y+i]);{count3++;i3++;}if(count3>=5){
*flag=true;}//斜下左上右下inti4=1;intcount4=1;while(color==
*allChess[x+i][y+i]){count4++;i4++;}i4=1;while
*(color==allChess[x-i][y-i]);{count4++;i4++;}if(count4>=5){
*flag=true;}
*/
//判斷橫向
count=this.checkChess(1,0,color);
if(count>=5){
flag=true;
}else{
//判斷縱向
count=this.checkChess(0,1,color);
if(count>=5){
flag=true;
}else{
//判斷右上、左下
count=this.checkChess(1,-1,color);
if(count>=5){
flag=true;
}else{
//判斷右下、左上
count=this.checkChess(1,1,color);
if(count>=5){
flag=true;
}
}
}
}
returnflag;
}
privateintcheckChess(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;
}
@Override
publicvoidmouseEntered(MouseEvente){
//TODOAuto-generatedmethodstub
}
@Override
publicvoidmouseExited(MouseEvente){
//TODOAuto-generatedmethodstub
}
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
//判断是否有时间限制
if(maxTime>0){
while(true){
if(isBlack){
blackTime--;
if(blackTime==0){
JOptionPane.showMessageDialog(this,"黑方超時,游戏结束");
}
}else{
whit