溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java怎么實現(xiàn)單機版五子棋游戲的教程

發(fā)布時間:2021-03-10 15:53:18 來源:億速云 閱讀:169 作者:TREX 欄目:編程語言

本篇內(nèi)容主要講解“java怎么實現(xiàn)單機版五子棋游戲的教程”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“java怎么實現(xiàn)單機版五子棋游戲的教程”吧!

Java是什么

Java是一門面向?qū)ο缶幊陶Z言,可以編寫桌面應(yīng)用程序、Web應(yīng)用程序、分布式系統(tǒng)和嵌入式系統(tǒng)應(yīng)用程序。


這個小游戲是我和我姐們兒的JAVA課程設(shè)計,也是我做的第一個JAVA項目,適合初學(xué)者,希望能幫到那些被JAVA課設(shè)所困擾的孩紙們~~~

一、該游戲需要實現(xiàn)

1、設(shè)計主框架,界面。

2、利用ActionListener接口實現(xiàn)按鈕事件的監(jiān)聽。

3、重新開始功能的實現(xiàn)。

4、悔棋功能的實現(xiàn)。

5、退出功能的實現(xiàn)。

6、棋盤中棋子點類的定義。

7、利用MouseListener接口實現(xiàn)事件監(jiān)聽,并實現(xiàn)接口里的所有方法。

8、當(dāng)鼠標(biāo)移動到棋盤上的交點上,且該點上無棋子時能夠變成小手形狀。

9、點擊棋盤時,利用if語句判斷該點是否點在交點上,并利用foreach語句和棋子類中的getX(),getY()方法遍歷每一個棋子的位置判斷該點是否有棋子。

10、當(dāng)判斷到可以在所點擊的點上下子時,畫棋子時利用for循環(huán)遍歷已有的每一個點并利用Graphics類的setColor設(shè)置顏色,利用Graphics類的fillOval方法設(shè)置形狀大小。

11、當(dāng)畫完棋子時要及時判斷輸贏,用棋子所在索引和for循環(huán)遍歷最后一個棋子的各個方向,如果有在同一條直線上的棋子個數(shù)大于等于五的即當(dāng)前棋子所代表的那方贏。

12、勝負已定的時候,能夠彈出相應(yīng)的信息。

二、功能代碼實現(xiàn)

2.1進入游戲

public static void main(String[] args) { 
 StartChessJFrame f=new StartChessJFrame();//創(chuàng)建主框架 
 f.setVisible(true);//顯示主框架 
 }

2.2初始化,定義一些要用到的量。

private ChessBoard chessBoard;//對戰(zhàn)面板 
 private Panel toolbar;//工具條面板 
 private Button startButton;//設(shè)置開始按鈕 
 private Button backButton;//設(shè)置悔棋按鈕 
 private Button exitButton;//設(shè)置退出按鈕

2.3界面的構(gòu)造方法(游戲的框架)

public StartChessJFrame(){ 
 setTitle("單機版五子棋");//設(shè)置標(biāo)題 
 chessBoard=new ChessBoard();//初始化面板對象,創(chuàng)建和添加菜單 
 MyItemListener lis=new MyItemListener();//初始化按鈕事件監(jiān)聽器內(nèi)部類 
 toolbar=new Panel();//工具面板欄實例化 
 startButton=new Button("重新開始"); 
 backButton=new Button("悔棋"); 
 exitButton=new Button("退出");//三個按鈕初始化 
 toolbar.setLayout(new FlowLayout(FlowLayout.LEFT));//將工具面板按鈕用FlowLayout布局 
 toolbar.add(backButton); 
 toolbar.add(startButton); 
 toolbar.add(exitButton);//將三個按鈕添加到工具面板上 
 startButton.addActionListener(lis); 
 backButton.addActionListener(lis); 
 exitButton.addActionListener(lis);//將三個按鈕事件注冊監(jiān)聽事件 
 add(toolbar,BorderLayout.SOUTH);//將工具面板布局到界面南方也就是下面 
 add(chessBoard);//將面板對象添加到窗體上 
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//設(shè)置界面關(guān)閉事件 
 pack();//自適應(yīng)大小 
 }

