中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

java怎么實現單機版五子棋游戲的教程

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

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

Java是什么

Java是一門面向對象編程語言,可以編寫桌面應用程序、Web應用程序、分布式系統和嵌入式系統應用程序。


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

一、該游戲需要實現

1、設計主框架,界面。

2、利用ActionListener接口實現按鈕事件的監聽。

3、重新開始功能的實現。

4、悔棋功能的實現。

5、退出功能的實現。

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

7、利用MouseListener接口實現事件監聽,并實現接口里的所有方法。

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

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

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

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

12、勝負已定的時候,能夠彈出相應的信息。

二、功能代碼實現

2.1進入游戲

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

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

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

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

public StartChessJFrame(){ 
 setTitle("單機版五子棋");//設置標題 
 chessBoard=new ChessBoard();//初始化面板對象,創建和添加菜單 
 MyItemListener lis=new MyItemListener();//初始化按鈕事件監聽器內部類 
 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);//將三個按鈕事件注冊監聽事件 
 add(toolbar,BorderLayout.SOUTH);//將工具面板布局到界面南方也就是下面 
 add(chessBoard);//將面板對象添加到窗體上 
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//設置界面關閉事件 
 pack();//自適應大小 
 }

2.4按鈕的實現與監聽(構造方法內部)

MyItemListener lis=new MyItemListener();//初始化按鈕事件監聽器內部類 
 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);//將三個按鈕事件注冊監聽事件

2.5按鈕事件的監聽

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

2.6重新開始按鈕的功能實現

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

2.7悔棋按鈕的功能實現

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當棋盤根據需要變大或變小時窗口應隨之發生改變

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

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; 
 } 
}

三、功能部分代碼實現

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

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

3.2棋盤對象的構造方法

public ChessBoard(){ 
 setBackground(Color.LIGHT_GRAY);//設置背景顏色為灰色 
 addMouseListener(this);//添加事件監聽器 
 addMouseMotionListener(new MouseMotionListener() {//匿名內部類 
 
 @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;//將鼠標單擊的坐標位置轉化為網格索引 
 if(x1<0||x1>ROWS||y1<0||y1>COLS||gameOver||findChess(x1,y1)){//游戲已經結束,不能下;落在棋盤外,不能下;x,y位置已經有棋子存在,不能下 
 setCursor(new Cursor(Cursor.DEFAULT_CURSOR));//設置成默認形狀 
 }else{ 
 setCursor(new Cursor(Cursor.HAND_CURSOR));//設置成手型 
 } 
 } 
 @Override 
 public void mouseDragged(MouseEvent e) { 
 } 
 }); 
 }

3.3設置鼠標監聽器,變小手(在構造方法內部)

addMouseMotionListener(new MouseMotionListener() {//匿名內部類 
 
 @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;//將鼠標單擊的坐標位置轉化為網格索引 
 if(x1<0||x1>ROWS||y1<0||y1>COLS||gameOver||findChess(x1,y1)){//游戲已經結束,不能下;落在棋盤外,不能下;x,y位置已經有棋子存在,不能下 
 setCursor(new Cursor(Cursor.DEFAULT_CURSOR));//設置成默認形狀 
 }else{ 
 setCursor(new Cursor(Cursor.HAND_CURSOR));//設置成手型 
 } 
 } 
 @Override 
 public void mouseDragged(MouseEvent e) { 
 } 
 });

3.4點擊棋盤時的鼠標按壓事件

