java二维数组实现五子棋功能

本文介绍了如何使用Java编程实现五子棋游戏,包括使用二维数组存储棋盘状态,通过Scanner接收用户输入棋子坐标,以及进行越界、重复和胜利条件的判断。
摘要由CSDN通过智能技术生成

1.用二维数组存储五子棋棋盘

 2.在控制台通过Scanner输入黑白棋坐标(例如:1,2  2,1格式 表示二维数组坐标),使用实心五角星和空心五角星表示黑白棋子.

如下图:

输入后重新输出棋盘如下图:

白棋输入后如下图

 黑白棋依次重复输入下棋

3.判断棋子是否越界,棋子是否重复,判断输赢

接下来是对每个步骤的代码实现(每一步的功能我都将以一个方法来实现)

首先是前提框架的一个代码实现:

static String white = "☆";//白棋
    static String black = "★";//黑棋
    static String[][] qp = new String[15][15];//棋盘的二维数组
    static String[] num = {"⒈","⒉","⒊","⒋","⒌","⒍","⒎","⒏","⒐","⒑","⒒","⒓","⒔","⒕","⒖"};
    static String line = "十";
    static Scanner scanner=new Scanner(System.in);
    static boolean flag=true;//true黑棋下子,flase白棋下子

1.棋盘的二维数组实现代码

 //就是将+和数字连接起来
public static void init(){
        int i,j;
        for( i=0;i<qp.length;i++){
            for( j=0;j<qp[i].length;j++){
                qp[i][j]=line;
                if(j==qp[i].length-1){
                    qp[i][j]=num[i];
                }
                if(i==qp.length-1){
                    qp[i][j]=num[j];
                }
            }
        }
    }
//在将棋盘打印
 public static void print(){
        for (int i = 0; i < qp.length; i++) {
            for (int j = 0; j < qp[i].length; j++) {
                System.out.print(qp[i][j]);
            }
            System.out.println();
        }
    }

}

 2.输入位置

首先是黑棋先下子,之后判断位置是否合法,合法将对应的位置换为黑子,最后判断输赢

白棋也是这个过程(用一个flag来判断是黑棋还是白棋下棋)

   public static void play(){
        while(true){
            if(flag){
                System.out.println("欢迎来到五子棋");
                System.out.println("黑子下棋");
                System.out.println("输入行:");
                int r=scanner.nextInt()-1;
                System.out.println("输入列:");
                int c=scanner.nextInt()-1;
                //判断是否位置是否合法
                boolean result=check(r,c);
               if (result){
                   qp[r][c]=black;
                   print();
                   //判断输赢
                    boolean result1=isWin(black,r,c);
                   if(result1==true){
                       System.out.println("黑棋获胜!");
                       break;
                   }
                   flag=false;
               }
               else{
                   System.out.println("坐标越界或重复!");
               }
            }
            else{
                System.out.println("白子下棋");
                System.out.println("输入行:");
                int r=scanner.nextInt()-1;
                System.out.println("输入列:");
                int c=scanner.nextInt()-1;
                //判断是否位置是否合法
                 boolean result=check(r,c);
                if(result){
                    qp[r][c]=white;
                    print();
                    //判断输赢
                    boolean result1=isWin(white,r,c);
                    if(result1==true){
                        System.out.println("白棋获胜!");
                        break;
                    }
                    flag=true;
                }
                else{
                    System.out.println("坐标越界或重复!");
                }
            }
        }
    }

3.判断位置是否合法

 public static boolean check(int r,int c){
        if(r>qp.length || r<0 || c<0 && c>qp[1].length)//判断位置是否超出棋盘范围
        {
            return false;
        }
        else if(qp[r][c]!=line)//判断在这个位置是否已经有棋子
        {
            return false;
        }
        else{
            return true;
        }

    }

4.判断输赢

以落子为中心,在其横轴方向,纵轴方向,左上到右下,右上到左下,四个方向判断是否有五子连在一起

public static boolean isWin(String color,int r,int c){
       //横向判断
       int count=1;
       for(int i=c-1;i>=0&&qp[r][i]==color;i--){
           count++;
       }
       for(int i=c+1;i<qp[1].length&&qp[r][i]==color;i++){
           count++;
       }
       if (count >= 5){
           return true;
       }
       //纵向判断
        int count2=1;
       for(int j=r-1;j>=0&&qp[j][c]==color;j--){
           count2++;
       }
       for(int j=r+1;j< qp.length&&qp[j][c]==color;j++){
           count2++;
       }
       if(count2>=5){
           return true;
       }
       //左上到右下
        int count3=1;
        for(int i=r-1,j=c-1;i>0&&j>0&&qp[i][j]==color;i--,j--){
            count3++;
        }
        for(int i=r+1,j=c+1;i< qp.length&&j<qp[1].length&&qp[i][j]==color;i++,j++){
            count3++;
        }
        if(count3>=5){
            return true;
        }
        //右上到左下
        int count4=1;
        for (int i = r-1,j=c+1; i >0&&j<qp[1].length&&qp[i][j]==color ; i--,j++) {
            count4++;
        }
        for (int i = r+1,j=c-1; i < qp.length&&j>0&&qp[i][j]==color ; i++,j--) {
            count4++;
        }
        if(count4>=5){
            return true;
        }
        return false;
    }

最后将代码整合

public static void startGame(){
        init();//初始化棋盘
        print();//打印
        play();//开始游戏

    }

功能实现的代码都在一个file里,游戏入口在另一个file,

public class StrWZQ {
    public static void main(String[] args) {

        WZQ.startGame();//游戏入口
    }
}

代码不理解,不清楚,可以私信作者,如发现代码有错误请广大网友私信哦!!!

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

双非码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值