Java實現一個簡單的五子棋遊戲,JAVA,五子棋,黑框

五子棋遊戲規則:

  • 五子棋分黑棋、白棋,兩人輪流下棋,任意方向滿五個即可勝利。
  • 下棋操作:輸入棋子的座標進行下棋

注意:已經有棋子的地方不能進行二次下棋

遊戲思路:

  1.     初始化棋盤 initBoard()
  2.     打印棋盤   printBoard()
  3.     開始遊戲   startGame()
  4.     下棋(黑白) putDownChess()
  5.     判斷輸贏   isGameOver()

首先,將board數據定義爲全局變量,即任何函數都可以訪問的變量,因爲遊戲思路中所展示的的方法都會使用數據board,每次將board當做參數傳遞給函數的時候會比較麻煩,所以將board數據定義爲全局變量。定義爲全局變量的數據還有,黑白棋以及輸入座標。下面代碼中就會涉及。

注:全局變量定義在函數的外面,類的裏面,必須以 public static 開頭

第一步:初始化棋盤

public static void initBoard(){
        board=new String[15][15];//創建的棋盤爲15行,15列
        for(int i=0;i<board.length;i++){
            for(int j=0;j<board[i].length;j++){
                board[i][j]="+";
            }
        }
    }

 

棋盤的表示:創建一個String的二維數組來表示棋盤,數組中存放 字符 " + "

第二步:打印棋盤

public static void printBoard(){//打印棋盤
        for(int i = 0;i<board.length;i++){
            for(int j=0;j<board[i].length;j++){
                System.out.print(board[i][j] + " ");
            }
            System.out.println();
        }
    }

    打印棋盤展示:

第三步:開始遊戲

public static void  startGame(){//開始遊戲
        System.out.println("遊戲開始");
        while(true){
            if(player % 2==0){
                System.out.println("請黑方下棋");
                if(!putDownChess(BLACK_CHESS)){
                    continue;
                }
            }else{
                System.out.println("請白方下棋");
                if(!putDownChess(WHITE_CHESS)){
                    continue;
                }         
            }
            if(isGameOver()){
                break;
            }
                player++;
        }
    }

第四步:下棋

public static boolean putDownChess(String chess){
        int x=scanner.nextInt()-1;
        int y=scanner.nextInt()-1;
        if(!board[x][y].equals("+")){
            System.out.println("此處已有棋子,請重新下棋");
            return false;
        }
        board[x][y]=chess;
        printBoard();//下一次棋打印一次棋盤
        return true;
    } 

第五步:判斷輸贏

public static boolean isGameOver(){
        for(int i = 0;i<board.length;i++){
            for(int j= 0;j<board[i].length;j++){
                if(!board[i][j].equals("+")){
                    if(j<board[i].length-4){//向右
                    boolean flag=true;
                    for(int c = j+1;c<j+5;c++){
                        if(board[i][j]!= board[i][c]){
                           flag=false;
                            break; 
                        }
                    }
                    if(flag){
                        System.out.println("遊戲結束");
                        return true;
                    }
                }
                if(i<board.length-4){//向下
                    boolean flag=true;
                    for(int c = i+1;c<i+5;c++){
                        if(board[i][j]!= board[c][j]){
                           flag=false;
                            break; 
                        }
                    }
                    if(flag){
                        System.out.println("遊戲結束");
                        return true;
                    }
                }
                if(j<board[i].length-4 && i<board.length-4){//向右下
                    boolean flag=true;
                    for(int c = j+1,d = i+1;c<j+5;c++,d++){
                        if(board[i][j]!= board[d][c]){
                           flag=false;
                            break; 
                        }
                    }
                    if(flag){
                        System.out.println("遊戲結束");
                        return true;
                    }
                }
                if(i>3 && j<board.length-4){//向右上
                    boolean flag=true;
                    for(int c = i-1,d = j+1;d<j+5;c--,d++){
                        if(board[i][j]!= board[c][d]){
                           flag=false;
                            break; 
                        }
                    }
                    if(flag){
                        System.out.println("遊戲結束");
                        return true;
                    }
                }
            }
        }
                }
        return false;
    }

 

參考上圖,就可以很輕鬆的寫出判斷遊戲輸贏的邏輯啦~上述代碼中,主要應用了二維數組中連續相等問題的思路。其中一共分了4個方向,只要任意一個方向有5個棋子連成,遊戲就結束啦。之所以分4個方向是因爲,其他四個方向和圖中四個方向是等效的,例如右下就等於左上,以此類推。

主函數代碼展示:

    public static String[][] board;//定義全局變量棋盤
    public static String BLACK_CHESS="O";   //黑棋
    public static String WHITE_CHESS="X";   //白棋  
    public static Scanner scanner=new Scanner(System.in);//輸入棋子座標  
    public static int player = 0;//判斷棋子顏色
    public static void main(String[] args){
        initBoard();
        printBoard();
        startGame();
    }

可以發現主函數的代碼量十分簡潔,這就是定義方法的優勢。

代碼優化:

  • 遊戲結束時,加上判斷棋子顏色,如:遊戲結束,黑棋獲勝。實現此功能新增一個方法調用即可。方法代碼展示如下:
public static void Colur(){
        if(player % 2==0){
            System.out.println("遊戲結束,黑棋獲勝");
        }else{
            System.out.println("遊戲結束,白棋獲勝");
        }
    }

結果展示:

  • 爲棋盤加上行序和列序,即對printBoard()方法進行了優化,代碼展示如下:
public static void printBoard(){//打印棋盤
        System.out.print("   ");//爲了讓列標與棋盤對齊,在數字1前加入適當空格即可
        for(int k = 1;k<=15;k++){//打印列標
            System.out.printf("%-3d",k);
        }
        System.out.println();
        for(int i = 0;i<board.length;i++){
            System.out.printf("%2d ",i+1);//打印行標
            for(int j=0;j<board[i].length;j++){
                System.out.print(board[i][j] + "  ");
            }
            System.out.println();
        }
    }

棋盤展示:

其他優化,再做補充~

 

發佈了17 篇原創文章 · 獲贊 25 · 訪問量 3227
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章