admin管理员组

文章数量:1621658

五子棋案例

1.完成棋盘的基本布局

需要利用到二维数组的知识,二维数组的命名,初始化,赋值输出等;

2.对五子棋的各个功能进行设计

需要利用for,while循环等循环控制语句的知识,还有方法的设计,组合

3.设计过程(主要为判断某一方胜利的方法设计)

五子棋规则:黑子或白字中同色的五枚棋子连成一条线(可以为行列或斜线)
两种思路:
1.遍历棋盘的每个位置,判断每个位置上是否有满足一方胜利的条件(黑子或白字中同色的五枚棋子连成一条线(可以为行列或斜线),并利用计数器累计某位置上行列斜线连线棋子的个数;
2.通过对落子位置棋子的左右,上下,斜上方斜下方的同色棋子个数是否满足胜利条件来判断(该方法可有效的降低代码时间复杂度,但过于繁杂,不利于算法设计);
下列为方法一的具体实现:

方法如下

public class QiDemo {
    static char[] num = {'⒈', '⒉', '⒊', '⒋', '⒌', '⒍', '⒎', '⒏', '⒐', '⒑', '⒒', '⒓', '⒔', '⒕', '⒖'};
    static char black = '★';
    static char white = '☆';
    static char line = '十';
    char[][] a = new char[15][15];//设计15*15的棋盘;
    boolean flag = true;

    public void Init() {//棋盘初始化;
        for (int i = 0; i < 14; i++) {
            for (int j = 0; j < 14; j++) {
                a[i][j] = line;
            }
        }
        for (int i = 0; i < 15; i++) {
            a[i][14] = num[i];
            a[14][i] = num[i];
        }
    }

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

    public boolean Out(char a[][], int x, int y) {//是否能落子的基本判断(是否已经有棋子在该位置,或超出棋盘限制)
        if (x >= 0 && x < 15 && y >= 0 && y <= 15 && a[x][y] == '十')
            return true;
        else {
            return false;
        }
    }
/*判断某一方胜利的基本算法思路
  五子棋规则:黑子或白字中同色的五枚棋子连成一条线(可以为行列或斜线)
  两种思路:
  1.遍历棋盘的每个位置,判断每个位置上是否有满足一方胜利的条件(黑子或白字中同色的五枚棋子连成一条线(可以为行列或斜线),并利用计数器累计某位置上行列斜线连线棋子的个数;
  2.通过对落子位置棋子的左右,上下,斜上方斜下方的同色棋子个数是否满足胜利条件来判断(该方法可有效的降低代码时间复杂度,但过于繁杂,不利于算法设计);
 下列为方法一的具体实现:
*/
    public void BWin(char [][]a) {//判断黑棋胜利的基本算法
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                int hang = 0, lie = 0, xie = 0;
                for (int k = 0; k < 5; k++) {//五子棋的基本规则(五子成线)
                    if (a[i][j + k] == black) hang++;
                    if (a[i + k][j] == black) lie++;
                    if (a[i + k][j + k] == black) xie++;
                }
                if (hang == 5 || lie == 5 || xie == 5) {//利用计数器来简化代码
                    flag = false;
                    System.out.println("黑棋赢了");
                }
            }
        }
    }
    public void WWin(char [][]a) {//判断白棋胜利的基本算法
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                int hang = 0, lie = 0, xie = 0;
                for (int k = 0; k < 5; k++) {
                    if (a[i][j + k] == white) hang++;
                    if (a[i + k][j] == white) lie++;
                    if (a[i + k][j + k] == white) xie++;
                }
                if (hang == 5 || lie == 5 || xie == 5) {
                    flag = false;
                    System.out.println("白棋赢了");
                }
            }
        }
    }


    public void W(char [][]a,int x,int y) {//在指定位置落子黑棋
        a[x][y]=white;
    }
    public void B(char [][]a,int x,int y) {//在指定位置落子白棋
        a[x][y]=black;
    }
    }

主函数如下

import java.util.Scanner;

public class Qi {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        QiDemo q = new QiDemo();//创建对象;
        q.Init();//初始化棋盘;
        q.Myprint();//打印初始化的棋盘;
        while (q.flag) {//(以某一方胜利)控制是否继续进行;
            int x, y;
            System.out.println("黑子下");
            if (q.flag) {
                while (true) {
                    x = sc.nextInt();
                    y = sc.nextInt();
                    if (q.Out(q.a, x, y)) {//判断该位置(x,y)是否可以落子(是否已经有棋子在该位置,或超出棋盘限制)
                        q.B(q.a, x, y);
                        q.Myprint();
                        q.BWin(q.a);
                        break;
                    } else {
                        System.out.println("输入错误重新输入");
                        continue;
                    }
                }
            }
            if (q.flag) {//重复
                while (true) {
                    System.out.println("白子下");
                    x = sc.nextInt();
                    y = sc.nextInt();
                    if (q.Out(q.a, x, y)) {
                        q.W(q.a, x, y);
                        q.Myprint();
                        q.WWin(q.a);
                        break;
                    } else {
                        System.out.println("输入错误重新输入");
                        continue;
                    }
                }
            }

        }
    }
}

本文标签: 五子案例