2.4按鈕的實現(xiàn)與監(jiān)聽(構(gòu)造方法內(nèi)部)

MyItemListener lis=new MyItemListener();//初始化按鈕事件監(jiān)聽器內(nèi)部類 
 toolbar=new Panel();//工具面板欄實例化 
 startButton=new Button("重新開始"); 
 backButton=new Button("悔棋"); 
 exitButton=new Button("退出");//三個按鈕初始化 
 toolbar.setLayout(new FlowLayout(FlowLayout.LEFT));//將工具面板按鈕用FlowLayout布局 
 toolbar.add(backButton); 
 toolbar.add(startButton); 
 toolbar.add(exitButton);//將三個按鈕添加到工具面板上 
 startButton.addActionListener(lis); 
 backButton.addActionListener(lis); 
 exitButton.addActionListener(lis);//將三個按鈕事件注冊監(jiān)聽事件

2.5按鈕事件的監(jiān)聽

private class MyItemListener implements ActionListener{ 
 public void actionPerformed(ActionEvent e) { 
 Object obj=e.getSource();//獲取事件源 
 if(obj==startButton){ 
 System.out.println("重新開始...");//重新開始 
 //JFiveFrame.this內(nèi)部類引用外部類 
 chessBoard.restartGame(); 
 }else if(obj==exitButton){ 
 System.exit(0);//結(jié)束應(yīng)用程序 
 }else if(obj==backButton){ 
 System.out.println("悔棋...");//悔棋 
 chessBoard.goback(); 
 } 
 } 
 }

2.6重新開始按鈕的功能實現(xiàn)

public void restartGame(){//清除棋子 
 for(int i=0;i<chessList.length;i++) 
 chessList[i]=null; 
 /*恢復(fù)游戲相關(guān)的變量值*/ 
 isBack=true; 
 gameOver=false;//游戲是否結(jié)束 
 chessCount=0;//當(dāng)前棋盤的棋子個數(shù) 
 repaint(); 
 }

2.7悔棋按鈕的功能實現(xiàn)

public void goback(){ 
 if(chessCount==0) 
 return ; 
 chessList[chessCount-1]=null; 
 chessCount--; 
 if(chessCount>0){ 
 xIndex=chessList[chessCount-1].getX(); 
 yIndex=chessList[chessCount-1].getY(); 
 } 
 isBack=!isBack; 
 repaint(); 
 }

2.8當(dāng)棋盤根據(jù)需要變大或變小時窗口應(yīng)隨之發(fā)生改變

//Dimension:矩形ChessBoard類內(nèi)部 
 public Dimension getPreferredSize(){ 
 return new Dimension(MARGIN*2+GRID_SPAN*COLS,MARGIN*2+GRID_SPAN*ROWS); 
 } 
pack();//自適應(yīng)大小StartChessBoard類內(nèi)部

2.9定義棋子類

import java.awt.*; 
public class Point { 
 private int x;//棋子在棋盤中的x索引值 
 private int y;//棋子在棋盤中的y索引值 
 private Color color;//顏色 
 public static int DIAMETER=30;//直徑 
 public Point(int x,int y,Color color){ 
 this.x=x; 
 this.y=y; 
 this.color=color; 
 } 
 //得到棋子在棋盤中的x索引值 
 public int getX(){ 
 return x; 
 } 
 //得到棋子在棋盤中的y索引值 
 public int getY(){ 
 return y; 
 } 
 //得到棋子顏色 
 public Color getColor(){ 
 return color; 
 } 
}

三、功能部分代碼實現(xiàn)

3.1初始化,定義一些要用到的量。

