五子棋(Java实现)

import java.util.Scanner;

/**
 * 五子棋
 */

public class Gobang {
    public  static  char[][] chessbord = {
            {'┌','┬','┬','┬','┬','┬','┬','┬','┬','┐'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'└','┴','┴','┴','┴','┴','┴','┴','┴','┘',}
    };
    public static  String separator = "────";
    public static char pieceA='○';//玩家A的棋子
    public static char pieceB='■';
    public static int times = 0;//记录棋盘使用次数,偶数次玩家A落子,奇数次玩家B落子
    public static void main(String[] args) {
//        System.out.println("┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐");
//        System.out.println("│    │    │    │    │    │    │    │    │    │    │");
//        System.out.println("├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤");
//        System.out.println("│    │    │    │    │    │    │    │    │    │    │");
//        System.out.println("├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤");
//        System.out.println("│    │    │    │    │    │    │    │    │    │    │");
//        System.out.println("├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤");
//        System.out.println("│    │    │    │    │    │    │    │    │    │    │");
//        System.out.println("├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤");
//        System.out.println("│    │    │    │    │    │    │    │    │    │    │");
//        System.out.println("├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤");
//        System.out.println("│    │    │    │    │    │    │    │    │    │    │");
//        System.out.println("├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤");
//        System.out.println("│    │    │    │    │    │    │    │    │    │    │");
//        System.out.println("├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤");
//        System.out.println("│    │    │    │    │    │    │    │    │    │    │");
//        System.out.println("├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤");
//        System.out.println("│    │    │    │    │    │    │    │    │    │    │");
//        System.out.println("├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤");
//        System.out.println("│    │    │    │    │    │    │    │    │    │    │");
//        System.out.println("└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘");
//
//        System.out.println("============================================================");
        showChessBoard();
        int totalPosition =chessbord.length*chessbord[0].length;
        Scanner sc = new Scanner(System.in);
        outer:
        while(times<totalPosition){//交替落子
            System.out.println(times%2==0 ? "请玩家A落子:":"请玩家B落子:");
            char currentPiece = (times % 2 ==0) ? pieceA : pieceB;//当前使用的棋子
            while(true){//保证落子成功的循环
                //检测Scanner中是否有输入数据并且判断数据是否为整数,如果没有数据,就需要从控制台输入
                 if(sc.hasNextInt()){
                     int position = sc.nextInt();
                     if(position>=0&&position<totalPosition)
                     {

                         int row = position /chessbord.length;//位置除以棋盘数组的长度得到行号
                         int col = position %chessbord[0].length;
                         if(chessbord[row][col]==pieceA||chessbord[row][col]==pieceB)
                         {
                             System.out.println("非法落子,请重新选择落子的位置");
                             continue;
                         }
                         else{
                             chessbord[row][col]=currentPiece;
                             break;}

                     }else{
                         System.out.println("非法落子,请重新选择落子位置");
                     }
                 }
                 else
                 {
                     System.out.println("非法落子,请重新选择落子位置");
                     sc.next();//将Scanner中 存储的数据取出来防止死循环
                 }

            }
            //落子完成后棋盘需要重新展示
            showChessBoard();
            //获胜情况,一共四种
            for(int i=0;i<chessbord.length;i++)
            {
                for(int j=0;j<chessbord[i].length;j++)
                {
                    //第一种是水平方向上存在同一玩家的连续五颗棋子
                    //
                    boolean case1 = (j+4<chessbord[i].length)
                            && chessbord[i][j]==currentPiece
                            && chessbord[i][j+1]==currentPiece
                            && chessbord[i][j+2]==currentPiece
                            && chessbord[i][j+3]==currentPiece
                            && chessbord[i][j+4]==currentPiece;
                    //第二种垂直方向连续五颗棋子
                    //
                    boolean case2 = (i+4<chessbord.length)//总行数
                            && chessbord[i][j]==currentPiece
                            && chessbord[i+1][j]==currentPiece
                            && chessbord[i+2][j]==currentPiece
                            && chessbord[i+3][j]==currentPiece
                            && chessbord[i+4][j]==currentPiece;
                    //第三种:135度角上存在同一玩家的连续五颗棋子
                    //(i,j)(i+1,j+1)(i+2,j+2)(i+3,j+3)(i+4,j+4)
                    boolean case3 = (i+4<chessbord.length)
                            && (j+4<chessbord[i].length)
                            && chessbord[i][j] ==currentPiece
                            && chessbord[i+1][j+1] ==currentPiece
                            && chessbord[i+2][j+2] ==currentPiece
                            && chessbord[i+3][j+3] ==currentPiece
                            && chessbord[i+4][j+4] ==currentPiece;
                    //第四种:45度角上存在同一玩家的连续五颗棋子
                    //(i,j)(i-1,j+1)(i-2,j+2)(i-3,j+3)(i-4,j+4)
                    boolean case4 = (i>4)&&(j+4<chessbord[i].length)
                            &&chessbord[i][j]==currentPiece
                            &&chessbord[i-1][j+1]==currentPiece
                            &&chessbord[i-2][j+2]==currentPiece
                            &&chessbord[i-3][j+3]==currentPiece
                            &&chessbord[i-4][j+4]==currentPiece;
                    if(case1||case2||case3||case4){
                        System.out.println(times%2==0 ? "玩家A获得胜利":"玩家B获得胜利");
                        break outer;
                    }
                }
            }
            //第一种是水平方向上存在同一玩家的连续五颗棋子
            times++;
        }
        if(times==totalPosition){//说明棋盘已经用完还未分出胜负
            System.out.println("平局");
        }
    }
    public  static void showChessBoard(){
        System.out.println("  0    1    2    3    4    5    6    7    8    9");
        for(int i=0;i<chessbord.length;i++){//外层循环控制行
            System.out.print(i+" ");
            for(int j=0;j<chessbord[i].length;j++){
                if(j==chessbord[i].length-1){System.out.print(chessbord[i][j]);}//使用print打印,不换行
                else{System.out.print(chessbord[i][j]+separator);}
            }
            System.out.println();
            if(i<chessbord.length-1){//排除最后一行
                System.out.println("  │    │    │    │    │    │    │    │    │    │");
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值