java實(shí)現(xiàn)五子棋程序
本文實(shí)例為大家分享了java實(shí)現(xiàn)五子棋程序的具體代碼,供大家參考,具體內(nèi)容如下
知識(shí)點(diǎn)
1、Swing 編程
2、ImageIO 類的使用
3、圖片的繪制
1、 Swing的概念
Swing是在java的基礎(chǔ)圖形化用戶界面AWT的基礎(chǔ)上擴(kuò)展的API集
Swing的功能:通過(guò)java的代碼編寫窗口程序,創(chuàng)建圖形化界面(GUI)
JFrame是Swing的基礎(chǔ)類之一
JOptionPane類
showMessageDialog():顯示一個(gè)消息對(duì)話框,主要用來(lái)提示信息
showConfirmDialog():顯示一個(gè)對(duì)話框,用戶選擇后根據(jù)返回的結(jié)果進(jìn)行判斷
showMessageDialog():顯示一個(gè)信息輸入對(duì)話框,用于保存用戶輸入的信息
MouseListener類
MouseListener的使用方法,調(diào)用JFremain的addMouseListener方法加入監(jiān)聽(tīng)。
mouseClicked():監(jiān)聽(tīng)鼠標(biāo)點(diǎn)擊事件
mousePressed():監(jiān)聽(tīng)鼠標(biāo)進(jìn)去事件的操作(窗體內(nèi)部)
mouseReleased():監(jiān)聽(tīng)鼠標(biāo)的離開(kāi)事件的操作(窗體外部)
mouseEntered()::監(jiān)聽(tīng)鼠標(biāo)按下的事件
mouseExited():監(jiān)聽(tīng)鼠標(biāo)抬起的事件
鼠標(biāo)點(diǎn)擊時(shí)的執(zhí)行順序時(shí):mousePressed——>mouseReleased——>mouseClicked(判斷按下與抬起是否在同一位置)
MouseEvent類
getX():得到鼠標(biāo)的橫向位置的坐標(biāo)
getY():得到鼠標(biāo)的縱向位置的坐標(biāo)
Graphics類
drawString():繪制字符串
drawOval():繪制一個(gè)空心的圓形
fillOval():繪制一個(gè)實(shí)心的圓形
drawLine():繪制一條線
drawRect():繪制一個(gè)空心矩形
fillRect():繪制一個(gè)實(shí)心矩形
drawImage():繪制一個(gè)已經(jīng)存在的圖片,將一個(gè)圖片直接顯示到窗體中
setColor():設(shè)置畫筆的顏色
setFont():設(shè)置文字的字體
功能
(1)、在點(diǎn)擊鼠標(biāo)時(shí)在相應(yīng)的位置顯示旗子
(2)、可以自動(dòng)判斷游戲是否結(jié)束,黑方還是白方勝利
(3)、游戲時(shí)間進(jìn)行設(shè)置,判斷是否超時(shí)
1、開(kāi)發(fā)界面
計(jì)算棋盤中每一條線的間距:這里是19*19的圍棋盤
總寬度為467-17=450,總高度533-89=450
分18份,每一份:x:25 y:25
此代碼獲取棋盤四個(gè)端點(diǎn)的坐標(biāo)
@Override ?? ?public void mousePressed(MouseEvent e) { ?? ??? ?// TODO Auto-generated method stub ?? ??? ?System.out.println("X"+e.getX()); ?? ??? ?System.out.println("Y"+e.getY()); ?? ?}
2、在棋盤上的鼠標(biāo)點(diǎn)擊位置,顯示一個(gè)旗子
黑子:實(shí)心黑圓
白子:實(shí)心白圓
repaint():表示重新執(zhí)行repaint
3、保存之前下過(guò)的旗子
通過(guò)一個(gè)二維數(shù)組來(lái)保存之前下過(guò)的棋子
4、判斷游戲勝負(fù)
五子棋的基本規(guī)則,是否有同一顏色的棋子連成五個(gè)(核心算法)
public boolean checKwin() { ?? ??? ?boolean flag=false; ?? ??? ?//判斷橫向的是否有五個(gè)棋子,特點(diǎn) 縱坐標(biāo)是相同的即allChess[X][Y]中Y值是相同的 ?? ??? ?int color=allChess[x][y]; ?? ??? ?//保存共有多少相同顏色的棋子 ?? ? ? ?int count=1; ?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; ?? ??? ??? ??? ??? ?}else { ?? ??? ??? ??? ??? ??? ?//右上 ?? ??? ??? ??? ??? ??? ?count=this.checkCount(1, 1, color); ?? ??? ??? ??? ??? ??? ?if(count>=5) { ?? ??? ??? ??? ??? ??? ??? ?flag=true; ?? ??? ??? ??? ??? ?}else { ?? ??? ??? ??? ??? ??? ?//左上 ?? ??? ??? ??? ??? ??? ?count=this.checkCount(-1,-1, color); ?? ??? ??? ??? ??? ??? ?if(count>=5) { ?? ??? ??? ??? ??? ??? ??? ?flag=true; ?? ??? ??? ??? ??? ??? ??? ?} ?? ??? ??? ??? ??? ??? ?} ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?} ?? ??? ?return flag; ?? ?} ?? ?//判斷棋子連接的數(shù)量 ?? ?private int checkCount(int xChange,int yChange,int color) { ?? ??? ?int count =1; ?? ??? ?int tempX=xChange; ?? ??? ?int tempY=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=tempY; ?? ??? ?yChange=tempX; ?? ??? ? ?? ??? ?while(color==allChess[x-xChange][y-yChange]) { ?? ??? ??? ?count++; ?? ??? ??? ?if(xChange!=0)? ?? ??? ??? ??? ?xChange++; ?? ??? ??? ?if(yChange!=0) { ?? ??? ??? ??? ?if(yChange>0)? ?? ??? ??? ??? ??? ?yChange++; ?? ??? ??? ??? ?else { ?? ??? ??? ??? ??? ?yChange--; ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?} ?? ??? ?return count; ?? ??? ? ?? ?}
5、實(shí)現(xiàn)各個(gè)按鈕的功能
開(kāi)始游戲:重新開(kāi)始
游戲設(shè)置:設(shè)置倒計(jì)時(shí)
線程實(shí)現(xiàn)
//點(diǎn)擊 游戲設(shè)置 按鈕 ?? ??? ?if(e.getX()>=508 && e.getX()<=595 &&e.getY()>=154 &&e.getY()<=190) { ?? ??? ??? ?String input=JOptionPane.showInputDialog("請(qǐng)輸入游戲的最大時(shí)間(分鐘),輸入0表示沒(méi)有時(shí)間限制"); ?? ??? ??? ?try { ?? ??? ??? ??? ?maxTime=Integer.parseInt(input)*60; ?? ??? ??? ??? ?if(maxTime<0) { ?? ??? ??? ??? ??? ?JOptionPane.showMessageDialog(this, "不允許輸入負(fù)數(shù)"); ?? ??? ??? ??? ?} ?? ??? ??? ??? ?if(maxTime>0){ ?? ??? ??? ??? ??? ?int r1=JOptionPane.showConfirmDialog(this,"是否重新開(kāi)始游戲?"); ?? ??? ??? ??? ??? ?if(r1==0) { ?? ??? ??? ??? ??? ??? ?//重新開(kāi)始游戲1、棋盤清空;allChess==0;2、將游戲信息的顯示改到開(kāi)始位置;3、將下一步要下棋的改為黑方 ?? ??? ??? ??? ??? ??? ?allChess=new int[19][19]; ?? ??? ??? ??? ??? ??? ?message="黑方先行"; ?? ??? ??? ??? ??? ??? ?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); ?? ??? ??? ??? ??? ??? ?isBlack=true; ?? ??? ??? ??? ??? ??? ?t.resume(); ?? ??? ??? ??? ??? ??? ?//重新繪制棋盤 ?? ??? ??? ??? ??? ??? ?this.repaint(); ?? ??? ??? ??? ??? ??? ?} ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?}catch(NumberFormatException e1){ ?? ??? ??? ??? ??? ?JOptionPane.showMessageDialog(this, "請(qǐng)正確輸入信息"); ?? ??? ??? ??? ?} ?? ??? ??? ?}
public void run() { ?? ??? ?// TODO Auto-generated method stub ?? ??? ?//判斷是否有時(shí)間限制 ?? ??? ?if(maxTime>0) { ?? ??? ??? ?while(true) { ?? ??? ??? ??? ?if(isBlack) { ?? ??? ??? ??? ??? ?blackTime--; ?? ??? ??? ??? ??? ?if(blackTime==0) { ?? ??? ??? ??? ??? ??? ?JOptionPane.showMessageDialog(this,"黑方超時(shí),游戲結(jié)束"); ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?}else { ?? ??? ??? ??? ??? ?whiteTime--; ?? ??? ??? ??? ??? ?if(whiteTime==0) { ?? ??? ??? ??? ??? ??? ?JOptionPane.showMessageDialog(this,"白方超時(shí),游戲結(jié)束"); ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?} ?? ??? ??? ??? ?blackMessage=blackTime/3600+":" ?? ??? ??? ??? ??? ??? ?+(blackTime/60-blackTime/3600*60)+":" ?? ??? ??? ??? ??? ??? ?+(blackTime-blackTime/60*60); ?? ??? ??? ??? ?whiteMessage=whiteTime/3600+":"+ ?? ??? ??? ??? ??? ??? ?(whiteTime/60-whiteTime/3600*60)+":" ?? ??? ??? ??? ??? ??? ?+(whiteTime-whiteTime/60*60); ?? ??? ??? ??? ?//刷新屏幕 ?? ??? ??? ??? ?this.repaint(); ?? ??? ??? ??? ?try { ?? ??? ??? ??? ??? ?Thread.sleep(1000); ?? ??? ??? ??? ?} catch (InterruptedException e) { ?? ??? ??? ??? ??? ?// TODO Auto-generated catch block ?? ??? ??? ??? ??? ?e.printStackTrace(); ?? ??? ??? ??? ?} ?? ??? ??? ??? ? ?? ??? ??? ?} ?? ??? ?} ?? ?}
游戲說(shuō)明:用來(lái)說(shuō)明游戲規(guī)則和操作
認(rèn)輸: 是某一方放棄游戲
關(guān)于 : 作者,版本
退出: 退出游戲
總代碼
public class test { ?? ?public static void main(String[] args) { ?? ??? ?// TODO Auto-generated method stub ?? ??? ?FiveChessFream jj=new FiveChessFream(); ?? ?} }
package FiveChessDome; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Toolkit; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JOptionPane; public class FiveChessFream extends JFrame implements MouseListener,Runnable{ ?? ? ?? ?int width=Toolkit.getDefaultToolkit().getScreenSize().width; ?? ?int higth=Toolkit.getDefaultToolkit().getScreenSize().height; ?? ?//背景圖片 ?? ?BufferedImage bgImage=null; ?? ?//保存旗子的坐標(biāo) ?? ?int x=0; ?? ?int y=0; ?? ?//保存之前下過(guò)的旗子的坐標(biāo),其中數(shù)據(jù)內(nèi)容是0:表示這個(gè)點(diǎn)沒(méi)有旗子,1:表示是黑子,2:表示的是白子 ?? ?int [][] allChess=new int[19][19]; ?? ?//標(biāo)識(shí)當(dāng)前應(yīng)該是黑棋還是白棋 ?? ?Boolean isBlack=true; ?? ?//標(biāo)識(shí)當(dāng)前游戲是否繼續(xù)進(jìn)行 ?? ?boolean canPlay=true; ?? ?//保存顯示信息 ?? ?String message="黑方先行"; ?? ?//保存最多擁有多少時(shí)間 ?? ?int maxTime=0; ?? ?//做倒計(jì)時(shí)的線程類 ?? ?Thread t=new Thread(this); ?? ?//保存黑方與白方的剩余時(shí)間 ?? ?int blackTime=0; ?? ?int whiteTime=0; ?? ?//保存雙方剩余的時(shí)間 ?? ?String blackMessage="無(wú)限制"; ?? ?String whiteMessage="無(wú)限制"; ?? ? ?? ? ?? ?public FiveChessFream() { ?? ??? ?//標(biāo)題 ?? ??? ?this.setTitle("五子棋"); ?? ??? ?//窗體大小 ?? ??? ?this.setSize(626, 625); ?? ??? ?//窗體在屏幕的位置 ?? ??? ?this.setLocation((width-500)/2,(higth-500)/2); ?? ??? ?//窗體不可變 ?? ??? ?this.setResizable(false); ?? ??? ?//窗體關(guān)閉 ?? ??? ?this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ?? ??? ?//為窗體加入監(jiān)聽(tīng)器 ?? ??? ?this.addMouseListener(this); ?? ??? ?//窗體顯示 ?? ??? ?this.setVisible(true); ?? ??? ? ?? ??? ?//啟動(dòng)線程 ?? ??? ?t.start(); ?? ??? ?t.suspend(); ?? ??? ?//刷新屏幕,防止開(kāi)始游戲時(shí)無(wú)法顯示屏幕的情況 ?? ??? ?this.repaint(); ?? ??? ? ?? ??? ?//背景圖的導(dǎo)入 ?? ??? ?try { ?? ??? ??? ?bgImage=ImageIO.read(new File("d:/桌面/五子棋2.png")); ?? ??? ?} catch (IOException e) { ?? ??? ??? ?// TODO Auto-generated catch block ?? ??? ??? ?e.printStackTrace(); ?? ??? ?} ?? ?} ?? ?public void paint(Graphics g) { ?? ??? ?//雙緩沖技術(shù)防止屏幕閃爍 ?? ??? ?BufferedImage bi=new BufferedImage(626, 625, BufferedImage.TYPE_INT_ARGB); ?? ??? ?Graphics g2=bi.createGraphics(); ?? ??? ?//繪制背景 ?? ??? ?g.drawImage(bgImage, 3, 20, this); ?? ??? ?//輸出標(biāo)題信息 ?? ??? ?g.setFont(new Font("黑體",Font.BOLD,20)); ?? ??? ?g.drawString("游戲信息:"+message,100, 60); ?? ??? ?//輸出時(shí)間信息 ?? ??? ?g.setFont(new Font("宋體",10,14)); ?? ??? ?g.drawString("黑色的時(shí)間:"+blackMessage, 40, 585); ?? ??? ?g.drawString("白色的時(shí)間:"+whiteMessage, 330, 585); ?? ??? ? ?? ??? ? ?? ??? ?//繪制棋盤 ?? ??? ?for(int i=0;i<19;i++) { ?? ??? ??? ?//橫軸 ?? ??? ??? ?g.drawLine(17,89+25*i,467,89+25*i); ?? ??? ??? ?//豎軸 ?? ??? ??? ?g.drawLine(17+25*i, 89, 17+25*i, 538); ?? ??? ?} ?? ??? ? ?? ??? ?//標(biāo)志點(diǎn)位,四個(gè)點(diǎn) ?? ??? ?g.fillOval(90, 162,4,4); ?? ??? ?g.fillOval(90, 462,4,4); ?? ??? ?g.fillOval(390, 162,4,4); ?? ??? ?g.fillOval(390,462,4,4); ?? ??? ? ?? ??? ?//繪制全部旗子 ?? ??? ?for(int i=0;i<19;i++) { ?? ??? ??? ?for(int j=0;j<19;j++) { ?? ??? ??? ??? ?if(allChess[i][j]==1) { ?? ??? ??? ??? ??? ?//黑子 ?? ??? ??? ??? ??? ?int tempx=i*25+17; ?? ??? ??? ??? ??? ?int tempy=j*25+89; ?? ??? ??? ??? ??? ?g.fillOval(tempx-7,tempy-7,14,14); ?? ??? ??? ??? ?} ?? ??? ??? ??? ?if(allChess[i][j]==2) { ?? ??? ??? ??? ??? ?//白子 ?? ??? ??? ??? ??? ?int tempx=i*25+17; ?? ??? ??? ??? ??? ?int tempy=j*25+89; ?? ??? ??? ??? ??? ?g.setColor(Color.WHITE); ?? ??? ??? ??? ??? ?g.fillOval(tempx-7,tempy-7,14,14); ?? ??? ??? ??? ??? ?g.setColor(Color.BLACK); ?? ??? ??? ??? ??? ?g.drawOval(tempx-7,tempy-7,14,14); ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?} ?? ?} ?? ?@Override ?? ?public void mouseClicked(MouseEvent e) { ?? ??? ?// TODO Auto-generated method stub ?? ??? ? ?? ?} ?? ?@Override ?? ?public void mousePressed(MouseEvent e) { ?? ??? ?if(canPlay==true) { ?? ??? ? x=e.getX(); ?? ??? ? y=e.getY(); ?? ??? ?//判斷旗子落在棋盤上 ?? ??? ?if(x>17&&x<=467 && y>89&&y<=538) { ?? ??? ??? ?x=(x-17)/25; ?? ??? ??? ?y=(y-89)/25; ?? ??? ??? ?if(allChess[x][y]==0) { ?? ??? ??? ?//判斷當(dāng)前要下的是什么旗子 ?? ??? ??? ??? ?if(isBlack==true) { ?? ??? ??? ??? ??? ?allChess[x][y]=1; ?? ??? ??? ??? ??? ?isBlack=false; ?? ??? ??? ??? ??? ?message="輪到白方"; ?? ??? ??? ??? ?}else { ?? ??? ??? ??? ??? ?allChess[x][y]=2; ?? ??? ??? ??? ??? ?isBlack=true; ?? ??? ??? ??? ??? ?message="輪到黑方"; ?? ??? ??? ??? ?} ?? ??? ??? ??? ? ?? ??? ??? ??? ?//判斷這個(gè)棋子是否和其他的棋子連成五個(gè) ?? ??? ??? ??? ?boolean winFlag=this.checKwin(); ?? ??? ??? ??? ?if(winFlag==true) { ?? ??? ??? ??? ??? ?JOptionPane.showMessageDialog(this,"游戲結(jié)束" ?? ??? ??? ??? ?+(allChess[x][y]==1?"黑色":"白色")+"獲勝"); ?? ??? ??? ??? ??? ?canPlay=false; ?? ??? ??? ??? ?} ?? ??? ??? ??? ? ?? ??? ??? ?}else { ?? ??? ??? ??? ?JOptionPane.showMessageDialog(this,"當(dāng)前位置已經(jīng)有棋子,請(qǐng)重新落子!"); ?? ??? ??? ?} ?? ??? ??? ?this.repaint(); ?? ??? ??? ?} ?? ??? ?} ?? ??? ? ?? ??? ?//System.out.println(e.getX()+"`````"+e.getY()); ?? ??? ?//點(diǎn)擊 游戲開(kāi)始 按鈕 ?? ??? ?if(e.getX()>=508 && e.getX()<=595 &&e.getY()>=90 &&e.getY()<=125) { ?? ??? ??? ?int r1=JOptionPane.showConfirmDialog(this,"是否重新開(kāi)始游戲?"); ?? ??? ??? ?if(r1==0) { ?? ??? ??? ??? ?//重新開(kāi)始游戲1、棋盤清空;allChess==0;2、將游戲信息的顯示改到開(kāi)始位置;3、將下一步要下棋的改為黑方 ?? ??? ??? ??? ?allChess=new int[19][19]; ?? ??? ??? ??? ?message="黑方先行"; ?? ??? ??? ??? ?isBlack=true; ?? ??? ??? ??? ?//重新繪制棋盤 ?? ??? ??? ??? ?this.repaint(); ?? ??? ??? ?} ?? ??? ?} ?? ??? ?//點(diǎn)擊 游戲設(shè)置 按鈕 ?? ??? ?if(e.getX()>=508 && e.getX()<=595 &&e.getY()>=154 &&e.getY()<=190) { ?? ??? ??? ?String input=JOptionPane.showInputDialog("請(qǐng)輸入游戲的最大時(shí)間(分鐘),輸入0表示沒(méi)有時(shí)間限制"); ?? ??? ??? ?try { ?? ??? ??? ??? ?maxTime=Integer.parseInt(input)*60; ?? ??? ??? ??? ?if(maxTime<0) { ?? ??? ??? ??? ??? ?JOptionPane.showMessageDialog(this, "不允許輸入負(fù)數(shù)"); ?? ??? ??? ??? ?} ?? ??? ??? ??? ?if(maxTime>0){ ?? ??? ??? ??? ??? ?int r1=JOptionPane.showConfirmDialog(this,"是否重新開(kāi)始游戲?"); ?? ??? ??? ??? ??? ?if(r1==0) { ?? ??? ??? ??? ??? ??? ?//重新開(kāi)始游戲1、棋盤清空;allChess==0;2、將游戲信息的顯示改到開(kāi)始位置;3、將下一步要下棋的改為黑方 ?? ??? ??? ??? ??? ??? ?allChess=new int[19][19]; ?? ??? ??? ??? ??? ??? ?message="黑方先行"; ?? ??? ??? ??? ??? ??? ?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); ?? ??? ??? ??? ??? ??? ?isBlack=true; ?? ??? ??? ??? ??? ??? ?t.resume(); ?? ??? ??? ??? ??? ??? ?//重新繪制棋盤 ?? ??? ??? ??? ??? ??? ?this.repaint(); ?? ??? ??? ??? ??? ??? ?} ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?}catch(NumberFormatException e1){ ?? ??? ??? ??? ??? ?JOptionPane.showMessageDialog(this, "請(qǐng)正確輸入信息"); ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?//點(diǎn)擊 游戲說(shuō)明 按鈕 ?? ??? ?if(e.getX()>=508 && e.getX()<=595 &&e.getY()>=214 &&e.getY()<=248) { ?? ??? ??? ?JOptionPane.showMessageDialog(this," 這是一個(gè)五子棋游戲,黑白雙方輪流下"); ?? ??? ?} ?? ??? ?//點(diǎn)擊 認(rèn)輸 按鈕 ?? ??? ?if(e.getX()>=508 && e.getX()<=595 &&e.getY()>=344 &&e.getY()<=378) { ?? ??? ??? ?int result=JOptionPane.showConfirmDialog(this,"是否確認(rèn)認(rèn)輸?"); ?? ??? ??? ?if(result==0) { ?? ??? ??? ??? ?if(isBlack) { ?? ??? ??? ??? ??? ?JOptionPane.showMessageDialog(this,"黑方認(rèn)輸"); ?? ??? ??? ??? ?}else { ?? ??? ??? ??? ??? ?JOptionPane.showMessageDialog(this,"白方認(rèn)輸"); ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?} ?? ??? ?//點(diǎn)擊 關(guān)于 按鈕 ?? ??? ?if(e.getX()>=508 && e.getX()<=595 &&e.getY()>=406 &&e.getY()<=438) { ?? ??? ??? ?JOptionPane.showMessageDialog(this,"本游戲由@JiaHao制作,視頻地址https://www.bilibili." ?? ??? ??? ??? ??? ?+ "com/video/BV1kJ411s7zf?p=10&share_source=copy_web"); ?? ??? ?} ?? ??? ?//點(diǎn)擊 退出 按鈕 ?? ??? ?if(e.getX()>=508 && e.getX()<=595 &&e.getY()>=466 &&e.getY()<=501) { ?? ??? ??? ?JOptionPane.showMessageDialog(this,"退出"); ?? ??? ??? ?System.exit(0); ?? ??? ?} ?? ??? ? ?? ?} ?? ?//判斷什么棋子贏 ?? ?public boolean checKwin() { ?? ??? ?boolean flag=false; ?? ??? ?//判斷橫向的是否有五個(gè)棋子,特點(diǎn) 縱坐標(biāo)是相同的即allChess[X][Y]中Y值是相同的 ?? ??? ?int color=allChess[x][y]; ?? ??? ?//保存共有多少相同顏色的棋子 ?? ? ? ?int count=1; ?? ??? ?//判斷橫向 ?? ? ? ?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; ?? ??? ??? ??? ??? ?}else { ?? ??? ??? ??? ??? ??? ?//右上 ?? ??? ??? ??? ??? ??? ?count=this.checkCount(1, 1, color); ?? ??? ??? ??? ??? ??? ?if(count>=5) { ?? ??? ??? ??? ??? ??? ??? ?flag=true; ?? ??? ??? ??? ??? ?}else { ?? ??? ??? ??? ??? ??? ?//左上 ?? ??? ??? ??? ??? ??? ?count=this.checkCount(-1,-1, color); ?? ??? ??? ??? ??? ??? ?if(count>=5) { ?? ??? ??? ??? ??? ??? ??? ?flag=true; ?? ??? ??? ??? ??? ??? ??? ?} ?? ??? ??? ??? ??? ??? ?} ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?} ?? ??? ?return flag; ?? ?} ?? ?//判斷棋子連接的數(shù)量 ?? ?private int checkCount(int xChange,int yChange,int color) { ?? ??? ?int count =1; ?? ??? ?int tempX=xChange; ?? ??? ?int tempY=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=tempY; ?? ??? ?yChange=tempX; ?? ??? ? ?? ??? ?while(color==allChess[x-xChange][y-yChange]) { ?? ??? ??? ?count++; ?? ??? ??? ?if(xChange!=0)? ?? ??? ??? ??? ?xChange++; ?? ??? ??? ?if(yChange!=0) { ?? ??? ??? ??? ?if(yChange>0)? ?? ??? ??? ??? ??? ?yChange++; ?? ??? ??? ??? ?else { ?? ??? ??? ??? ??? ?yChange--; ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?} ?? ??? ?return count; ?? ??? ? ?? ?} ?? ?@Override ?? ?public void mouseReleased(MouseEvent e) { ?? ??? ?// TODO Auto-generated method stub ?? ??? ? ?? ?} ?? ?@Override ?? ?public void mouseEntered(MouseEvent e) { ?? ??? ?// TODO Auto-generated method stub ?? ??? ? ?? ?} ?? ?@Override ?? ?public void mouseExited(MouseEvent e) { ?? ??? ?// TODO Auto-generated method stub ?? ??? ? ?? ?} ?? ?@Override ?? ?public void run() { ?? ??? ?// TODO Auto-generated method stub ?? ??? ?//判斷是否有時(shí)間限制 ?? ??? ?if(maxTime>0) { ?? ??? ??? ?while(true) { ?? ??? ??? ??? ?if(isBlack) { ?? ??? ??? ??? ??? ?blackTime--; ?? ??? ??? ??? ??? ?if(blackTime==0) { ?? ??? ??? ??? ??? ??? ?JOptionPane.showMessageDialog(this,"黑方超時(shí),游戲結(jié)束"); ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?}else { ?? ??? ??? ??? ??? ?whiteTime--; ?? ??? ??? ??? ??? ?if(whiteTime==0) { ?? ??? ??? ??? ??? ??? ?JOptionPane.showMessageDialog(this,"白方超時(shí),游戲結(jié)束"); ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?} ?? ??? ??? ??? ?blackMessage=blackTime/3600+":" ?? ??? ??? ??? ??? ??? ?+(blackTime/60-blackTime/3600*60)+":" ?? ??? ??? ??? ??? ??? ?+(blackTime-blackTime/60*60); ?? ??? ??? ??? ?whiteMessage=whiteTime/3600+":"+ ?? ??? ??? ??? ??? ??? ?(whiteTime/60-whiteTime/3600*60)+":" ?? ??? ??? ??? ??? ??? ?+(whiteTime-whiteTime/60*60); ?? ??? ??? ??? ?//刷新屏幕 ?? ??? ??? ??? ?this.repaint(); ?? ??? ??? ??? ?try { ?? ??? ??? ??? ??? ?Thread.sleep(1000); ?? ??? ??? ??? ?} catch (InterruptedException e) { ?? ??? ??? ??? ??? ?// TODO Auto-generated catch block ?? ??? ??? ??? ??? ?e.printStackTrace(); ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?} ?? ?} }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java使用Hutool實(shí)現(xiàn)AES、DES加密解密的方法
本篇文章主要介紹了Java使用Hutool實(shí)現(xiàn)AES、DES加密解密的方法,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08java多線程編程之向線程傳遞數(shù)據(jù)的三種方法
在多線程的異步開(kāi)發(fā)模式下,數(shù)據(jù)的傳遞和返回和同步開(kāi)發(fā)模式有很大的區(qū)別。由于線程的運(yùn)行和結(jié)束是不可預(yù)料的,因此,在傳遞和返回?cái)?shù)據(jù)時(shí)就無(wú)法象函數(shù)一樣通過(guò)函數(shù)參數(shù)和return語(yǔ)句來(lái)返回?cái)?shù)據(jù)2014-01-01SpringBoot日志文件的實(shí)現(xiàn)示例
日志是程序中的重要組成部分,使用日志可以快速的發(fā)現(xiàn)和定位問(wèn)題,本文主要介紹了SpringBoot日志文件的實(shí)現(xiàn)示例,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08Java讀取文件的簡(jiǎn)單實(shí)現(xiàn)方法
這篇文章主要介紹了Java讀取文件的簡(jiǎn)單實(shí)現(xiàn)方法,通過(guò)一個(gè)讀取txt格式的log文件為例,詳細(xì)的講述了Java讀取文件的方法及原理,需要的朋友可以參考下2014-09-09SpringBoot如何配置MySQL和Oracl雙數(shù)據(jù)源(Mybatis)
這篇文章主要介紹了SpringBoot如何配置MySQL和Oracl雙數(shù)據(jù)源(Mybatis)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03