Java实现“简单的”五子棋游戏(二维数组)

一.游戏分析
//五子棋游戏必备元素
static String white = "○";
static String black = "●";
static String[][] qp = new String[15][15];//棋盘
static String[] num = {"⒈", "⒉", "⒊", "⒋", "⒌", "⒍", "⒎", "⒏", "⒐", "⒑", "⒒", "⒓", "⒔", "⒕", "⒖"};
static String line = "十";

 1.将所有必要元素搞到棋盘中去

如图所示:

 代码实现:

//初始化棋盘
public static void init() {
    for (int i = 0; i < qp.length; i++) {
        for (int j = 0; j < qp[i].length; j++) {
            qp[i][j] = line; //将"十"放进去
            if (j == qp[i].length - 1) {
                qp[i][j] = num[i]; /*将{"⒈", "⒉", "⒊", "⒋", "⒌", "⒍",
                                         "⒎", "⒏","⒐", "⒑", "⒒", "⒓",
                                         "⒔", "⒕", "⒖"},放进去*/
            }
            if (i == qp.length - 1) {
                qp[i][j] = num[j];/*将{"⒈", "⒉", "⒊", "⒋", "⒌", "⒍",
                                       "⒎", "⒏", "⒐", "⒑", "⒒", "⒓", 
                                       "⒔", "⒕", "⒖"},放进去*/
            }
            System.out.print(qp[i][j] + " "); //遍历数组
        }
        System.out.println(); //换行
    }
}

2.打印棋盘

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

3.判断下的棋子是否越界

//判断是否越界,是否重复
public static boolean check(int x, int y) {
    if (x < 0 || y < 0 || y > 14 || x > 14) { // c超过棋盘边界及判定为越界
        return false;
    }
    if (!qp[x][y].equals(line)) { //如果输入的棋子坐标对应的地方不是"十",即为重复
        return false;
    }
    return true;
}

4.判断输赢

        说明:从上,下,左,右,右斜向上,右斜向下,左斜向上,左斜向下这八个方向判断;

                   如果出现有五个连续的同一方的棋子(使用记数的方法,出现一个连续的就加一),                       即获胜。代码实现:

  private static boolean Iswin(int x, int y, String qizi) {

        /*
        水平查找
         */
        //水平向右查找
        int risum = 1;
        for (int righty = y - 1; righty >= 0; righty--) {
            if (qp[x][righty].equals(qizi)) {
                risum++;
            } else {
                break;
            }
        }
        if (risum >= 5) {
            return true;
        }
        //水平向左查找
        int lesum = 1;
        for (int lefty = y + 1; lefty <= 14; lefty++) {
            if (qp[x][lefty].equals(qizi)) {
                lesum++;
            } else {
                break;
            }
        }
        if (lesum >= 5) {
            return true;
        }

        /*
        竖直查找
         */
        //向上查找
        int upsum = 1;
        for (int upx = x + 1; upx <= 14; upx++) {
            if (qp[upx][y].equals(qizi)) {
                upsum++;
            } else {
                break;
            }
        }
        if (upsum >= 5) {
            return true;
        }
        //向下查找
        int dosum = 1;
        for (int dox = x - 1; dox >= 0; dox--) {
            if (qp[dox][y].equals(qizi)) {
                dosum++;
            } else {
                break;
            }
        }
        if (dosum >= 5) {
            return true;
        }
        /*
        对角线查找
         */
        //右斜向下查找
        int xridosum = 1;
        for (int xridox = x + 1, xridoy = y + 1; xridox <= 14 && xridoy <= 14; xridox++, xridoy++) {
            if (qp[xridox][xridoy].equals(qizi)) {
                xridosum++;
            } else {
                break;
            }
        }
        if (xridosum >= 5) {
            return true;
        }
        //右斜向上查找
        int xriupsum = 1;
        for (int xriupx = x + 1, xriupy = y - 1; xriupx <= 14 && xriupy >= 0; xriupx++, xriupy--) {
            if (qp[xriupx][xriupy].equals(qizi)) {
                xriupsum++;
            } else {
                break;
            }
        }
        if (xriupsum >= 5) {
            return true;
        }
        //左斜向下查找
        int xledosum = 1;
        for (int xledox = x - 1, xledoy = y + 1; xledox >= 0 && xledoy <= 14; xledox--, xledoy++) {
            if (qp[xledox][xledoy].equals(qizi)) {
                xledosum++;
            } else {
                break;
            }
        }
        if (xledosum >= 5) {
            return true;
        }
        //左斜向上查找
        int xleupsum = 1;
        for (int xleupx = x - 1, xleupy = y - 1; xleupx >= 0 && xleupy >= 0; xleupx--, xleupy--) {
            if (qp[xleupx][xleupy].equals(qizi)) {
                xleupsum++;
            } else {
                break;
            }
        }
        if (xriupsum >= 5) {
            return true;
        }
        return false;
    }

5.准备阶段结束,游戏开始

  //开始游戏
    public static void stratGame() {
        Scanner PD = new Scanner(System.in);
        boolean flag = true;
        while (true) {
            if (flag == true) {
                System.out.println("黑方下");
                int num1 = PD.nextInt() - 1;
                int num12 = PD.nextInt() - 1;
                boolean result = check(num1, num12);
                if (result) {
                    qp[num1][num12] = black;
                    print();
                    boolean win = Iswin(num1, num12, black);
                    if(win){
                        System.out.println("黑方胜利");
                        break;
                    }
                    flag = false;
                } else {
                    System.out.println("棋子越界或重复,请重新输入!");
                }
            }
            if (flag == false) {
                System.out.println("白方下");
                int num2 = PD.nextInt() - 1;
                int num21 = PD.nextInt() - 1;
                boolean result = check(num2, num21);
                if (result) {
                    qp[num2][num21] = white;
                    print();
                    boolean win = Iswin(num2, num21, white);
                    if(win){
                        System.out.println("白方胜利");
                        break;
                    }
                    flag = true;
                } else {
                    System.out.println("棋子越界或重复,请重新输入!");
                }
            }
        }
    }

