五子棋小游戏

开发一个简单的五子棋小游戏

落子由双方轮流输入;能够随时暂停,保存当前棋盘数据;能够不由程序自主判断胜负

程序实现

棋盘创建

我们规定:11*11棋盘 0:没有棋子 1:黑棋 2:白棋

int[][] board=new int[11][11];
System.out.println("1:黑棋 2:白棋 其余数字将暂停存盘");

落子

落子需要定位+棋子颜色,即需要接受用户输入三个数:行、列、子色

String[] chess=sc.nextLine().split(" ");

实现接收三个输入

方便用户识别

由于数组创建时行列以0开始,下棋时可能会搞混导致下错位置,于是我们将行列数-1方便用户判断落子位置

int chess1=Integer.parseInt(chess[0]);
int chess2=Integer.parseInt(chess[1]);
int chess3=Integer.parseInt(chess[2]);
board[chess1-1][chess2-1]=chess3;

暂停存盘

用户有事离开时可以选择暂停并将当前棋盘数据存下来
输入大于2的数字即可暂停存盘

存盘功能实现

由于五子棋的特性导致创建棋盘时无子处有很多的重复数据,因此我们可以使用稀疏数组将其减量保存下来

public static int[][] save(int[][] board){
        int sum=0;
        for (int i = 0; i < 11; i++) {
            for(int j=0;j<11;j++){
                if(board[i][j]!=0){
                    sum++;
                }
            }
        }
        //创建稀疏数组
        int[][] save=new int[sum+1][3];
        save[0][0]=11;
        save[0][1]=11;
        save[0][2]=sum;
        System.out.println("棋子个数为"+sum);
        //将棋子位置存入稀疏数组实现存盘功能
        int countchess=0;
        for(int i=0;i<11;i++)
        {
            for(int j=0;j<11;j++)
            {
                if(board[i][j]!=0)
                {
                    countchess++;
                    save[countchess][0]=i+1;
                    save[countchess][1]=j+1;
                    save[countchess][2]=board[i][j];
                }
            }
        }
        return save;
    }

限于篇幅不将稀疏数组原理显示,可移步博主另一篇博客@稀疏数组的使用

读盘功能的实现

程序中断后用户想从之前暂停处继续,那么就将稀疏数组保存的存盘数据复现即可

public static int[][] load(int[][] save){
        int[][] load=new int[save[0][0]][save[0][1]];
        for(int i=1;i<save.length;i++) {
            load[save[i][0]-1][save[i][1]-1]=save[i][2];
        }
        for(int i=0;i<11;i++)
        {
            for(int j=0;j<11;j++)
            {
                System.out.print(load[i][j]+"\t");
                if(j==10){
                    System.out.println();
                }
            }
        }
        return load;
    }

获胜判断

在用户落子后系统会自动进行判断当前棋盘有没有决出胜负

public static void win(int i){
        switch(i){
            case 1:
                System.out.println("游戏结束,黑棋获胜!");
                break;
            case 2:
                System.out.println("游戏结束,白棋获胜!");
                break;
        }

    }

    // ========== 新增:判断五子棋赢家的核心方法(完全不影响原有代码) ==========
    /**
     * 检测11x11棋盘是否有赢家
     * @param board 五子棋棋盘数组(0空、1黑、2白)
     * @return 1=黑棋胜,2=白棋胜,0=未分胜负
     */
    public static int checkWinner(int[][] board) {
        // 遍历整个棋盘的每个位置
        for (int row = 0; row < 11; row++) {
            for (int col = 0; col < 11; col++) {
                int currentChess = board[row][col];
                if (currentChess == 0) { // 无棋子则跳过
                    continue;
                }

                // 定义4个检测方向:横向、纵向、正斜线(左上→右下)、反斜线(右上→左下)
                int[][] directions = {{0, 1}, {1, 0}, {1, 1}, {1, -1}};
                for (int[] dir : directions) {
                    int continuousCount = 1; // 当前棋子本身算1个

                    // 正向统计(如横向向右、纵向向下)
                    int r = row + dir[0];
                    int c = col + dir[1];
                    while (r >= 0 && r < 11 && c >= 0 && c < 11 && board[r][c] == currentChess) {
                        continuousCount++;
                        r += dir[0];
                        c += dir[1];
                    }

                    // 反向统计(如横向向左、纵向向上)
                    r = row - dir[0];
                    c = col - dir[1];
                    while (r >= 0 && r < 11 && c >= 0 && c < 11 && board[r][c] == currentChess) {
                        continuousCount++;
                        r -= dir[0];
                        c -= dir[1];
                    }

                    // 连续5个及以上相同棋子,判定获胜
                    if (continuousCount >= 5) {
                        return currentChess;
                    }
                }
            }
        }
        return 0; // 未分胜负
    }

此功能为该项目重难点,(待编)

源码放出

至此,一个简单的五子棋小游戏以开发完毕,稍后学习前端后可能会为这个小游戏增加界面,未完待续
主程序

package gomoku;
import java.util.Scanner;

import static gomoku.Pause.*;