public static int MARGIN=30;//邊距 
 public static int GRID_SPAN=35;//網(wǎng)格間距 
 public static int ROWS=18;//棋盤行數(shù) 
 public static int COLS=18;//棋盤列數(shù) 
 Point[] chessList=new Point[(ROWS+1)*(COLS+1)];//初始化每個數(shù)組元素為null 
 boolean isBack=true;//默認開始是黑棋先下 
 boolean gameOver=false;//游戲是否結(jié)束 
 int chessCount;//當(dāng)前棋盤的棋子個數(shù) 
 int xIndex,yIndex;//當(dāng)前剛下棋子的索引

3.2棋盤對象的構(gòu)造方法

public ChessBoard(){ 
 setBackground(Color.LIGHT_GRAY);//設(shè)置背景顏色為灰色 
 addMouseListener(this);//添加事件監(jiān)聽器 
 addMouseMotionListener(new MouseMotionListener() {//匿名內(nèi)部類 
 
 @Override 
 public void mouseMoved(MouseEvent e) { 
 int x1=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN; 
 int y1=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//將鼠標(biāo)單擊的坐標(biāo)位置轉(zhuǎn)化為網(wǎng)格索引 
 if(x1<0||x1>ROWS||y1<0||y1>COLS||gameOver||findChess(x1,y1)){//游戲已經(jīng)結(jié)束,不能下;落在棋盤外,不能下;x,y位置已經(jīng)有棋子存在,不能下 
 setCursor(new Cursor(Cursor.DEFAULT_CURSOR));//設(shè)置成默認形狀 
 }else{ 
 setCursor(new Cursor(Cursor.HAND_CURSOR));//設(shè)置成手型 
 } 
 } 
 @Override 
 public void mouseDragged(MouseEvent e) { 
 } 
 }); 
 }

3.3設(shè)置鼠標(biāo)監(jiān)聽器,變小手(在構(gòu)造方法內(nèi)部)

addMouseMotionListener(new MouseMotionListener() {//匿名內(nèi)部類 
 
 @Override 
 public void mouseMoved(MouseEvent e) { 
 int x1=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN; 
 int y1=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//將鼠標(biāo)單擊的坐標(biāo)位置轉(zhuǎn)化為網(wǎng)格索引 
 if(x1<0||x1>ROWS||y1<0||y1>COLS||gameOver||findChess(x1,y1)){//游戲已經(jīng)結(jié)束,不能下;落在棋盤外,不能下;x,y位置已經(jīng)有棋子存在,不能下 
 setCursor(new Cursor(Cursor.DEFAULT_CURSOR));//設(shè)置成默認形狀 
 }else{ 
 setCursor(new Cursor(Cursor.HAND_CURSOR));//設(shè)置成手型 
 } 
 } 
 @Override 
 public void mouseDragged(MouseEvent e) { 
 } 
 });

3.4點擊棋盤時的鼠標(biāo)按壓事件

public void mousePressed(MouseEvent e) {//鼠標(biāo)按鍵在組件上按下時調(diào)用 
 if(gameOver)//游戲已經(jīng)結(jié)束,不能下 
 return ; 
 String colorName=isBack ? "黑棋" : "白棋"; 
 xIndex=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN; 
 yIndex=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//將鼠標(biāo)單擊的坐標(biāo)位置轉(zhuǎn)化為網(wǎng)格索引 
 if(xIndex<0||xIndex>ROWS||yIndex<0||yIndex>COLS)//棋子落在棋盤外,不能下 
 return ; 
 if(findChess(xIndex,yIndex))//x,y位置已經(jīng)有棋子存在,不能下 
 return ; 
 Point ch=new Point(xIndex,yIndex,isBack ? Color.black : Color.white); 
 chessList[chessCount++]=ch; 
 repaint();//通知系統(tǒng)重新繪制 
 if(isWin()){ 
 String msg=String.format("恭喜,%s贏啦~", colorName); 
 JOptionPane.showMessageDialog(this, msg); 
 gameOver=true; 
 } 
 else if(chessCount==(COLS+1)*(ROWS+1)) 
 { 
 String msg=String.format("棋鼓相當(dāng),棒棒噠~"); 
 JOptionPane.showMessageDialog(this,msg); 
 gameOver=true; 
 } 
 isBack=!isBack; 
 }

