java五子棋小游戏命令行实现

import java.util.*;

class GoBang {
    char[][] chessboard; // 创建全局二维数组

    // 构造棋盘
    public GoBang() {
        chessboard = new char[15][15];
        for (int i = 0; i < chessboard.length; i++) {
            for (int j = 0; j < chessboard.length; j++) {
                chessboard[i][j] = '+';
            }
        }
    }

    // 打印棋盘
    void printBoard() {
        for (int i = 0; i < chessboard.length; i++) {        // 遍历二维数组 打印当前状态棋盘
            for (int j = 0; j < chessboard.length; j++) {
                System.out.print(chessboard[i][j] + " ");
            }
            System.out.println();
        }
    }

    //统计棋子个数
    int num(){
        int num = 0;
        for (int i = 0; i < chessboard.length; i++) {
            for (int j = 0; j < chessboard.length; j++) {
                if (chessboard[i][j] == '*' || chessboard[i][j] == '$') {
                    num++;
                }
            }
        }
        return num;
    }

    // 判赢
    boolean judge() {
        for (int i = 0; i < chessboard.length; i++) {       // 遍历棋盘
            for (int j = 0; j < chessboard.length; j++) {
                if (chessboard[i][j] != '+'){       // 当前棋盘位置不是+号时
                    // 向右  判断是否有相同五颗棋子
                    if (j < 11) {
                        boolean flag = true;
                        for (int y = 0; y < 5; y++) {
                            if (chessboard[i][j] != chessboard[i][j + y]) {  // 对比向右连续5个格子
                                flag = false;
                                break;
                            }
                        }
                        if (flag) {       // 判断结果是break出来的还是走完循环的
                            return true;
                        }
                    }
                    // 向下  判断是否有相同五颗棋子
                    if (i < 11) {
                        boolean flag = true;
                        for (int x = 0; x < 5; x++) {
                            if (chessboard[i][j] != chessboard[i + x][j]) {     // 对比向下连续5个格子
                                flag = false;
                                break;
                            }
                        }
                        if (flag) {       // 判断结果是break出来的还是走完循环的
                            return true;
                        }
                    }
                    // 向右上    判断是否有相同五颗棋子
                    if (i > 3 && j < 11) {
                        boolean flag = true;
                        for (int xy = 0; xy < 5; xy++) {
                            if (chessboard[i][j] != chessboard[i - xy][j + xy]) {     // 对比向右上连续5个格子
                                flag = false;
                                break;
                            }
                        }
                        if (flag) {       // 判断结果是break出来的还是走完循环的
                            return true;
                        }
                    }
                    // 向右下    判断是否有相同五颗棋子
                    if (i < 11 && j < 11) {
                        boolean flag = true;
                        for (int xy = 0; xy < 5; xy++) {
                            if (chessboard[i][j] != chessboard[i + xy][j + xy]) {     // 对比向右下连续5个格子
                                flag = false;
                                break;
                            }
                        }
                        if (flag) {       // 判断结果是break出来的还是走完循环的
                            return true;
                        }
                    }
                }
            }
        }
        return false;
    }

    //游戏开始方法
    void start() {

        System.out.println("游戏开始!");

        while (true) {
            Scanner input = new Scanner(System.in);
            int x = 0, y = 0;
            //人下棋(判赢),用*表示人的棋子
            while(true){
                System.out.println("请输入落子的位置:x,y");
                try {
                    String p_input = input.nextLine();
                    String[] p_inputs = p_input.split(",");
                    x = Integer.parseInt(p_inputs[0]);
                    y = Integer.parseInt(p_inputs[1]);
                }catch (Exception e){
                    System.out.println("输入有误!");
                    continue;
                }
                //落子的合理性
                if (x >= 0 && x < 15 && y >= 0 && y < 15)
                    if (chessboard[x][y] == '+') {      //如果当前位置为+,则放入棋子
                        chessboard[x][y] = '*';
                        break;
                    } else {                            //否则打印棋子已存在
                        System.out.println("棋子已存在,请重新落子!");
                    }else{
                    System.out.println("棋子出界,请重新落子!");
                }
            }
            printBoard();
            if (judge()) {
                System.out.println("人获胜!");
                break;
            }
            //判断是否发生平局
            if (!judge() && num() == 225) {
                System.out.println("平局");
                break;
            }

            //机器随机下棋(判赢),用*表示人的棋子
            while(true){
                System.out.println("机器落子!");
                x = (int) (Math.random() * 15);
                y = (int) (Math.random() * 15);
                if (x >= 0 && x < 15 && y >= 0 && y < 15)
                    if (chessboard[x][y] == '+') {      //如果当前位置为+,则放入棋子
                        chessboard[x][y] = '$';
                        break;
                    } else {                            //否则打印棋子已存在
                        System.out.println("棋子已存在,请重新落子!");
                    }
            }
            printBoard();
            if (judge()) {
                System.out.println("机器获胜!");
                break;
            }
            //判断是否发生平局
            if (!judge() && num() == 225) {
                System.out.println("平局");
                break;
            }

        }
    }

    public static void main(String[] args) {
        GoBang gb = new GoBang();
        gb.start();
    }
}

1.程序采用二维数组构建棋盘,通过遍历数组实现显示棋盘和下棋的效果。

2.采用while结构实现人和机器循环下棋,在人下棋时要求其输入棋子的坐标,使用while循环,当其输入的坐标存在棋子和坐标越界是让其重新输入。机器下棋时采用Math中的random方法实现随机下棋功能,同样采用while循环筛除机器随机到覆盖棋子的情况。

3.当每次人或机器下完棋子后便会遍历棋盘,并且判断人或机器是否获胜。在判断获胜时调用judge方法,具体实现思路如下:判断获胜条件为x,y轴,y=x, y = -x, 四条线上是否有五个棋子相连。每次调用judge方法时,便会遍历棋盘寻找所下棋子,找到j<11的棋子时便向右判断连续五个是否相等,若不相等又满足i<11时便向下判断连续五个棋子是否相等,若不相等又i>3&&j<11时便向右上判断连续五个棋子是否相等,若不相等又i<11&&j<11便向右下判断是否有五个棋子相等。若经过上述四种情况遍历没找到连续相等的五个棋子,即没达到获胜条件则继续下棋。直至找到获胜条件时或达到平局时结束游戏。

4.当人或机器下完棋子后judge方法为false并且所下棋子个数为225个时本局游戏为平局。

5.异常处理:当在接受用户输入落子坐标时,当输入非要求字符时程序会抛出异常,将可能发生异常的String p_input = input.nextLine();String[] p_inputs = p_input.split(",");x = Integer.parseInt(p_inputs[0]);y = Integer.parseInt(p_inputs[1]);代码放在了 try 块中,在 catch 语句中指定捕获的异常类型为 Exception,提示用户输入错误,进入下次循环让用户重新输入。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值