public class Gomoku {
    static void main() {
        Scanner sc=new Scanner(System.in);
        //创建一个11*11棋盘 0:没有棋子 1:黑棋 2:白棋
        int[][] board=new int[11][11];
        System.out.println("1:黑棋 2:白棋 其余数字将暂停存盘");
        boolean flag=true;
        //接受用户输入的黑白棋
        while(flag)
        {
            //检测棋子位置
            System.out.println("请输入棋子(行 列 棋子颜色)");
            String[] chess=sc.nextLine().split(" ");
            int chess1=Integer.parseInt(chess[0]);
            int chess2=Integer.parseInt(chess[1]);
            int chess3=Integer.parseInt(chess[2]);
            if(chess3<3){
                board[chess1-1][chess2-1]=chess3;
            }else {
                System.out.println("用户暂停...");
                break;//设置暂停条件
            }
            //输出当前棋盘
            for(int i=0;i<11;i++)
            {
                for(int j=0;j<11;j++)
                {
                    System.out.print(board[i][j]+"\t");
                    if(j==10){
                        System.out.println();
                    }
                }
            }
            //判断当前是否获胜
            int winner = checkWinner(board); // 调用Pause类的checkWinner方法
            if (winner != 0) {
                win(winner); // 调用你原有win方法输出结果
                flag = false; // 获胜后结束游戏循环
            }
        }
        sc.close();
        int[][] save=save(board);
        //遍历棋盘获得非零(棋子)个数

        //输出稀疏数组
        /*
        for(int i=0;i<save.length;i++)
        {
            System.out.println(save[i][0]+"\t"+
                    save[i][1]+"\t"+
                    save[i][2]+"\t");
        }

         */

        //将稀疏数组打印为原本的数组

        int[][] originalboard=load(save);
        //endLine
    }
}

方法类

package gomoku;

public class Pause {
    // 存盘功能实现
    public static int[][] save(int[][] board){
        int sum=0;
        for (int i = 0; i < 11; i++) {
            for(int j=0;j<11;j++){
                if(board[i][j]!=0){
                    sum++;
                }
            }
        }
        //创建稀疏数组
        int[][] save=new int[sum+1][3];
        save[0][0]=11;
        save[0][1]=11;
        save[0][2]=sum;
        System.out.println("棋子个数为"+sum);
        //将棋子位置存入稀疏数组实现存盘功能
        int countchess=0;
        for(int i=0;i<11;i++)
        {
            for(int j=0;j<11;j++)
            {
                if(board[i][j]!=0)
                {
                    countchess++;
                    save[countchess][0]=i+1;
                    save[countchess][1]=j+1;
                    save[countchess][2]=board[i][j];
                }
            }
        }
        return save;
    }

    //读盘功能实现
    public static int[][] load(int[][] save){
        int[][] load=new int[save[0][0]][save[0][1]];
        for(int i=1;i<save.length;i++) {
            load[save[i][0]-1][save[i][1]-1]=save[i][2];
        }
        for(int i=0;i<11;i++)
        {
            for(int j=0;j<11;j++)
            {
                System.out.print(load[i][j]+"\t");
                if(j==10){
                    System.out.println();
                }
            }
        }
        return load;
    }

    //打印函数


    //获胜判断
    public static void win(int i){
        switch(i){
            case 1:
                System.out.println("游戏结束,黑棋获胜!");
                break;
            case 2:
                System.out.println("游戏结束,白棋获胜!");
                break;
        }

    }

    // ========== 新增:判断五子棋赢家的核心方法(完全不影响原有代码) ==========
    /**
     * 检测11x11棋盘是否有赢家
     * @param board 五子棋棋盘数组(0空、1黑、2白)
     * @return 1=黑棋胜,   2=白棋胜,0=未分胜负
     */
    public static int checkWinner(int[][] board) {
        // 遍历整个棋盘的每个位置
        for (int row = 0; row < 11; row++) {
            for (int col = 0; col < 11; col++) {
                int currentChess = board[row][col];
                if (currentChess == 0) { // 无棋子则跳过
                    continue;
                }

                // 定义4个检测方向:横向、纵向、正斜线(左上→右下)、反斜线(右上→左下)
                int[][] directions = {{0, 1}, {1, 0}, {1, 1}, {1, -1}};
                for (int[] dir : directions) {
                    int continuousCount = 1; // 当前棋子本身算1个

                    // 正向统计(如横向向右、纵向向下)
                    int r = row + dir[0];
                    int c = col + dir[1];
                    while (r >= 0 && r < 11 && c >= 0 && c < 11 && board[r][c] == currentChess) {
                        continuousCount++;
                        r += dir[0];
                        c += dir[1];
                    }

                    // 反向统计(如横向向左、纵向向上)
                    r = row - dir[0];
                    c = col - dir[1];
                    while (r >= 0 && r < 11 && c >= 0 && c < 11 && board[r][c] == currentChess) {
                        continuousCount++;
                        r -= dir[0];
                        c -= dir[1];
                    }

                    // 连续5个及以上相同棋子,判定获胜
                    if (continuousCount >= 5) {
                        return currentChess;
                    }
                }
            }
        }
        return 0; // 未分胜负
    }
}

去年今日此门中,人面桃花相映红
人面不知何处去,桃花依旧笑春风

posted @ 2026-03-23 21:30  编程小猴  阅读(34)  评论(0)    收藏  举报