JAVA 五子棋(人机)昨天买的棋子今天就用不上了

五子棋 JAVA

首先我们应该思考五子棋是由哪些东西组成的

1、棋盘,假设我们要创建一个10*10的棋盘,应该使用数组且为二维数组

public class QP {
   static String[][]a=new String[10][10];
    public static void main(String[] args) {
      Qi();
      Pan();
      Zi();
    }

由于下面要创建方法,为了方便,将数组定义为成员变量

 public static void Qi(){
        for (int i = 0; i <a.length; i++) {
            for (int j = 0; j <a[i].length ; j++) {
                a[j][i]="+";
            }System.out.println();
        }
    }

创建一个方法使其循环

第一个循环代表的是打印的行数比数组长度少一行

第二个循环代表每一行打印多少个

定义a [j] [i]="+";然后让他们换行

出来的效果就是在数组中将"+"存进去

 public static void Pan(){
        for (int i = 0; i <a.length; i++) {
            for (int j = 0; j <a[i].length ; j++) {
                System.out.print(a[j][i]+"\t");
            }System.out.println();
        }
    }

接着在创建一个方法,让他能够调用数组里存的"+",并将他显示出来,至此棋盘创建成功

2、接下来就是要开始下子了

单独创建一个方法

我们来分析一下下子的逻辑

首先下子要分为两方对弈,所以会有前后两次的输入来在棋盘上确认一点然后完成下子

其次下的子肯定不能重复下在同一个坐标上

比如下了一个黑子坐标(1,,1),接着又下了一个白子坐标也是(1,1)

那么要判定(1,1)这个坐标到底是哪种颜色的子呢?所以不能下在同一个坐标,也不能下出棋盘

 public static void Zi(){
        Scanner s = new Scanner(System.in);
        boolean flag = true;
         int x = 0;
         int y = 0;
        while (true){
            if (flag){
                System.out.println("空心先下");
                 x = s.nextInt();
                 y = s.nextInt();
                if (x>10||x<1||y>10||y<1){
                    System.out.println("重新输入");
                    continue;
                }
                if (!a[y-1][x-1].equals("○")&&!a[y-1][x-1].equals("●")){
                    a[y-1][x-1] = "○";
                }else {

                    System.out.println("重新输入");
                    continue;
                }
            }else {
                System.out.println("实心后下");
                 x = s.nextInt();
                 y = s.nextInt();
                if (x>10||x<1||y>10||y<1){
                    System.out.println("重新输入");
                    continue;
                }
                if (!a[y-1][x-1].equals("○")&&!a[y-1][x-1].equals("●")){
                    a[y-1][x-1] = "●";
                }else {
                    System.out.println("重新输入");
                    continue;
                }
            }
            Pan();
            flag = !flag;

先创建一个布尔类型boolean flag = true;

再创建一个while死循环,一直为true

[y-1] [x-1]是因为我们按照习惯输入的数肯定是从1开始的,但是[y-1]是数组的下标,数字中的0,可以看作平常的1,所以要把输入的x,y坐标都减一,这样才能正确找到相应数组的下标

循环内有两种情况,一种是flag = true时,白子下

要先判断他能下坐标的范围,也就是横坐标大于1,小于10,纵坐标大于1,小于10的时候输出“重新输入”并且下边的代码都不执行,判断输入的坐标里不是黑子,也不是白子,也就是"+";那么下白子,如果棋盘上不是"+";要重新输入,并且下面的代码不执行

flag = false,黑子下

原理与判断白子相同

每次下子都重新打印棋盘

每次循环 flag = !flag,也就是每次进入循环的值都不一样,一次为true,下一次就是false,就会形成白子下一次,黑子下一次

接着就是判断输赢

要判断输赢,我们要明白赢的方式有哪些

一、五个相同的棋子连成一条线

二、横着连五个

三、竖着连五个

四、斜着连五个——1、左边在上右边在下的连五子 2、左边在下右边在上的连五子

也就是会有四种情况来判断赢

我们每一种情况都创建一个方法

横着连五个

public static boolean Ying(int x,int y,String s){
        int count = 1;
        int i = x;
        int j = y-1;
        for (; j >=0 ; j--) {
            if (a[j][i].equals(s)){
                count++;
            }else{
                break;
            }
        }
        int k = y+1;
        for (; k <=9 ; k++) {
            if (a[k][i].equals(s)){
                count++;
            }else{
                break;
            }
        }
        if (count>=5){
            System.out.println("win");
            return true;
        }
        return false;
    }

横着连五个又有两种判断

1、判断以一个子为原点向左找是否连成5个,但是不能小于0,判断成功,那么这个坐标的左边是和他相同的棋子,棋子连成的长度加一

在这里插入图片描述

2、判断以一个子为原点向右找是否连成5个,但是不能大于9,判断成功,那么这个坐标的左边是和他相同的棋子,棋子连成的长度加一
在这里插入图片描述

如果棋子连成的长度大于等于5,那么就是这种棋子赢,如果是,就停止这个程序

竖着连五个

public static boolean Ying1(int x,int y,String s){
        int count = 1;
        int i = x-1;
        int j = y;
        for (; i >=0 ; i--) {
            if (a[j][i].equals(s)){
                count++;
            }else{
                break;
            }
        }
        int k = x+1;
        for (; k <=9 ; k++) {
            if (a[j][k].equals(s)){
                count++;
            }else{
                break;
            }
        }
        if (count>=5){
            System.out.println("win");
            return true;
        }
        return false;
    }

竖着连五个又有两种判断

1、判断以一个子为原点向上找是否连成5个,但是不能小于0,判断成功,那么这个坐标的上边是和他相同的棋子,棋子连成的长度加一
在这里插入图片描述

2、判断以一个子为原点向下找是否连成5个,但是不能大于9,判断成功,那么这个坐标的下边是和他相同的棋子,棋子连成的长度加一
在这里插入图片描述

如果棋子连成的长度大于等于5,那么就是这种棋子赢,如果是,就停止这个程序


左边在上右边在下的连五子

 public static boolean Ying2(int x,int y,String s){
        int count = 1;
        int i = x-1;
        int j = y-1;
        for (; i >=0&& j>=0; i--,j--) {
            if (a[j][i].equals(s)){
                count++;
            }else{
                break;
            }
        }
        int k = x+1;
        int z = y+1;
        for (; k <=9 &&z<=9; k++,z++) {
            if (a[z][k].equals(s)){
                count++;
            }else{
                break;
            }
        }
        if (count>=5){
            System.out.println("win");
            return true;
        }
        return false;
    }

我们来看一下这种判断方式

也是以一个子为原点来判断他相邻的那个棋子是不和他一样

左上

就是x坐标,y坐标同时减一来判断相邻在这里插入图片描述

右下

就是x坐标,y坐标同时加一来判断相邻在这里插入图片描述

如果判断五个相同的连在一起,就判赢


左边在下右边在上的连五子

 public static boolean Ying3(int x,int y,String s){
        int count = 1;
        int i = x-1;
        int j = y+1;
        for (; i >=0&&j<=9 ; i--,j++) {
            if (a[j][i].equals(s)){
                count++;
            }else{
                break;
            }
        }
        int k = x+1;
        int z = y-1;
        for (; k <=9 && z>=0; k++, z--) {
            if (a[z][k].equals(s)){
                count++;
            }else{
                break;
            }
        }
        if (count>=5){
            System.out.println("win");
            return true;
        }
        return false;
    }
}

左下

x坐标减一,y坐标加一在这里插入图片描述

右上

x坐标加一,y坐标减一在这里插入图片描述

至此有了四种判断方式,任意一种判断出为赢就可以结束程序了
完整程序如下

import jdk.nashorn.internal.ir.ContinueNode;

import java.util.Scanner;

public class QP {
   static String[][]a=new String[10][10];
    public static void main(String[] args) {
      Qi();
      Pan();
      Zi();
    }

    public static void Qi(){
        for (int i = 0; i <a.length; i++) {
            for (int j = 0; j <a[i].length ; j++) {
                a[j][i]="+";
            }System.out.println();
        }
    }

    public static void Pan(){
        for (int i = 0; i <a.length; i++) {
            for (int j = 0; j <a[i].length ; j++) {
                System.out.print(a[j][i]+"\t");
            }System.out.println();
        }
    }
    public static void Zi(){
        Scanner s = new Scanner(System.in);
        boolean flag = true;
         int x = 0;
         int y = 0;
        while (true){
            if (flag){
                System.out.println("空心先下");
                 x = s.nextInt();
                 y = s.nextInt();
                if (x>10||x<1||y>10||y<1){
                    System.out.println("重新输入");
                    continue;
                }
                if (!a[y-1][x-1].equals("○")&&!a[y-1][x-1].equals("●")){
                    a[y-1][x-1] = "○";
                }else {

                    System.out.println("重新输入");
                    continue;
                }
            }else {
                System.out.println("实心后下");
                 x = s.nextInt();
                 y = s.nextInt();
                if (x>10||x<1||y>10||y<1){
                    System.out.println("重新输入");
                    continue;
                }
                if (!a[y-1][x-1].equals("○")&&!a[y-1][x-1].equals("●")){
                    a[y-1][x-1] = "●";
                }else {
                    System.out.println("重新输入");
                    continue;
                }
            }
            Pan();
            flag = !flag;
            boolean res = Ying(x-1,y-1,a[y-1][x-1]);
            if (res){
                break;
            }
            boolean res1 = Ying1(x-1,y-1,a[y-1][x-1]);
            if (res1){
                break;
            }
            boolean res2 = Ying2(x-1,y-1,a[y-1][x-1]);
            if (res2){
                break;
            }
            boolean res3 = Ying3(x-1,y-1,a[y-1][x-1]);
            if (res3){
                break;
            }
        }
    }

    public static boolean Ying(int x,int y,String s){
        int count = 1;
        int i = x;
        int j = y-1;
        for (; j >=0 ; j--) {
            if (a[j][i].equals(s)){
                count++;
            }else{
                break;
            }
        }
        int k = y+1;
        for (; k <=9 ; k++) {
            if (a[k][i].equals(s)){
                count++;
            }else{
                break;
            }
        }
        if (count>=5){
            System.out.println("win");
            return true;
        }
        return false;
    }


    public static boolean Ying1(int x,int y,String s){
        int count = 1;
        int i = x-1;
        int j = y;
        for (; i >=0 ; i--) {
            if (a[j][i].equals(s)){
                count++;
            }else{
                break;
            }
        }
        int k = x+1;
        for (; k <=9 ; k++) {
            if (a[j][k].equals(s)){
                count++;
            }else{
                break;
            }
        }
        if (count>=5){
            System.out.println("win");
            return true;
        }
        return false;
    }

    public static boolean Ying2(int x,int y,String s){
        int count = 1;
        int i = x-1;
        int j = y-1;
        for (; i >=0&& j>=0; i--,j--) {
            if (a[j][i].equals(s)){
                count++;
            }else{
                break;
            }
        }
        int k = x+1;
        int z = y+1;
        for (; k <=9 &&z<=9; k++,z++) {
            if (a[z][k].equals(s)){
                count++;
            }else{
                break;
            }
        }
        if (count>=5){
            System.out.println("win");
            return true;
        }
        return false;
    }


    public static boolean Ying3(int x,int y,String s){
        int count = 1;
        int i = x-1;
        int j = y+1;
        for (; i >=0&&j<=9 ; i--,j++) {
            if (a[j][i].equals(s)){
                count++;
            }else{
                break;
            }
        }
        int k = x+1;
        int z = y-1;
        for (; k <=9 && z>=0; k++, z--) {
            if (a[z][k].equals(s)){
                count++;
            }else{
                break;
            }
        }
        if (count>=5){
            System.out.println("win");
            return true;
        }
        return false;
    }
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值