3.5繪制棋盤,棋子還有紅框框

public void paintComponent(Graphics g){ 
 super.paintComponent(g);//畫棋盤 
 for(int i=0;i<=ROWS;i++){//畫橫線 
 g.drawLine(MARGIN, MARGIN+i*GRID_SPAN, MARGIN+COLS*GRID_SPAN, MARGIN+i*GRID_SPAN); 
 } 
 for(int i=0;i<=COLS;i++){//畫直線 
 g.drawLine(MARGIN+i*GRID_SPAN, MARGIN, MARGIN+i*GRID_SPAN,MARGIN+ROWS*GRID_SPAN); 
 } 
 /*畫棋子*/ 
 for(int i=0;i<chessCount;i++){ 
 int xPos=chessList[i].getX()*GRID_SPAN+MARGIN;//網(wǎng)格交叉的x坐標(biāo) 
 int yPos=chessList[i].getY()*GRID_SPAN+MARGIN;//網(wǎng)格交叉的y坐標(biāo) 
 g.setColor(chessList[i].getColor());//設(shè)置顏色 
 g.fillOval(xPos-Point.DIAMETER/2, yPos-Point.DIAMETER/2, Point.DIAMETER, Point.DIAMETER); 
 if(i==chessCount-1){ 
 g.setColor(Color.red);//標(biāo)記最后一個棋子為紅色 
 g.drawRect(xPos-Point.DIAMETER/2, yPos-Point.DIAMETER/2, Point.DIAMETER, Point.DIAMETER); 
 } 
 } 
 }

3.6判斷輸贏

/*判斷哪方贏*/ 
 private boolean isWin(){ 
 int continueCount=1;//連續(xù)棋子的個數(shù) 
 for(int x=xIndex-1;x>=0;x--){//橫向向左尋找 
 Color c=isBack ? Color.black : Color.white; 
 if(getChess(x,yIndex,c)!=null){ 
 continueCount++; 
 }else 
 break; 
 } 
 for(int x=xIndex+1;x<=ROWS;x++){//橫向向右尋找 
 Color c=isBack ? Color.black : Color.white; 
 if(getChess(x,yIndex,c)!=null){ 
 continueCount++; 
 }else 
 break; 
 } 
 if(continueCount>=5){//判斷記錄數(shù)大于等于五,即表示此方獲勝 
 return true; 
 }else 
 continueCount=1; 
 // 
 for(int y=yIndex-1;y>=0;y--){//縱向向上尋找 
 Color c=isBack ? Color.black : Color.white; 
 if(getChess(xIndex,y,c)!=null){ 
 continueCount++; 
 }else 
 break; 
 } 
 for(int y=yIndex+1;y<=ROWS;y++){//縱向向下尋找 
 Color c=isBack ? Color.black : Color.white; 
 if(getChess(xIndex,y,c)!=null){ 
 continueCount++; 
 }else 
 break; 
 } 
 if(continueCount>=5){//判斷記錄數(shù)大于等于五,即表示此方獲勝 
 return true; 
 }else 
 continueCount=1; 
 // 
 for(int x=xIndex+1,y=yIndex-1;y>=0&&x<=COLS;x++,y--){//右下尋找 
 Color c=isBack ? Color.black : Color.white; 
 if(getChess(x,y,c)!=null){ 
 continueCount++; 
 }else 
 break; 
 } 
 for(int x=xIndex-1,y=yIndex+1;y<=ROWS&&x>=0;x--,y++){//左上尋找 
 Color c=isBack ? Color.black : Color.white; 
 if(getChess(x,y,c)!=null){ 
 continueCount++; 
 }else 
 break; 
 } 
 if(continueCount>=5){//判斷記錄數(shù)大于等于五,即表示此方獲勝 
 return true; 
 }else 
 continueCount=1; 
 // 
 for(int x=xIndex-1,y=yIndex-1;y>=0&&x>=0;x--,y--){//左下尋找 
 Color c=isBack ? Color.black : Color.white; 
 if(getChess(x,y,c)!=null){ 
 continueCount++; 
 }else 
 break; 
 } 
 for(int x=xIndex+1,y=yIndex+1;y<=ROWS&&x<=COLS;x++,y++){//右上尋找 
 Color c=isBack ? Color.black : Color.white; 
 if(getChess(x,y,c)!=null){ 
 continueCount++; 
 }else 
 break; 
 } 
 if(continueCount>=5){//判斷記錄數(shù)大于等于五,即表示此方獲勝 
 return true; 
 }else 
 continueCount=1; 
 return false; 
 }

