阶段项目---五子棋详细随笔

阶段项目---五子棋

目的

串联知识点,检测不足,弥补不足

需求说明

棋盘10*10,玩家 *2(A,B),A在棋盘上落子后B落子,依次往复,直到一方胜利或者棋盘空间用完为止,判断胜利的条件是一条直线或者任意斜线上同时存在A或B的连续5颗棋子

技术实现

1.静态变量

public static 数据类型 变量名 = 变量值;

静态变量只能定义类中,不能定义在方法中 ,静态变量可以在static修饰的方法中使用,也可以在非静态的方法中访问,主要解决在静态方法中不能访问非静态的变量

2.静态方法

语法

public static 返回值类型 方法名(){
    
}

解释说明:

静态方法就相当于一个箱子,只是这个箱子中装的是代码,需要使用的时候,就把这个箱子放在指定的位置即可

示例

public class StaticTest {
    public static String name = "张三";
    public static void main(String[] args) {
//        System.out.println(name);
        show();
        show();
    }
    public static void show() {
        System.out.println("张三");
        System.out.println("男");
        System.out.println("20");
    }
}

实现步骤分析

1.制作棋盘

a.使用输入法中的制表符在控制台直接打印出棋盘,然后寻找落子位置的特征

public static char [][] chessboard = {
            {'┌','┬','┬','┬','┬','┬','┬','┬','┬','┐'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'└','┴','┴','┴','┴','┴','┴','┴','┴','┘'},
    };

b.利用二维数组重新制作棋盘

public class Gobang {
    public static char [][] chessboard = {
            {'┌','┬','┬','┬','┬','┬','┬','┬','┬','┐'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'└','┴','┴','┴','┴','┴','┴','┴','┴','┘'},
    };

        public static String separator = "────";
    public static void main(String[] args) {
         
        System.out.println("    0    1    2    3    4    5    6    7    8    9");

        for (int i = 0; i < chessboard.length; i++) {//外层循环控制行
            System.out.print(i+"   ");
            for (int j = 0; j < chessboard[i].length; j++) {//内层循环控制列
                if (j == chessboard[i].length - 1) {//最后一列
                    System.out.print(chessboard[i][j]);
                } else {
                    System.out.print(chessboard[i][j] + separator);//使用print打印,不换行
                }
            }

            System.out.println();
            if (i < chessboard.length - 1) {//排除最后一行
                System.out.println("    │    │    │    │    │    │    │    │    │    │");
            }
        }
    }
}

c.棋盘在玩家使用过程中会反复展示,需要使用方法来进行优化

public class Gobang {
    public static char [][] chessboard = {
            {'┌','┬','┬','┬','┬','┬','┬','┬','┬','┐'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'└','┴','┴','┴','┴','┴','┴','┴','┴','┘'},
    };

        public static String separator = "────";
    public static void main(String[] args) {
        showChessboard();

    }

    public static void showChessboard(){
        System.out.println("    0    1    2    3    4    5    6    7    8    9");
        for (int i = 0; i < chessboard.length; i++) {//外层循环控制行
            System.out.print(i+"   ");
            for (int j = 0; j < chessboard[i].length; j++) {//内层循环控制列
                if (j == chessboard[i].length - 1) {//最后一列
                    System.out.print(chessboard[i][j]);
                } else {
                    System.out.print(chessboard[i][j] + separator);//使用print打印,不换行
                }
            }

            System.out.println();
            if (i < chessboard.length - 1) {//排除最后一行
                System.out.println("    │    │    │    │    │    │    │    │    │    │");
            }
        }
    }
}

2.落子

a.玩家A.B会交替落子

package ed1;

public class Gobang {
    public static char [][] chessboard = {
            {'┌','┬','┬','┬','┬','┬','┬','┬','┬','┐'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'└','┴','┴','┴','┴','┴','┴','┴','┴','┘'},
    };

        public static String separator = "────";
    public static void main(String[] args) {
        showChessboard();
        int totalPosition = chessboard.length*chessboard[0].length;
        for (int times = 0; times < totalPosition; times++) {
            System.out.println(times % 2 == 0 ? "请玩家A落子:" : "请玩家B落子:");
        }
    }

