Java弱智电脑大战

Java弱智电脑五子棋大战

直接主题,下面是两个电脑的五子棋Java代码

import java.util.Random;

public class WuZiQi03 {
    // 让人脑溢血的电脑五子棋世纪大战
    // 绘制棋盘
    // 第一步 设置二维数组
    static String[][] zi = new String[10][10];

    public static void main(String[] args) {
        // 创建棋盘,调用方法
        jia(); // 给这个数组里所有的一维数组改为加号。
        qi();  // 将棋盘绘制出来
        xia(); // 下棋字 绘制出下完棋子的棋盘
    }
    // 给这个数组里所有的一维数组改为加号的方法
    public static void jia(){
        for (int i = 0; i < zi.length; i++) {
            for (int j = 0; j < zi[i].length; j++) {
                zi[i][j] = "+";
            }
        }
    }
    // 将棋盘绘制出来的方法
    public static void qi(){
        System.out.print(" ");
        for (int i = 0; i < 11; i++) {  //写出x轴的位置(1、2、3...),方便看到棋子下到哪里
            System.out.print(i + "  "); //在棋盘上面打印出坐标 1 2 3 4 ....
        }
        System.out.println();
        int u = 0;
        for (int i = 0; i < zi.length; i++) {
            u++;                        //在棋盘左面打印出坐标 1 2 3 4 ....
            System.out.print(u + "\t"); //写出y轴的位置(1、2、3...),方便看到棋子下到哪里
            for (int j = 0; j < zi[i].length; j++) {
                System.out.print(zi[i][j] + "  "); // 棋盘每到10行换行,使用System.out.print是不换行的意思。
            }
            System.out.println(); // 不需要输出任何东西时,它也可以提供换行的作用,
        }                         // 上面代码的意思,每当一维数组里的数值变为+号后,换行。新的一维数值重新赋值+号,之道棋盘绘制完成。
    }
    // 下棋字 绘制出下完棋子的棋盘的方法
    public static void xia(){
        boolean tuo = true; //既然是下棋,必须要有两个玩家,声明一个布尔型的值为true,用它来交换选手。
        while (true){       //因为要五个棋子相连,所有使用死循环,之道五子相连,退出循环。
            if (tuo){       //当布尔值为true时,A选手下棋。
                Util.yin("A选手下棋");
                //用两个弱智电脑下棋,不再需要自己手动输入,可以更好的发现代码中忽略问题,想和朋友下棋,下面改为输入即可。
                Random r = new Random();    // 使用随机数来充当一个弱智电脑。
                int x = r.nextInt(10)+1; // 这里随机数加1是因为除了这里改为随机数以外的所有代码,都是之前自己输入2个坐标下棋子
                int y = r.nextInt(10)+1; // 下面的代码都是为了方便用户输入一个数值,同时对应上数值里的数值,因为数组的坐标是从
                                                // 0开始的。用户输入1要对应的是数组的坐标0,因此下面的坐标x、y的坐标都减1
                if (pan(x,y)){ // if () 里面调用了判断下棋棋子是否超出范围的方法
                    Util.yin("请输入棋盘范围内的数字!"); // 使用的是人机的话 ,忽略这行代码。玩家自己输入棋子坐标时,这是用来判断
                    continue;                             // 玩家输入的范围是否在五子棋的范围里面,若不是重新循环。
                }
                if (pan1(x,y)){ // if () 里面调用了判断下棋是否位置上有棋子的方法
                    Util.yin("这个位置上已经有一个棋子了");// 这里有一个白棋或黑棋,就不能在下了。判断下的棋子位置上是否有棋子,位置上
                    continue;                             // 位置上有棋子 ,结束当前循环,重新输入一个坐标。
                }else {
                    zi[x-1][y-1] = "⚪";     //反之没有,就可以下棋子了
                    qi();  // 下完棋子后,当然要调用新的下完棋子的棋盘。
                    // 五子棋的赢法有 竖着5个 横着5个 左上右下5个 左下右上5个方法。只要满足一个条件,就赢了。下面就是调用4种胜利的方法
                    boolean g = shangxia(x,y,zi[x-1][y-1]+"");//竖着5个赢
                    boolean g1 = zuoyou(x,y,zi[x-1][y-1]+"");//横着5个赢
                    boolean g2 = zuoshang(x,y,zi[x-1][y-1]+"");//左上右下5个赢
                    boolean g3 = zuoxia(x,y,zi[x-1][y-1]+"");//左下右上5个赢
                    if (g || g1 || g2 || g3){
                        System.out.println("A选手胜利");
                        break; //一个玩家赢了自然结束循环。
                    }
                }
                // B选手下棋自然与上面白棋是一样的。
            }else {
                Util.yin("B选手下棋");
                Random r = new Random();
                int x = r.nextInt(10)+1;
                int y = r.nextInt(10)+1;
                if (pan(x,y)){
                    Util.yin("请输入棋盘范围内的数字!");
                    continue;
                }
                if (pan1(x,y)){
                    Util.yin("这个位置上已经有一个棋子了");
                    continue;
                }else {
                    zi[x-1][y-1] = "●";
                    qi();
                    boolean g = shangxia(x,y,zi[x-1][y-1]+"");
                    boolean g1 = zuoyou(x,y,zi[x-1][y-1]+"");
                    boolean g2 = zuoshang(x,y,zi[x-1][y-1]+"");
                    boolean g3 = zuoxia(x,y,zi[x-1][y-1]+"");
                    if (g || g1 || g2 || g3){
                        System.out.println("B选手胜利");
                        break;
                    }
                }
            }
            tuo = !tuo;// !是取反的意思,每当一个玩家下完棋后这里的值会从true变为false,再从false变为true,反复循环,之道一方玩家胜利。
        }
    }
    // 这个方法是用来判断棋子是否超出范围 ,一但输入的数值超出范围,返回true,实行重新输入。
    public static boolean pan(int x, int y){
        if ( x > 10 || y >10 || x < 1 || y <1){
            return true;
        }
        return false;
    }
    // 这个方法是用来判断位置上是否有棋子 ,一但有棋子,返回true,实行重新输入。
    public static boolean pan1(int x,int y){
        if (zi[x-1][y-1].equals("⚪") || zi[x-1][y-1].equals("●")){
            return true;
        }
        return false;
    }
    //这个方法是用来判断左右五子是否相连。
    public static boolean zuoyou(int x,int y,String s){
        int n = 0;   // 声明一个变量,当判断到5个子相连就返回true。
        for (int i = 1; i < 5; i++) {  // 这个判断五子棋左边是否有4个棋子。
            if (y-i>0){
                if (zi[x-1][(y-1)-i].equals(s)){ // 判断左边相连 y 每次循环自然要减1。
                    n++;               // 如果有棋子,n就会加1,反之n就不会加1
                }else {
                    break;// 当判断到左边只有1个或2个棋子相连的棋子,再往左碰见不一样的棋子或没有棋子时,结束循环。因为后面不用在判断了
                }         // 只需要判断相连的棋子,没有相连的棋子不需要判断。所有判断方向上的棋子相连,都是这个逻辑。
            }
        }
        for (int i = 1; i < 5; i++) { // 这个判断五子棋右边是否有4个棋子。
            if ((y-1)+i<10){
                if (zi[x-1][(y-1)+i].equals(s)){// 判断右边相连 y 每次循环自然要加1。
                    n++;
                }else {
                    break;
                }
            }
        }
        if (n >= 4){ // 当左边有4个或右边有4个或左右合起来有4个的时候,返回true,玩家胜利
            return true;
        }
        return false; // 反之当没有4个的时候 返回false 判断其他方法是否胜利。
    }
    //这个方法是用来判断上下是否相连
    public static boolean shangxia(int x,int y,String s){
        int n = 0;
        for (int i = 1; i < 5; i++) { // 这个判断五子棋上方是否有4个棋子。
            if (x-i>0){
                if (zi[(x-1)-i][(y-1)].equals(s)){// 判断上边相连 x 每次循环自然要减1。
                    n++;
                }else {
                    break;
                }
            }
        }
        for (int i = 1; i < 5; i++) { // 这个判断五子棋下方是否有4个棋子。
            if ((x-1)+i<10){
                if (zi[(x-1)+i][(y-1)].equals(s)){// 判断下边相连 x 每次循环自然要加1。
                    n++;
                }else {
                    break;
                }
            }
        }
        if (n >= 4){
            return true;
        }
        return false;
    }
    //这个方法是用来判断上左下右是否相连
    public static boolean zuoshang(int x,int y,String s){
        // 道理与横竖一样,每次判断变为x+1、y+1或x-1、y-1。
        int n = 0;
        for (int i = 1; i < 5; i++) {
            if (x-i>0 && y-i>0){
                if (zi[(x-1)-i][(y-1)-i].equals(s)){ 
                    n++;
//                    System.out.println(n);
                }else {
                    break;
                }
            }
        }
        for (int i = 1; i < 5; i++) {
            if ((x-1)+i<10 && (y-1)+i<10){
                if (zi[(x-1)+i][(y-1)+i].equals(s)){
                    n++;
//                    System.out.println(n);
                }else {
                    break;
                }
            }
        }
        if (n >= 4){
            return true;
        }
        return false;
    }
    //这个方法是用来判断上右下左是否相连
    public static boolean zuoxia(int x,int y,String s){
        // 道理与横竖一样,每次判断变为x+1、y-1或x-1、y+1。
        int n = 0;
        for (int i = 1; i < 5; i++) {
            if (y-i>0 && (x-1)+i<10){
                if (zi[(x-1)+i][(y-1)-i].equals(s)){
                    n++;
//                                System.out.println(n);
                }else {
                    break;
                }
            }
        }
        for (int i = 1; i < 5; i++) {
            if (x-i>0 && (y-1)+i<10){
                if (zi[(x-1)-i][(y-1)+i].equals(s)){
                    n++;
//                                System.out.println(n);
                }else {
                    break;
                }
            }
        }
        if (n >= 4){
            return true;
        }
        return false;
    }

}