3.7彈出相應(yīng)消息框(在鼠標(biāo)按壓函數(shù)內(nèi)部)

if(isWin()){ 
 String msg=String.format("恭喜,%s贏啦~", colorName); 
 JOptionPane.showMessageDialog(this, msg); 
 gameOver=true; 
 } 
 else if(chessCount==(COLS+1)*(ROWS+1))//平局 
 { 
 String msg=String.format("棋鼓相當(dāng),棒棒噠~"); 
 JOptionPane.showMessageDialog(this,msg); 
 gameOver=true; 
 }

3.8上面用到的一個判斷某點是否有棋子的函數(shù)

private boolean findChess(int x,int y){ 
 for(Point c:chessList){ 
 if(c!=null&&c.getX()==x&&c.getY()==y) 
 return true; 
 } 
 return false; 
 }

3.9因為該棋盤類實現(xiàn)了鼠標(biāo)監(jiān)聽接口MonseListener,所以要重寫該接口內(nèi)的所有方法,其它方法如下

@Override 
 public void mouseClicked(MouseEvent e) {//鼠標(biāo)按鍵在組件上單擊(按下并釋放)時調(diào)用 
 } 
 @Override 
 public void mouseReleased(MouseEvent e) {////鼠標(biāo)按鍵在組件上釋放時調(diào)用 
 } 
 @Override 
 public void mouseEntered(MouseEvent e) {//鼠標(biāo)進入組件時調(diào)用 
 } 
 @Override 
 public void mouseExited(MouseEvent e){//鼠標(biāo)離開組件時調(diào)用 
 }

四、運行結(jié)果

java怎么實現(xiàn)單機版五子棋游戲的教程

java怎么實現(xiàn)單機版五子棋游戲的教程

五、代碼匯總

該游戲總共建了三個類,一個是界面StartChessJFrame,一個是棋盤類ChessBoard,一個是棋子類Point

5.1StartChessJFrame類

package chess.lcc.com; 
import javax.swing.*; 
 
import java.awt.event.*; 
import java.awt.*; 
/* 
 * 五子棋的主框架,程序啟動類 
 */ 
public class StartChessJFrame extends JFrame { 
 private ChessBoard chessBoard;//對戰(zhàn)面板 
 private Panel toolbar;//工具條面板 
 private Button startButton;//設(shè)置開始按鈕 
 private Button backButton;//設(shè)置悔棋按鈕 
 private Button exitButton;//設(shè)置退出按鈕 
 
 
 public StartChessJFrame(){ 
 setTitle("單機版五子棋");//設(shè)置標(biāo)題 
 chessBoard=new ChessBoard();//初始化面板對象,創(chuàng)建和添加菜單 
 MyItemListener lis=new MyItemListener();//初始化按鈕事件監(jiān)聽器內(nèi)部類 
 toolbar=new Panel();//工具面板欄實例化 
 startButton=new Button("重新開始"); 
 backButton=new Button("悔棋"); 
 exitButton=new Button("退出");//三個按鈕初始化 
 toolbar.setLayout(new FlowLayout(FlowLayout.LEFT));//將工具面板按鈕用FlowLayout布局 
 toolbar.add(backButton); 
 toolbar.add(startButton); 
 toolbar.add(exitButton);//將三個按鈕添加到工具面板上 
 startButton.addActionListener(lis); 
 backButton.addActionListener(lis); 
 exitButton.addActionListener(lis);//將三個按鈕事件注冊監(jiān)聽事件 
 add(toolbar,BorderLayout.SOUTH);//將工具面板布局到界面南方也就是下面 
 add(chessBoard);//將面板對象添加到窗體上 
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//設(shè)置界面關(guān)閉事件 
 pack();//自適應(yīng)大小 
 } 
 private class MyItemListener implements ActionListener{ 
 public void actionPerformed(ActionEvent e) { 
 Object obj=e.getSource();//獲取事件源 
 if(obj==startButton){ 
 System.out.println("重新開始...");//重新開始 
 //JFiveFrame.this內(nèi)部類引用外部類 
 chessBoard.restartGame(); 
 }else if(obj==exitButton){ 
 System.exit(0);//結(jié)束應(yīng)用程序 
 }else if(obj==backButton){ 
 System.out.println("悔棋...");//悔棋 
 chessBoard.goback(); 
 } 
 } 
 } 
 public static void main(String[] args) { 
 StartChessJFrame f=new StartChessJFrame();//創(chuàng)建主框架 
 f.setVisible(true);//顯示主框架 
 } 
}