    public static void showChessboard(){
        System.out.println("    0    1    2    3    4    5    6    7    8    9");
        for (int i = 0; i < chessboard.length; i++) {//外层循环控制行
            System.out.print(i+"   ");
            for (int j = 0; j < chessboard[i].length; j++) {//内层循环控制列
                if (j == chessboard[i].length - 1) {//最后一列
                    System.out.print(chessboard[i][j]);
                } else {
                    System.out.print(chessboard[i][j] + separator);//使用print打印,不换行
                }
            }

            System.out.println();
            if (i < chessboard.length - 1) {//排除最后一行
                System.out.println("    │    │    │    │    │    │    │    │    │    │");
            }
        }
    }
}

b.落子位置必须是0~100之间的整数,且不能使用已经存在棋子的位置

package ed1;

import java.util.Scanner;

public class Gobang {
    public static char [][] chessboard = {
            {'┌','┬','┬','┬','┬','┬','┬','┬','┬','┐'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'└','┴','┴','┴','┴','┴','┴','┴','┴','┘'},
    };

        public static String separator = "────";

        public static char pieceA = '○';
        public static char pieceB = '■';
    public static void main(String[] args) {
        showChessboard();
        int totalPosition = chessboard.length*chessboard[0].length;
        Scanner sc = new Scanner(System.in);
        for (int times = 0; times < totalPosition; times++) {
            System.out.println(times % 2 == 0 ? "请玩家A落子:" : "请玩家B落子:");
            int position;
            while (true) {//保证落子成功
                //检测scanner中是否有输入的数据并且判断数据是否为整数,如果没有数据,就需要从控制台输入
                if (sc.hasNextInt()) {
                    position = sc.nextInt();
                    if (position >= 0 && position < totalPosition) {
                        char currentPiece = (times % 2 == 0) ? pieceA : pieceB;
                        // position = 21       13*13      21/13 21%13 = 8
                        int row = position / chessboard.length;//位置除以棋盘数组长度得到行号
                        int col = position % chessboard[0].length;//位置取模棋盘数组的总列数得到行号
                        if(chessboard[row][col] == pieceA || chessboard[row][col] == pieceB){
                            System.out.println("非法落子,请重新选择落子位置");
                            times--;//落子次数减去1,因此此次落子未完成,但需要进入下一次循环
                            continue;
                        }else {
                            chessboard[row][col] = currentPiece;
                            break;
                        }
                    } else {
                        System.out.println("非法落子,请重新选择落子位置");
                    }
                } else{
                    System.out.println("非法落子,请重新选择落子位置");
                    sc.next();//将scanner中储存的数据取出,防止死循环
                }
            }
            //落子完成后,棋盘需要重新展示
            showChessboard();
        }

    }

    public static void showChessboard(){
        System.out.println("    0    1    2    3    4    5    6    7    8    9");
        for (int i = 0; i < chessboard.length; i++) {//外层循环控制行
            System.out.print(i+"   ");
            for (int j = 0; j < chessboard[i].length; j++) {//内层循环控制列
                if (j == chessboard[i].length - 1) {//最后一列
                    System.out.print(chessboard[i][j]);
                } else {
                    System.out.print(chessboard[i][j] + separator);//使用print打印,不换行
                }
            }

            System.out.println();
            if (i < chessboard.length - 1) {//排除最后一行
                System.out.println("    │    │    │    │    │    │    │    │    │    │");
            }
        }
    }
}

c.落子完成后,需要校验是否获胜

package ed1;

import java.util.Scanner;

public class Gobang {
    public static char [][] chessboard = {
            {'┌','┬','┬','┬','┬','┬','┬','┬','┬','┐'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'└','┴','┴','┴','┴','┴','┴','┴','┴','┘'},
    };

        public static String separator = "────";