public void mousePressed(MouseEvent e) {//鼠標按鍵在組件上按下時調用 
 if(gameOver)//游戲已經結束,不能下 
 return ; 
 String colorName=isBack ? "黑棋" : "白棋"; 
 xIndex=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN; 
 yIndex=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//將鼠標單擊的坐標位置轉化為網格索引 
 if(xIndex<0||xIndex>ROWS||yIndex<0||yIndex>COLS)//棋子落在棋盤外,不能下 
 return ; 
 if(findChess(xIndex,yIndex))//x,y位置已經有棋子存在,不能下 
 return ; 
 Point ch=new Point(xIndex,yIndex,isBack ? Color.black : Color.white); 
 chessList[chessCount++]=ch; 
 repaint();//通知系統重新繪制 
 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("棋鼓相當,棒棒噠~"); 
 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;//網格交叉的x坐標 
 int yPos=chessList[i].getY()*GRID_SPAN+MARGIN;//網格交叉的y坐標 
 g.setColor(chessList[i].getColor());//設置顏色 
 g.fillOval(xPos-Point.DIAMETER/2, yPos-Point.DIAMETER/2, Point.DIAMETER, Point.DIAMETER); 
 if(i==chessCount-1){ 
 g.setColor(Color.red);//標記最后一個棋子為紅色 
 g.drawRect(xPos-Point.DIAMETER/2, yPos-Point.DIAMETER/2, Point.DIAMETER, Point.DIAMETER); 
 } 
 } 
 }

3.6判斷輸贏

/*判斷哪方贏*/ 
 private boolean isWin(){ 
 int continueCount=1;//連續棋子的個數 
 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){//判斷記錄數大于等于五,即表示此方獲勝 
 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){//判斷記錄數大于等于五,即表示此方獲勝 
 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){//判斷記錄數大于等于五,即表示此方獲勝 
 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){//判斷記錄數大于等于五,即表示此方獲勝 
 return true; 
 }else 
 continueCount=1; 
 return false; 
 }

3.7彈出相應消息框(在鼠標按壓函數內部)

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("棋鼓相當,棒棒噠~"); 
 JOptionPane.showMessageDialog(this,msg); 
 gameOver=true; 
 }

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

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因為該棋盤類實現了鼠標監聽接口MonseListener,所以要重寫該接口內的所有方法,其它方法如下

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

四、運行結果

java怎么實現單機版五子棋游戲的教程

java怎么實現單機版五子棋游戲的教程

五、代碼匯總