5.2ChessBoard類

package chess.lcc.com; 
 
import javax.swing.*; 
 
import java.awt.*; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import java.awt.event.MouseEvent; 
/*五子棋-棋盤類*/ 
public class ChessBoard extends JPanel implements MouseListener{ 
 public static int MARGIN=30;//邊距 
 public static int GRID_SPAN=35;//網(wǎng)格間距 
 public static int ROWS=15;//棋盤行數(shù) 
 public static int COLS=15;//棋盤列數(shù) 
 Point[] chessList=new Point[(ROWS+1)*(COLS+1)];//初始化每個數(shù)組元素為null 
 boolean isBack=true;//默認開始是黑棋先下 
 boolean gameOver=false;//游戲是否結(jié)束 
 int chessCount;//當(dāng)前棋盤的棋子個數(shù) 
 int xIndex,yIndex;//當(dāng)前剛下棋子的索引 
 public ChessBoard(){ 
 setBackground(Color.LIGHT_GRAY);//設(shè)置背景顏色為黃色 
 addMouseListener(this);//添加事件監(jiān)聽器 
 addMouseMotionListener(new MouseMotionListener() {//匿名內(nèi)部類 
 
 @Override 
 public void mouseMoved(MouseEvent e) { 
 int x1=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN; 
 int y1=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//將鼠標(biāo)單擊的坐標(biāo)位置轉(zhuǎn)化為網(wǎng)格索引 
 if(x1<0||x1>ROWS||y1<0||y1>COLS||gameOver||findChess(x1,y1)){//游戲已經(jīng)結(jié)束,不能下;落在棋盤外,不能下;x,y位置已經(jīng)有棋子存在,不能下 
 setCursor(new Cursor(Cursor.DEFAULT_CURSOR));//設(shè)置成默認形狀 
 }else{ 
 setCursor(new Cursor(Cursor.HAND_CURSOR));//設(shè)置成手型 
 } 
 } 
 
 @Override 
 public void mouseDragged(MouseEvent e) { 
 } 
 }); 
 } 
 /*繪制*/ 
 public void paintComponent(Graphics g){ 
 super.paintComponent(g);//畫棋盤 
 for(int i=0;i<=ROWS;i++){//畫橫線 
 g.drawLine(MARGIN, MARGIN+i*GRID_SPAN, MARGIN+COLS*GRID_SPAN, MARGIN+i*GRID_SPAN); 
 } 
 for(int i=0;i<=COLS;i++){//畫直線 
 g.drawLine(MARGIN+i*GRID_SPAN, MARGIN, MARGIN+i*GRID_SPAN,MARGIN+ROWS*GRID_SPAN); 
 } 
 /*畫棋子*/ 
 for(int i=0;i<chessCount;i++){ 
 int xPos=chessList[i].getX()*GRID_SPAN+MARGIN;//網(wǎng)格交叉的x坐標(biāo) 
 int yPos=chessList[i].getY()*GRID_SPAN+MARGIN;//網(wǎng)格交叉的y坐標(biāo) 
 g.setColor(chessList[i].getColor());//設(shè)置顏色 
 g.fillOval(xPos-Point.DIAMETER/2, yPos-Point.DIAMETER/2, Point.DIAMETER, Point.DIAMETER); 
 if(i==chessCount-1){ 
 g.setColor(Color.red);//標(biāo)記最后一個棋子為紅色 
 g.drawRect(xPos-Point.DIAMETER/2, yPos-Point.DIAMETER/2, Point.DIAMETER, Point.DIAMETER); 
 } 
 } 
 } 

 
 @Override 
 public void mousePressed(MouseEvent e) {//鼠標(biāo)按鍵在組件上按下時調(diào)用 
 if(gameOver)//游戲已經(jīng)結(jié)束,不能下 
 return ; 
 String colorName=isBack ? "黑棋" : "白棋"; 
 xIndex=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN; 
 yIndex=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//將鼠標(biāo)單擊的坐標(biāo)位置轉(zhuǎn)化為網(wǎng)格索引 
 if(xIndex<0||xIndex>ROWS||yIndex<0||yIndex>COLS)//棋子落在棋盤外,不能下 
 return ; 
 if(findChess(xIndex,yIndex))//x,y位置已經(jīng)有棋子存在,不能下 
 return ; 
 
 Point ch=new Point(xIndex,yIndex,isBack ? Color.black : Color.white); 
 chessList[chessCount++]=ch; 
 repaint();//通知系統(tǒng)重新繪制 
 if(isWin()){ 
 String msg=String.format("恭喜,%s贏啦~", colorName); 
 JOptionPane.showMessageDialog(this, msg); 
 gameOver=true; 
 } 
 else if(chessCount==(COLS+1)*(ROWS+1)) 
 { 
 String msg=String.format("棋鼓相當(dāng),棒棒噠~"); 
 JOptionPane.showMessageDialog(this,msg); 
 gameOver=true; 
 } 
 isBack=!isBack; 
 } 
 