        public static char pieceA = '○';
        public static char pieceB = '■';
    public static void main(String[] args) {
        showChessboard();
        int totalPosition = chessboard.length*chessboard[0].length;
        Scanner sc = new Scanner(System.in);
        outer:
        for (int times = 0; times < totalPosition; times++) {
            System.out.println(times % 2 == 0 ? "请玩家A落子:" : "请玩家B落子:");
            int position;
            char currentPiece = (times % 2 == 0) ? pieceA : pieceB;//当前使用的棋子
            while (true) {//保证落子成功
                //检测scanner中是否有输入的数据并且判断数据是否为整数,如果没有数据,就需要从控制台输入
                if (sc.hasNextInt()) {
                    position = sc.nextInt();
                    if (position >= 0 && position < totalPosition) {
                        // position = 21       13*13      21/13 21%13 = 8
                        int row = position / chessboard.length;//位置除以棋盘数组长度得到行号
                        int col = position % chessboard[0].length;//位置取模棋盘数组的总列数得到行号
                        if(chessboard[row][col] == pieceA || chessboard[row][col] == pieceB){
                            System.out.println("非法落子,请重新选择落子位置");
                            times--;//落子次数减去1,因此此次落子未完成,但需要进入下一次循环
                            continue;
                        }else {
                            chessboard[row][col] = currentPiece;
                            break;
                        }
                    } else {
                        System.out.println("非法落子,请重新选择落子位置");
                    }
                } else{
                    System.out.println("非法落子,请重新选择落子位置");
                    sc.next();//将scanner中储存的数据取出,防止死循环
                }
            }
            //落子完成后,棋盘需要重新展示
            showChessboard();
            //判断获胜情况,一共四种
            for (int i = 0; i < chessboard.length; i++) {
                for (int j = 0; j < chessboard[i].length; j++) {
                    //第一种:水平方向上存在同一玩家的连续5颗棋子
                    //(i,j) (i,j+1) (i,j+2) (i,j+3) (i,j+4)
                    boolean case1 =(j + 4<chessboard[i].length)
                            && chessboard[i][j] == currentPiece
                            && chessboard[i][j+1] == currentPiece
                            && chessboard[i][j+2] == currentPiece
                            && chessboard[i][j+3] == currentPiece
                            && chessboard[i][j+4] == currentPiece;
                    //第二种:铅锤方向上存在同一玩家的连续5颗棋子
                    //(i,j) (i+1,j) (i+2,j) (i+3,j) (i+4,j)
                    boolean case2 =(i + 4<chessboard.length)
                            && chessboard[i][j] == currentPiece
                            && chessboard[i+1][j] == currentPiece
                            && chessboard[i+2][j] == currentPiece
                            && chessboard[i+3][j] == currentPiece
                            && chessboard[j+4][j] == currentPiece;
                    //第三种:135方向上存在同一玩家的连续5颗棋子
                    //(i,j) (i+1,j+1) (i+2,j+2) (i+3,j+3) (i+4,j+4)
                    boolean case3 =(i + 4<chessboard.length)
                            && (j + 4<chessboard[i].length)
                            && chessboard[i][j] == currentPiece
                            && chessboard[i+1][j+1] == currentPiece
                            && chessboard[i+2][j+2] == currentPiece
                            && chessboard[i+3][j+3] == currentPiece
                            && chessboard[i+4][j+4] == currentPiece;
                    //第四种:45方向上存在同一玩家的连续5颗棋子
                    //(i,j) (i-1,j+1) (i-2,j+2) (i-3,j+3) (i-4,j+4)
                    boolean case4 =(i>4)&&(i + 4<chessboard[i].length)
                            && chessboard[i][j] == currentPiece
                            && chessboard[i-1][j+1] == currentPiece
                            && chessboard[i-2][j+2] == currentPiece
                            && chessboard[i-3][j+3] == currentPiece
                            && chessboard[i-4][j+4] == currentPiece;
                    if (case1 || case2 || case3 || case4) {
                        System.out.println(times %2 == 0 ? "玩家A获得胜利":"玩家B获得胜利");
                        break outer;
                    }
                }
            }
        }
    }

