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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章