总上述方法,总代码如下:

import java.util.Scanner;

public class WZQ {
    static String white = "○";
    static String black = "●";
    static String[][] qp = new String[15][15];//棋盘
    static String[] num = {"⒈", "⒉", "⒊", "⒋", "⒌", "⒍", "⒎", "⒏", "⒐", "⒑", "⒒", "⒓", "⒔", "⒕", "⒖"};
    static String line = "十";

    public static void main(String[] args) {
        /*
         1.
            初始化棋盘 抽取到一个方法中
            打印棋盘 抽取到一个方法中
         2.
            黑白双方交替下棋
            打印棋盘
         3.
            判断是否越界
            判断是否重复
            判断输赢
         */
        init();
        stratGame();
    }

    //初始化棋盘
    public static void init() {
        for (int i = 0; i < qp.length; i++) {
            for (int j = 0; j < qp[i].length; j++) {
                qp[i][j] = line;
                if (j == qp[i].length - 1) {
                    qp[i][j] = num[i];
                }
                if (i == qp.length - 1) {
                    qp[i][j] = num[j];
                }
                System.out.print(qp[i][j] + " ");
            }
            System.out.println();
        }
    }

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

    //开始游戏
    public static void stratGame() {
        Scanner PD = new Scanner(System.in);
        boolean flag = true;
        while (true) {
            if (flag == true) {
                System.out.println("黑方下");
                int num1 = PD.nextInt() - 1;
                int num12 = PD.nextInt() - 1;
                boolean result = check(num1, num12);
                if (result) {
                    qp[num1][num12] = black;
                    print();
                    boolean win = Iswin(num1, num12, black);
                    if(win){
                        System.out.println("黑方胜利");
                        break;
                    }
                    flag = false;
                } else {
                    System.out.println("棋子越界或重复,请重新输入!");
                }
            }
            if (flag == false) {
                System.out.println("白方下");
                int num2 = PD.nextInt() - 1;
                int num21 = PD.nextInt() - 1;
                boolean result = check(num2, num21);
                if (result) {
                    qp[num2][num21] = white;
                    print();
                    boolean win = Iswin(num2, num21, white);
                    if(win){
                        System.out.println("白方胜利");
                        break;
                    }
                    flag = true;
                } else {
                    System.out.println("棋子越界或重复,请重新输入!");
                }
            }
        }
    }

    private static boolean Iswin(int x, int y, String qizi) {

        /*
        水平查找
         */
        //水平向右查找
        int risum = 1;
        for (int righty = y - 1; righty >= 0; righty--) {
            if (qp[x][righty].equals(qizi)) {
                risum++;
            } else {
                break;
            }
        }
        if (risum >= 5) {
            return true;
        }
        //水平向左查找
        int lesum = 1;
        for (int lefty = y + 1; lefty <= 14; lefty++) {
            if (qp[x][lefty].equals(qizi)) {
                lesum++;
            } else {
                break;
            }
        }
        if (lesum >= 5) {
            return true;
        }

        /*
        竖直查找
         */
        //向上查找
        int upsum = 1;
        for (int upx = x + 1; upx <= 14; upx++) {
            if (qp[upx][y].equals(qizi)) {
                upsum++;
            } else {
                break;
            }
        }
        if (upsum >= 5) {
            return true;
        }
        //向下查找
        int dosum = 1;
        for (int dox = x - 1; dox >= 0; dox--) {
            if (qp[dox][y].equals(qizi)) {
                dosum++;
            } else {
                break;
            }
        }
        if (dosum >= 5) {
            return true;
        }
        /*
        对角线查找
         */
        //右斜向下查找
        int xridosum = 1;
        for (int xridox = x + 1, xridoy = y + 1; xridox <= 14 && xridoy <= 14; xridox++, xridoy++) {
            if (qp[xridox][xridoy].equals(qizi)) {
                xridosum++;
            } else {
                break;
            }
        }
        if (xridosum >= 5) {
            return true;
        }
        //右斜向上查找
        int xriupsum = 1;
        for (int xriupx = x + 1, xriupy = y - 1; xriupx <= 14 && xriupy >= 0; xriupx++, xriupy--) {
            if (qp[xriupx][xriupy].equals(qizi)) {
                xriupsum++;
            } else {
                break;
            }
        }
        if (xriupsum >= 5) {
            return true;
        }
        //左斜向下查找
        int xledosum = 1;
        for (int xledox = x - 1, xledoy = y + 1; xledox >= 0 && xledoy <= 14; xledox--, xledoy++) {
            if (qp[xledox][xledoy].equals(qizi)) {
                xledosum++;
            } else {
                break;
            }
        }
        if (xledosum >= 5) {
            return true;
        }
        //左斜向上查找
        int xleupsum = 1;
        for (int xleupx = x - 1, xleupy = y - 1; xleupx >= 0 && xleupy >= 0; xleupx--, xleupy--) {
            if (qp[xleupx][xleupy].equals(qizi)) {
                xleupsum++;
            } else {
                break;
            }
        }
        if (xriupsum >= 5) {
            return true;
        }
        return false;
    }

    //判断是否越界,是否重复
    public static boolean check(int x, int y) {
        if (x < 0 || y < 0 || y > 14 || x > 14) {
            return false;
        }
        if (!qp[x][y].equals(line)) {
            return false;
        }
        return true;
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭天宇 abfore

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值