    public static void showChessboard(){
        System.out.println("    0    1    2    3    4    5    6    7    8    9");
        for (int i = 0; i < chessboard.length; i++) {//外层循环控制行
            System.out.print(i+"   ");
            for (int j = 0; j < chessboard[i].length; j++) {//内层循环控制列
                if (j == chessboard[i].length - 1) {//最后一列
                    System.out.print(chessboard[i][j]);
                } else {
                    System.out.print(chessboard[i][j] + separator);//使用print打印,不换行
                }
            }

            System.out.println();
            if (i < chessboard.length - 1) {//排除最后一行
                System.out.println("    │    │    │    │    │    │    │    │    │    │");
            }
        }
    }
}

d.棋盘使用完毕还未分出胜负,需要提示

package ed1;

import java.util.Scanner;

public class Gobang {
    public static char [][] chessboard = {
            {'┌','┬','┬','┬','┬','┬','┬','┬','┬','┐'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'└','┴','┴','┴','┴','┴','┴','┴','┴','┘'},
    };

        public static String separator = "────";

        public static char pieceA = '○';//玩家A的棋子

        public static char pieceB = '■';//玩家B的棋子

        public static int times = 0;//记录棋盘使用次数,偶数次玩家A落子,奇数次玩家B落子
    public static void main(String[] args) {
        showChessboard();
        int totalPosition = chessboard.length*chessboard[0].length;
        Scanner sc = new Scanner(System.in);
        outer:
        while (times < totalPosition) {
            System.out.println(times % 2 == 0 ? "请玩家A落子:" : "请玩家B落子:");
            int position;
            char currentPiece = (times % 2 == 0) ? pieceA : pieceB;//当前使用的棋子
            while (true) {//保证落子成功
                //检测scanner中是否有输入的数据并且判断数据是否为整数,如果没有数据,就需要从控制台输入
                if (sc.hasNextInt()) {
                    position = sc.nextInt();
                    if (position >= 0 && position < totalPosition) {
                        // position = 21       13*13      21/13 21%13 = 8
                        int row = position / chessboard.length;//位置除以棋盘数组长度得到行号
                        int col = position % chessboard[0].length;//位置取模棋盘数组的总列数得到行号
                        if(chessboard[row][col] == pieceA || chessboard[row][col] == pieceB){
                            System.out.println("非法落子,请重新选择落子位置");
                            times--;//落子次数减去1,因此此次落子未完成,但需要进入下一次循环
                            continue;
                        }else {
                            chessboard[row][col] = currentPiece;
                            break;
                        }
                    } else {
                        System.out.println("非法落子,请重新选择落子位置");
                    }
                } else{
                    System.out.println("非法落子,请重新选择落子位置");
                    sc.next();//将scanner中储存的数据取出,防止死循环
                }
            }
            //落子完成后,棋盘需要重新展示
            showChessboard();
            //判断获胜情况,一共四种
            for (int i = 0; i < chessboard.length; i++) {
                for (int j = 0; j < chessboard[i].length; j++) {
                    //第一种:水平方向上存在同一玩家的连续5颗棋子
                    //(i,j) (i,j+1) (i,j+2) (i,j+3) (i,j+4)
                    boolean case1 =(j + 4<chessboard[i].length)
                            && chessboard[i][j] == currentPiece
                            && chessboard[i][j+1] == currentPiece
                            && chessboard[i][j+2] == currentPiece
                            && chessboard[i][j+3] == currentPiece
                            && chessboard[i][j+4] == currentPiece;
                    //第二种:铅锤方向上存在同一玩家的连续5颗棋子
                    //(i,j) (i+1,j) (i+2,j) (i+3,j) (i+4,j)
                    boolean case2 =(i + 4<chessboard.length)
                            && chessboard[i][j] == currentPiece
                            && chessboard[i+1][j] == currentPiece
                            && chessboard[i+2][j] == currentPiece
                            && chessboard[i+3][j] == currentPiece
                            && chessboard[j+4][j] == currentPiece;
                    //第三种:135方向上存在同一玩家的连续5颗棋子
                    //(i,j) (i+1,j+1) (i+2,j+2) (i+3,j+3) (i+4,j+4)
                    boolean case3 =(i + 4<chessboard.length)
                            && (j + 4<chessboard[i].length)
                            && chessboard[i][j] == currentPiece
                            && chessboard[i+1][j+1] == currentPiece
                            && chessboard[i+2][j+2] == currentPiece
                            && chessboard[i+3][j+3] == currentPiece
                            && chessboard[i+4][j+4] == currentPiece;
                    //第四种:45方向上存在同一玩家的连续5颗棋子
                    //(i,j) (i-1,j+1) (i-2,j+2) (i-3,j+3) (i-4,j+4)
                    boolean case4 =(i>4)&&(i + 4<chessboard[i].length)
                            && chessboard[i][j] == currentPiece
                            && chessboard[i-1][j+1] == currentPiece
                            && chessboard[i-2][j+2] == currentPiece
                            && chessboard[i-3][j+3] == currentPiece
                            && chessboard[i-4][j+4] == currentPiece;
                    if (case1 || case2 || case3 || case4) {
                        System.out.println(times %2 == 0 ? "玩家A获得胜利":"玩家B获得胜利");
                        break outer;
                    }
                }
                times++;
            }
            if(times == totalPosition){//说明棋盘已经用完还未分出胜负
                System.out.println("平局");
            }
        }
    }

