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