Java簡單實現無介面五子棋

北渺發表於2020-11-09

專案介紹:

本次設計是基於知識點Java類和物件以及陣列開發的一個小型五子棋遊戲程式。遊戲開始時,選擇黑棋、白棋開局,將一枚棋子落在棋盤一座標上,然後輪番落子,如此輪流下子,直到某一方首先在棋盤的豎、橫或兩斜四方向上的五子連成線,則該方該局獲勝。

專案實現思路:

  1. 棋盤設計為10*10格,棋盤型別Chess[][] 二維陣列,所含屬性String chessType; 棋盤首先chessType值是”➕”。
  2. 初始化二維陣列
  3. 玩家選擇黑白圈後,開始下棋。輸入要下棋子的行列座標,黑白棋子輪流落子,當一方連成五子或下滿棋盤時,遊戲結束(連成五子的一方獲勝,下滿棋盤為和棋)。
  4. 每一次落子成功後,馬上判斷以該位置為中心的八個方向:上、下、左、右、左上、左下、右上、右下是否有相同顏色的棋子連成五子,如果連成五子,則遊戲結束,輸出相應的資訊。
  5. 當遊戲一方勝利後顯示勝利資訊。從程式表面看,這是一個二維平面圖,所以資料用二維陣列來表示,陣列兩個下標可以表示棋盤上的位置,陣列元素的值代表棋格上的狀態,共有三種情況,分別是,⭕代表白棋,●代表黑棋,➕代表格子。

原始碼

1.棋子

/**
 * @author hudongsheng
 * @date 2020/10/29 - 9:28
 */
public class ChessType {
    private String chessType;
    private int x;
    private int y;

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }


    public ChessType() {

    }

    public String getChessType() {
        return chessType;
    }

    public void setChessType(String chessType) {
        this.chessType = chessType;
    }
}

2.下棋

/**
 * @author hudongsheng
 * @date 2020/10/29 - 9:27
 */
public class Gobang {
    private int size = 1;
    private ChessType[][] chessTypes;
    private int row;
    private int colum;
    private int x;
    private int y;


    //建立一個棋盤
    public Gobang(int row,int colum){
        this.row = row;
        this.colum = colum;
        chessTypes = new ChessType[row][colum];
    }

    //初始化棋盤
    public void initChessType(){

        for(int i = 0; i< chessTypes.length; i++){
            for (int j = 0; j< chessTypes[i].length; j++){
                chessTypes[i][j] = new ChessType();
                chessTypes[i][j].setChessType("➕");
            }
        }
    }

    //下白棋
    public void setWhiteChess(int x,int y){
        chessTypes[x][y].setChessType("⭕");
    }

    //下黑棋
    public void setBlackChess(int x,int y){
        chessTypes[x][y].setChessType("●");
    }

   //判斷是否勝利
        public boolean checkWin(int i,int j) {
            // TODO Auto-generated method stub
            boolean flag = false;
            //判斷縱向是否有五個棋子是相同的顏色
            int count1 = 1;//相同顏色棋子的個數
            String color = chessTypes[i][j].getChessType(); //剛下的棋子的顏色
            int a = 1;  //棋子索引的增量
            while((i+a)<row && color == chessTypes[i+a][j].getChessType()){
                count1++;
                a++;
            }
            a = 1;
            while((i-a)>=0 && color == chessTypes[i-a][j].getChessType()){
                count1++;
                a++;
            }
            if(count1 >= 5){
                flag = true;
            }

            //判斷縱向是否有五個棋子是相同的顏色
            int count2 = 1;
            a = 1;
            while((j+a)<colum && color == chessTypes[i][j+a].getChessType()){
                count2++;
                a++;
            }
            a = 1;
            while((j-a)>=0 && color == chessTypes[i][j-a].getChessType()){
                count2++;
                a++;
            }
            if(count2 >= 5){
                flag = true;
            }

            //右上    左下 是否有五個棋子是相同的顏色
            int count3 = 1;
            a = 1;
            while((i+a)<row && (j-a)>=0 && color == chessTypes[i+a][j-a].getChessType()){
                count3++;
                a++;
            }
            a = 1;
            while((i-a)>=0 && (j+a)<colum && color == chessTypes[i-a][j+a].getChessType()){
                count3++;
                a++;
            }
            if(count3 >= 5){
                flag = true;
            }

            //左上  右下  是否有五個棋子是相同的顏色
            int count4 = 1;
            a = 1;
            while((i-a)>0 && (j-a)>=0 && color == chessTypes[i-a][j-a].getChessType()){
                count4++;
                a++;
            }
            a = 1;
            while((i+a)<row && (j+a)<colum && color == chessTypes[i+a][j+a].getChessType()){
                count4++;
                a++;
            }
            if(count4 >= 5){
                flag = true;
            }
            return flag;
        }



        //落子後列印棋盤
    public void print(){
        for(int i = 0; i< chessTypes.length; i++){
            for (int j = 0; j< chessTypes[i].length; j++){
                System.out.print(chessTypes[i][j].getChessType());
            }
            System.out.println();
        }
    }

}

3.測試

**
 * @author hudongsheng
 * @date 2020/10/29 - 9:27
 */
public class Test {
    public static void main(String[] args) {
        boolean flag = true;
        int x;
        int y;

        Gobang gobang = new Gobang(10,10);
        Scanner scanner = new Scanner(System.in);

        gobang.initChessType();
        //下棋

        System.out.println("黑棋執先");
        while (true){
            gobang.print();
            System.out.println("請輸入下黑棋的座標:");
            x = scanner.nextInt();
            y = scanner.nextInt();
            gobang.setBlackChess(x,y);
            if(gobang.checkWin(x,y)){
                gobang.print();
                System.out.println("黑棋勝!");
                break;
            }

            gobang.print();
            System.out.println("請輸入下白棋的座標:");
            x = scanner.nextInt();
            y = scanner.nextInt();
            gobang.setWhiteChess(x,y);

            if(gobang.checkWin(x,y)){
                gobang.print();
                System.out.println("白棋勝!");
                break;
            }

        }
    }
}

相關文章