    public static void showChessboard(){
        System.out.println("    0    1    2    3    4    5    6    7    8    9");
        for (int i = 0; i < chessboard.length; i++) {//外层循环控制行
            System.out.print(i+"   ");
            for (int j = 0; j < chessboard[i].length; j++) {//内层循环控制列
                if (j == chessboard[i].length - 1) {//最后一列
                    System.out.print(chessboard[i][j]);
                } else {
                    System.out.print(chessboard[i][j] + separator);//使用print打印,不换行
                }
            }

            System.out.println();
            if (i < chessboard.length - 1) {//排除最后一行
                System.out.println("    │    │    │    │    │    │    │    │    │    │");
            }
        }
    }
}

3.声音特效

为落子,非法落子及获胜添加音效

拷贝文件

package ed1;

import java.applet.Applet;
import java.applet.AudioClip;
import java.net.URL;
import java.util.Scanner;

public class Gobang {
    public static char [][] chessboard = {
            {'┌','┬','┬','┬','┬','┬','┬','┬','┬','┐'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'└','┴','┴','┴','┴','┴','┴','┴','┴','┘'},
    };

        public static String separator = "────";

        public static char pieceA = '○';//玩家A的棋子

        public static char pieceB = '■';//玩家B的棋子

        public static int times = 0;//记录棋盘使用次数,偶数次玩家A落子,奇数次玩家B落子
    public static void main(String[] args) {
        showChessboard();
        int totalPosition = chessboard.length*chessboard[0].length;
        Scanner sc = new Scanner(System.in);
        outer:
        while (times < totalPosition) {
            System.out.println(times % 2 == 0 ? "请玩家A落子:" : "请玩家B落子:");
            int position;
            char currentPiece = (times % 2 == 0) ? pieceA : pieceB;//当前使用的棋子
            while (true) {//保证落子成功
                //检测scanner中是否有输入的数据并且判断数据是否为整数,如果没有数据,就需要从控制台输入
                if (sc.hasNextInt()) {
                    position = sc.nextInt();
                    if (position >= 0 && position < totalPosition) {
                        // position = 21       13*13      21/13 21%13 = 8
                        int row = position / chessboard.length;//位置除以棋盘数组长度得到行号
                        int col = position % chessboard[0].length;//位置取模棋盘数组的总列数得到行号
                        if(chessboard[row][col] == pieceA || chessboard[row][col] == pieceB){
                            System.out.println("非法落子,请重新选择落子位置");
                            playAudio("illegal.wav");
                            continue;
                        }else {
                            chessboard[row][col] = currentPiece;
                            playAudio("fill.wav");
                            break;
                        }
                    } else {
                        System.out.println("非法落子,请重新选择落子位置");
                        playAudio("illegal.wav");
                    }
                } else{
                    System.out.println("非法落子,请重新选择落子位置");
                    playAudio("illegal.wav");
                    sc.next();//将scanner中储存的数据取出,防止死循环
                }
            }
            //落子完成后,棋盘需要重新展示
            showChessboard();
            //判断获胜情况,一共四种
            for (int i = 0; i < chessboard.length; i++) {
                for (int j = 0; j < chessboard[i].length; j++) {
                    //第一种:水平方向上存在同一玩家的连续5颗棋子
                    //(i,j) (i,j+1) (i,j+2) (i,j+3) (i,j+4)
                    boolean case1 =(j + 4<chessboard[i].length)
                            && chessboard[i][j] == currentPiece
                            && chessboard[i][j+1] == currentPiece
                            && chessboard[i][j+2] == currentPiece
                            && chessboard[i][j+3] == currentPiece
                            && chessboard[i][j+4] == currentPiece;
                    //第二种:铅锤方向上存在同一玩家的连续5颗棋子
                    //(i,j) (i+1,j) (i+2,j) (i+3,j) (i+4,j)
                    boolean case2 =(i + 4<chessboard.length)
                            && chessboard[i][j] == currentPiece
                            && chessboard[i+1][j] == currentPiece
                            && chessboard[i+2][j] == currentPiece
                            && chessboard[i+3][j] == currentPiece
                            && chessboard[j+4][j] == currentPiece;
                    //第三种:135方向上存在同一玩家的连续5颗棋子
                    //(i,j) (i+1,j+1) (i+2,j+2) (i+3,j+3) (i+4,j+4)
                    boolean case3 =(i + 4<chessboard.length)
                            && (j + 4<chessboard[i].length)
                            && chessboard[i][j] == currentPiece
                            && chessboard[i+1][j+1] == currentPiece
                            && chessboard[i+2][j+2] == currentPiece
                            && chessboard[i+3][j+3] == currentPiece
                            && chessboard[i+4][j+4] == currentPiece;
                    //第四种:45方向上存在同一玩家的连续5颗棋子
                    //(i,j) (i-1,j+1) (i-2,j+2) (i-3,j+3) (i-4,j+4)
                    boolean case4 =(i>4)&&(i + 4<chessboard[i].length)
                            && chessboard[i][j] == currentPiece
                            && chessboard[i-1][j+1] == currentPiece
                            && chessboard[i-2][j+2] == currentPiece
                            && chessboard[i-3][j+3] == currentPiece
                            && chessboard[i-4][j+4] == currentPiece;
                    if (case1 || case2 || case3 || case4) {
                        System.out.println(times %2 == 0 ? "玩家A获得胜利":"玩家B获得胜利");
                        playAudio("win.wav");
                        break outer;
                    }
                }
                times++;
            }
            if(times == totalPosition){//说明棋盘已经用完还未分出胜负
                System.out.println("平局");
            }
        }
    }

    public static void showChessboard(){
        System.out.println("    0    1    2    3    4    5    6    7    8    9");
        for (int i = 0; i < chessboard.length; i++) {//外层循环控制行
            System.out.print(i+"   ");
            for (int j = 0; j < chessboard[i].length; j++) {//内层循环控制列
                if (j == chessboard[i].length - 1) {//最后一列
                    System.out.print(chessboard[i][j]);
                } else {
                    System.out.print(chessboard[i][j] + separator);//使用print打印,不换行
                }
            }

            System.out.println();
            if (i < chessboard.length - 1) {//排除最后一行
                System.out.println("    │    │    │    │    │    │    │    │    │    │");
            }
        }
    }

    public static void playAudio(String fileName){
        URL url = Gobang.class.getClassLoader().getResource(fileName);
        AudioClip clip = Applet.newAudioClip(url);
        clip.play();
        try {
            Thread.sleep(50L);
        } catch (InterruptedException e) {}
    }
}

posted @ 2025-12-20 03:02  程玖浔  阅读(4)  评论(0)    收藏  举报