 @Override 
 public void mouseClicked(MouseEvent e) {//鼠標(biāo)按鍵在組件上單擊(按下并釋放)時調(diào)用 
 } 
 
 @Override 
 public void mouseReleased(MouseEvent e) {////鼠標(biāo)按鍵在組件上釋放時調(diào)用 
 } 
 
 @Override 
 public void mouseEntered(MouseEvent e) {//鼠標(biāo)進入組件時調(diào)用 
 } 
 
 @Override 
 public void mouseExited(MouseEvent e){//鼠標(biāo)離開組件時調(diào)用 
 } 
 
 private boolean findChess(int x,int y){ 
 for(Point c:chessList){ 
 if(c!=null&&c.getX()==x&&c.getY()==y) 
 return true; 
 } 
 return false; 
 } 
 
 /*判斷那方贏*/ 
 private boolean isWin(){ 
 int continueCount=1;//連續(xù)棋子的個數(shù) 
 for(int x=xIndex-1;x>=0;x--){//橫向向左尋找 
 Color c=isBack ? Color.black : Color.white; 
 if(getChess(x,yIndex,c)!=null){ 
 continueCount++; 
 }else 
 break; 
 } 
 for(int x=xIndex+1;x<=ROWS;x++){//橫向向右尋找 
 Color c=isBack ? Color.black : Color.white; 
 if(getChess(x,yIndex,c)!=null){ 
 continueCount++; 
 }else 
 break; 
 } 
 if(continueCount>=5){//判斷記錄數(shù)大于等于五,即表示此方獲勝 
 return true; 
 }else 
 continueCount=1; 
 // 
 for(int y=yIndex-1;y>=0;y--){//縱向向上尋找 
 Color c=isBack ? Color.black : Color.white; 
 if(getChess(xIndex,y,c)!=null){ 
 continueCount++; 
 }else 
 break; 
 } 
 for(int y=yIndex+1;y<=ROWS;y++){//縱向向下尋找 
 Color c=isBack ? Color.black : Color.white; 
 if(getChess(xIndex,y,c)!=null){ 
 continueCount++; 
 }else 
 break; 
 } 
 if(continueCount>=5){//判斷記錄數(shù)大于等于五,即表示此方獲勝 
 return true; 
 }else 
 continueCount=1; 
 // 
 for(int x=xIndex+1,y=yIndex-1;y>=0&&x<=COLS;x++,y--){//右下尋找 
 Color c=isBack ? Color.black : Color.white; 
 if(getChess(x,y,c)!=null){ 
 continueCount++; 
 }else 
 break; 
 } 
 for(int x=xIndex-1,y=yIndex+1;y<=ROWS&&x>=0;x--,y++){//左上尋找 
 Color c=isBack ? Color.black : Color.white; 
 if(getChess(x,y,c)!=null){ 
 continueCount++; 
 }else 
 break; 
 } 
 if(continueCount>=5){//判斷記錄數(shù)大于等于五,即表示此方獲勝 
 return true; 
 }else 
 continueCount=1; 
 // 
 for(int x=xIndex-1,y=yIndex-1;y>=0&&x>=0;x--,y--){//左下尋找 
 Color c=isBack ? Color.black : Color.white; 
 if(getChess(x,y,c)!=null){ 
 continueCount++; 
 }else 
 break; 
 } 
 for(int x=xIndex+1,y=yIndex+1;y<=ROWS&&x<=COLS;x++,y++){//右上尋找 
 Color c=isBack ? Color.black : Color.white; 
 if(getChess(x,y,c)!=null){ 
 continueCount++; 
 }else 
 break; 
 } 
 if(continueCount>=5){//判斷記錄數(shù)大于等于五,即表示此方獲勝 
 return true; 
 }else 
 continueCount=1; 
 return false; 
 } 
 private Point getChess(int xIndex,int yIndex,Color color){ 
 for(Point c:chessList){ 
 if(c!=null&&c.getX()==xIndex&&c.getY()==yIndex&&c.getColor()==color) 
 return c; 
 } 
 return null; 
 } 
 public void restartGame(){//清除棋子 
 for(int i=0;i<chessList.length;i++) 
 chessList[i]=null; 
 /*恢復(fù)游戲相關(guān)的變量值*/ 
 isBack=true; 
 gameOver=false;//游戲是否結(jié)束 
 chessCount=0;//當(dāng)前棋盤的棋子個數(shù) 
 repaint(); 
 } 
 public void goback(){ 
 if(chessCount==0) 
 return ; 
 chessList[chessCount-1]=null; 
 chessCount--; 
 if(chessCount>0){ 
 xIndex=chessList[chessCount-1].getX(); 
 yIndex=chessList[chessCount-1].getY(); 
 } 
 isBack=!isBack; 
 repaint(); 
 } 
 //Dimension:矩形 
 public Dimension getPreferredSize(){ 
 return new Dimension(MARGIN*2+GRID_SPAN*COLS,MARGIN*2+GRID_SPAN*ROWS); 
 } 
 
}

5.3Point類

package chess.lcc.com; 
 
import java.awt.*; 
 
public class Point { 
 private int x;//棋子在棋盤中的x索引值 
 private int y;//棋子在棋盤中的y索引值 
 private Color color;//顏色 
 public static int DIAMETER=30;//直徑 
 public Point(int x,int y,Color color){ 
 this.x=x; 
 this.y=y; 
 this.color=color; 
 } 
 //得到棋子在棋盤中的x索引值 
 public int getX(){ 
 return x; 
 } 
 //得到棋子在棋盤中的y索引值 
 public int getY(){ 
 return y; 
 } 
 //得到棋子顏色 
 public Color getColor(){ 
 return color; 
 } 
}

到此,相信大家對“java怎么實現(xiàn)單機版五子棋游戲的教程”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI