java二维数组应用——五子棋

二维数组应用——五子棋

import java.util.Scanner;

public class GoBang {


    public static void main(String[] args) {
        //棋盘设置
        //棋盘长度
        int len=21;
        //棋盘容器(二维数组,动态初始化)
        String[][] goBang=new String[len][len];
        //棋盘的符号
        String add = "┼";//╋
        String black = "●";
        String white = "○";
        String[] indexs = {"⒈","⒉","⒊","⒋","⒌","⒍","⒎","⒏","⒐","⒑","⒒","⒓","⒔","⒕","⒖","⒗","⒘","⒙","⒚","⒛","21"};

        //初始化棋盘数组
        for(int i=0;i<goBang.length;i++){
            for(int j=0;j<goBang[i].length;j++){
                if(j==goBang[i].length-1){//在棋盘的最后一列标明行数
                    goBang[i][j]=indexs[i];
                }else if(i==goBang[i].length-1){//在棋盘的最后一行标明列数
                    goBang[i][j]=indexs[j];
                }else {
                    goBang[i][j]=add;
                }
            }
        }


        //输出棋盘看效果
        for (String[] gobang1:goBang) {
            for (String element:gobang1) {
                System.out.print(element);
            }
            System.out.println();
        }

        //输入
        Scanner scan= new Scanner(System.in);
        //设置棋子状态
        boolean gobang=true;//true为黑子,false为白子。
        //控制循环的变量
        boolean flag=true;


        //循环
        while(flag){
            System.out.println("请"+((gobang)?"黑":"白")+"子输入落子坐标:");
            int x=scan.nextInt()-1;//行,-1是因为数组从0开始,我们输入坐标是从1开始
            int y=scan.nextInt()-1;//列

            //输入坐标不在棋盘上
            if(x<0||x>len-2||y<0||y>len-2){//为什么不是len-1,因为len-1标明了行列数。
                System.out.println("落子失败—输入坐标超出棋盘范围");
                continue;
            }

            //落子的坐标已有棋子
            if(!goBang[x][y].equals(add)){
                System.out.println("落子失败—输入坐标已有棋子");
                continue;
            }


            //落子
            goBang[x][y]=((gobang?black:white));

            //打印棋盘
            for (String[] gobang1:goBang) {
                for (String element:gobang1) {
                    System.out.print(element);
                }
                System.out.println();
            }


            //判断输赢
            int isWin=result(goBang);
            if(isWin==1){
                System.out.println("黑子胜利!!");
                break;
            }else if(isWin==2){
                System.out.println("白子胜利!!");
                break;
            }

            //棋子置反
            gobang=!gobang;

        }




        //关闭资源
        scan.close();



    }



    //判断输赢
    public static int result(String[][] goBang){
        int flag=0;//1为黑子胜利,2为白子胜利。

        //横向扫描
        for(int i=0;i<goBang.length-1;i++){
            int count=1;
            String temp=goBang[i][0];//每行的第一个元素,可以为加号
            for(int j=1;j<goBang[i].length-1;j++){
                if(goBang[i][j]==temp){
                    count++;
                }else{
                    count=1;//重新计数
                    temp=goBang[i][j];
                }

                if(count==5&&temp=="●"){
                    //黑子胜利
                    flag=1;
                }

                if(count==5&&temp=="○"){
                    //白子胜利
                    flag=2;
                }
            }

        }


        //纵向扫描
        for(int j=0;j<goBang.length-1;j++){
            int count=1;
            String temp=goBang[0][j];//每列的第一个元素,可以为加号
            for(int i=1;i<goBang[j].length-1;i++){
                if(goBang[i][j]==temp){
                    count++;
                }else{
                    count=1;//重新计数
                    temp=goBang[i][j];
                }

                if(count==5&&temp=="●"){
                    //黑子胜利
                    flag=1;
                }

                if(count==5&&temp=="○"){
                    //白子胜利
                    flag=2;
                }
            }

        }


        //西北到东南方向\
        for(int i=0;i<goBang.length-1-4;i++) {
            int count = 1;
            String temp = goBang[i][0];//每行的第一个元素,可以为加号
            int x = i;
            int y = 0;
            for (int j = 1; j < goBang[i].length - i; j++, x++, y++) {
                if (goBang[x + 1][y + 1] == temp) {
                    count++;
                } else {
                    count = 1;//重新计数
                    temp = goBang[x + 1][y + 1];
                }

                if (count == 5 && temp == "●") {
                    //黑子胜利
                    flag = 1;
                }

                if (count == 5 && temp == "○") {
                    //白子胜利
                    flag = 2;
                }
            }
        }

        for(int j=0;j<goBang.length-1-4;j++) {
            int count = 1;
            String temp = goBang[0][j];//每行的第一个元素,可以为加号
            int x = 0;
            int y = j;
            for (int i = 1; i < goBang[j].length - j; i++, x++, y++) {
                if (goBang[x + 1][y + 1] == temp) {
                    count++;
                } else {
                    count = 1;//重新计数
                    temp = goBang[x + 1][y + 1];
                }

                if (count == 5 && temp == "●") {
                    //黑子胜利
                    flag = 1;
                }

                if (count == 5 && temp == "○") {
                    //白子胜利
                    flag = 2;
                }
            }
        }



        //东北到西南方向/
        for(int i=4;i<goBang.length-1;i++) {
            int count=1;
            String temp = goBang[i][0];//每行的第一个元素,可以为加号
            int x = i;
            int y = 0;
            for (int j = 1; j < i+1; j++, x--, y++) {

                if (goBang[x - 1][y + 1] == temp) {
                    count+=1;
                } else {
                    count = 1;//重新计数
                    temp = goBang[x - 1][y + 1];
                }

                if (count == 5 && temp == "●") {
                    //黑子胜利
                    flag = 1;
                }

                if (count == 5 && temp == "○") {
                    //白子胜利
                    flag = 2;
                }
            }
        }

        for(int j=0;j<goBang.length-1-4;j++) {
            System.out.print("j="+j+" ");
            int count = 1;
            String temp = goBang[goBang.length-2][j];//每行的第一个元素,可以为加号
            System.out.println("temp="+temp+" ");
            System.out.println();
            int x = goBang.length-2;
            int y = j;
            for (int i = goBang.length-2; i >j; i--, x--, y++) {
                System.out.print("("+(x-1+1)+","+(y+1+1)+")");
                System.out.println(goBang[x-1][y+1]);
                System.out.print(i+" ");
                System.out.print(temp+"  ");
                if (goBang[x - 1][y + 1] == temp) {
                    count++;
                } else {
                    count = 1;//重新计数
                    temp = goBang[x - 1][y + 1];
                }

                System.out.print(count);

                if (count == 5 && temp == "●") {
                    //黑子胜利
                    flag = 1;
                }

                if (count == 5 && temp == "○") {
                    //白子胜利
                    flag = 2;
                }


            }
        }

	 return flag;
    }
}

如有错误,欢迎指正!!!!谢谢!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值