該游戲總共建了三個類,一個是界面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;//對戰面板 
 private Panel toolbar;//工具條面板 
 private Button startButton;//設置開始按鈕 
 private Button backButton;//設置悔棋按鈕 
 private Button exitButton;//設置退出按鈕 
 
 
 public StartChessJFrame(){ 
 setTitle("單機版五子棋");//設置標題 
 chessBoard=new ChessBoard();//初始化面板對象,創建和添加菜單 
 MyItemListener lis=new MyItemListener();//初始化按鈕事件監聽器內部類 
 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);//將三個按鈕事件注冊監聽事件 
 add(toolbar,BorderLayout.SOUTH);//將工具面板布局到界面南方也就是下面 
 add(chessBoard);//將面板對象添加到窗體上 
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//設置界面關閉事件 
 pack();//自適應大小 
 } 
 private class MyItemListener implements ActionListener{ 
 public void actionPerformed(ActionEvent e) { 
 Object obj=e.getSource();//獲取事件源 
 if(obj==startButton){ 
 System.out.println("重新開始...");//重新開始 
 //JFiveFrame.this內部類引用外部類 
 chessBoard.restartGame(); 
 }else if(obj==exitButton){ 
 System.exit(0);//結束應用程序 
 }else if(obj==backButton){ 
 System.out.println("悔棋...");//悔棋 
 chessBoard.goback(); 
 } 
 } 
 } 
 public static void main(String[] args) { 
 StartChessJFrame f=new StartChessJFrame();//創建主框架 
 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;//網格間距 
 public static int ROWS=15;//棋盤行數 
 public static int COLS=15;//棋盤列數 
 Point[] chessList=new Point[(ROWS+1)*(COLS+1)];//初始化每個數組元素為null 
 boolean isBack=true;//默認開始是黑棋先下 
 boolean gameOver=false;//游戲是否結束 
 int chessCount;//當前棋盤的棋子個數 
 int xIndex,yIndex;//當前剛下棋子的索引 
 public ChessBoard(){ 
 setBackground(Color.LIGHT_GRAY);//設置背景顏色為黃色 
 addMouseListener(this);//添加事件監聽器 
 addMouseMotionListener(new MouseMotionListener() {//匿名內部類 
 
 @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;//將鼠標單擊的坐標位置轉化為網格索引 
 if(x1<0||x1>ROWS||y1<0||y1>COLS||gameOver||findChess(x1,y1)){//游戲已經結束,不能下;落在棋盤外,不能下;x,y位置已經有棋子存在,不能下 
 setCursor(new Cursor(Cursor.DEFAULT_CURSOR));//設置成默認形狀 
 }else{ 
 setCursor(new Cursor(Cursor.HAND_CURSOR));//設置成手型 
 } 
 } 
 
 @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;//網格交叉的x坐標 
 int yPos=chessList[i].getY()*GRID_SPAN+MARGIN;//網格交叉的y坐標 
 g.setColor(chessList[i].getColor());//設置顏色 
 g.fillOval(xPos-Point.DIAMETER/2, yPos-Point.DIAMETER/2, Point.DIAMETER, Point.DIAMETER); 
 if(i==chessCount-1){ 
 g.setColor(Color.red);//標記最后一個棋子為紅色 
 g.drawRect(xPos-Point.DIAMETER/2, yPos-Point.DIAMETER/2, Point.DIAMETER, Point.DIAMETER); 
 } 
 } 
 } 

 
 @Override 
 public void mousePressed(MouseEvent e) {//鼠標按鍵在組件上按下時調用 
 if(gameOver)//游戲已經結束,不能下 
 return ; 
 String colorName=isBack ? "黑棋" : "白棋"; 
 xIndex=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN; 
 yIndex=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//將鼠標單擊的坐標位置轉化為網格索引 
 if(xIndex<0||xIndex>ROWS||yIndex<0||yIndex>COLS)//棋子落在棋盤外,不能下 
 return ; 
 if(findChess(xIndex,yIndex))//x,y位置已經有棋子存在,不能下 
 return ; 
 
 Point ch=new Point(xIndex,yIndex,isBack ? Color.black : Color.white); 
 chessList[chessCount++]=ch; 
 repaint();//通知系統重新繪制 
 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("棋鼓相當,棒棒噠~"); 
 JOptionPane.showMessageDialog(this,msg); 
 gameOver=true; 
 } 
 isBack=!isBack; 
 } 
 
 @Override 
 public void mouseClicked(MouseEvent e) {//鼠標按鍵在組件上單擊(按下并釋放)時調用 
 } 
 
 @Override 
 public void mouseReleased(MouseEvent e) {////鼠標按鍵在組件上釋放時調用 
 } 
 
 @Override 
 public void mouseEntered(MouseEvent e) {//鼠標進入組件時調用 
 } 
 
 @Override 
 public void mouseExited(MouseEvent e){//鼠標離開組件時調用 
 } 
 
 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;//連續棋子的個數 
 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){//判斷記錄數大于等于五,即表示此方獲勝 
 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){//判斷記錄數大于等于五,即表示此方獲勝 
 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){//判斷記錄數大于等于五,即表示此方獲勝 
 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){//判斷記錄數大于等于五,即表示此方獲勝 
 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; 
 /*恢復游戲相關的變量值*/ 
 isBack=true; 
 gameOver=false;//游戲是否結束 
 chessCount=0;//當前棋盤的棋子個數 
 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怎么實現單機版五子棋游戲的教程”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

郎溪县| 丰原市| 扶风县| 特克斯县| 武胜县| 尉氏县| 江城| 海林市| 花莲市| 江西省| 高雄县| 白城市| 商河县| 惠东县| 古浪县| 大名县| 东辽县| 岳阳县| 岳阳市| 合川市| 合水县| 彝良县| 射洪县| 老河口市| 营山县| 崇仁县| 庆安县| 靖宇县| 东乡| 平南县| 嵊州市| 崇文区| 施甸县| 宿州市| 仁布县| 如皋市| 乌什县| 大石桥市| 会理县| 石林| 军事|