结果

 0  1  2  3  4  5  6  7  8  9  10  
1	+  +  +  +  +  +  +  +  +  +  
2	+  +  +  +  +  +  +  +  +  +  
3	+  +  +  +  +  +  +  +  +  +  
4	+  +  +  +  +  +  +  +  +  +  
5	+  +  +  +  +  +  +  +  +  +  
6	+  +  +  +  +  +  +  +  +  +  
7	+  +  +  +  +  +  +  +  +  +  
8	+  +  +  +  +  +  +  +  +  +  
9	+  +  +  +  +  +  +  +  +  +  
10	+  +  +  +  +  +  +  +  +  + 
........
B选手下棋
 0  1  2  3  4  5  6  7  8  9  10  
1	⚪  +  ●  ⚪  ●  ⚪  ●  ⚪  ⚪  +  
2	+  +  ⚪  ⚪  ⚪  +  ⚪  +  +  ⚪  
3	+  +  ●  ●  +  ⚪  ⚪  ●  ●  ⚪  
4	⚪  ●  +  +  +  ⚪  +  +  ●  ●  
5	●  +  ●  +  +  +  ●  +  +  +  
6	⚪  ●  +  +  ⚪  ●  +  ⚪  ●  +  
7	⚪  +  ●  ●  ●  ⚪  ●  ●  ●  ⚪  
8	+  ⚪  +  ●  ⚪  ⚪  +  +  +  +  
9	⚪  +  ⚪  +  ●  +  ⚪  ⚪  ●  ●  
10	●  ●  ●  ⚪  +  +  +  +  +  +  
B选手胜利

好吧,其实只是加了一个随机数而已,但每次看结果都竟然大战了两百回合也是让人意想不到,这个五子棋方法重点只是为了测试写出的五子棋是否有各式各样的bug,方便我们发现问题,解决问题,当测试没有问题的时候,就找个小伙伴一起玩耍吧。

上一篇:Java如何学习,学习什么?


下一篇:树的子结构