weixin_45594779 2019-12-09 04:59 采纳率: 90.9%
浏览 509
已采纳

怎么用JAVA写一个四子棋,带解释和备注的最好是中文备注谢谢大佬

图片说明图片说明

带备注和解释哦。谢谢

  • 写回答

2条回答 默认 最新

  • 两个娃他爹 2019-12-09 10:42
    关注
    package com.neu.test;
    
    import java.util.Scanner;
    
    public class ConnectFour {
    
        private static String[][] qipan = new String[6][7];//棋盘
    
    
    
        public static String NULL_DISK = "   ";//未下子的状态
        public static String RED_DISK = " R ";//未下子的状态
        public static String YELLOW_DISK = " Y ";//未下子的状态
    
        private static boolean finished=false;//是否结束
    
        private static Disk disk;
    
    
        public static void main(String[] args) {
            initGrid();
    
            Scanner scan = new Scanner(System.in);
            while (true){
                System.out.print("请"+disk.remark+"子落子:");
                String line = scan.nextLine();
                DropDisk(line);
                if(finished){
                    break;
                }
            }
        }
    
        /**
         * 落子
         * @param loc
         */
        private static void DropDisk(String loc){
            //TODO 严格点应该再判断输入的数据格式是否符合标准,还有是否超出棋盘区域
    
    
            String[] locArr = loc.split(" ");
            int locX = Integer.valueOf(locArr[0]);
            int locY = Integer.valueOf(locArr[1]);
    
            if(qipan[locX][locY].equals(NULL_DISK)){
                qipan[locX][locY] = disk.val;
                checkWin();
                disk = disk.next();
                drawGrid();
            }else{
                System.out.println("该位置已经有棋子!!!!");
            }
    
    
        }
    
        /**
         * 检查游戏是否结束
         */
        public static void checkWin(){
            boolean keep = true;
            boolean hasBlank = false;
            for(int i=0;i<6;i++){
                if(!keep){
                    break;
                }
                for(int j=0;j<7;j++){
    
                    //向右4个子
                    try{
                        String q1 = qipan[i][j];
                        String q2 = qipan[i][j+1];
                        String q3 = qipan[i][j+2];
                        String q4 = qipan[i][j+3];
    
                        if(disk.val.equals(q1)&&disk.val.equals(q2)&&disk.val.equals(q3)&&disk.val.equals(q4)){
                            keep=false;
                            break;
                        }
                    }catch (Exception e){
                        //数组下标越界,不做处理
                    }
                    //向下4个子
                    try{
                        String q1 = qipan[i][j];
                        String q2 = qipan[i+1][j];
                        String q3 = qipan[i+2][j];
                        String q4 = qipan[i+3][j];
    
                        if(disk.val.equals(q1)&&disk.val.equals(q2)&&disk.val.equals(q3)&&disk.val.equals(q4)){
                            keep=false;
                            break;
                        }
                    }catch (Exception e){
                        //数组下标越界,不做处理
                    }
                    //右下
                    try{
                        String q1 = qipan[i][j];
                        String q2 = qipan[i+1][j+1];
                        String q3 = qipan[i+2][j+2];
                        String q4 = qipan[i+3][j+3];
    
                        if(disk.val.equals(q1)&&disk.val.equals(q2)&&disk.val.equals(q3)&&disk.val.equals(q4)){
                            keep=false;
                            break;
                        }
                    }catch (Exception e){
                        //数组下标越界,不做处理
                    }
                    //右上
                    try{
                        String q1 = qipan[i][j];
                        String q2 = qipan[i+1][j-1];
                        String q3 = qipan[i+2][j-2];
                        String q4 = qipan[i+3][j-3];
    
                        if(disk.val.equals(q1)&&disk.val.equals(q2)&&disk.val.equals(q3)&&disk.val.equals(q4)){
                            keep=false;
                            break;
                        }
                    }catch (Exception e){
                        //数组下标越界,不做处理
                    }
                    if(NULL_DISK.equals(qipan[i][j])){
                        //判断是否还有空位,有就可以继续下
                        hasBlank = true;
                    }
                }
            }
    
            if(!keep){
                System.out.println(disk.remark+"子获胜,游戏结束!");
                finished = true;
            }else{
                if(!hasBlank){
                    System.out.println("棋盘已满,平局,游戏结束!");
                    finished = true;
                }
            }
    
        }
        /**
         * 将下好子的棋盘打印出来
         */
        public static void drawGrid(){
            for(int i=0;i<6;i++){
                System.out.print("|");
                for(int j=0;j<7;j++){
                    System.out.print(qipan[i][j]+"|");
                }
                System.out.println();
            }
        }
    
        /**
         * 棋盘初始化
         */
        private static void initGrid(){
            System.out.println("初始化棋盘,请稍后...");
            for(int i=0;i<6;i++){
                for(int j=0;j<7;j++){
                    qipan[i][j] = NULL_DISK;
                }
            }
            disk = new Disk();
            drawGrid();
    
            System.out.println("棋盘准备完毕!!!");
            System.out.println("规则:");
            System.out.println("在控制台输入要落子的坐标,两个坐标中间用一个空格隔开,如  2 3   输入完毕后回车键进入下一方落子 ");
            System.out.println("--------------------------------------");
        }
    }
    
    /**
     * 棋子
     */
    class Disk{
    
        public String val;
        public String remark;
    
        public Disk(){
            this.remark = "红";
            this.val = ConnectFour.RED_DISK;
        }
    
    
        public Disk next(){
            Disk nextDisk = new Disk();
            if(this.val.equals(ConnectFour.RED_DISK)){
                nextDisk.remark = "黄";
                nextDisk.val = ConnectFour.YELLOW_DISK;
            }
            return nextDisk;
        };
    
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?