欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于控制台的五子棋小游戏(简易)

程序员文章站 2024-03-18 15:13:04
...

基于控制台的五子棋小游戏(简易)

展示

基于控制台的五子棋小游戏(简易)

话不多少上代码

源码:

使用:

new完直接运行

    public static void main(String[] args) {
        new GoBang();
    }

GoBang类:

import java.util.Arrays;
import java.util.Scanner;

/**
 * @Author Ma Shuai
 * @Date 2020-11-23 18:44
 * @Version 1.0
 */
public class GoBang {
    //输入的x和y坐标
    char inX;
    char inY;
    //数组坐标位置
    int x;
    int y;
    //xy轴数组
    final static char[] indexArr = {' ','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};

    //棋盘总棋子数量
    int chessNum=0;

    //棋盘初始化标识  true为初始化
    boolean flag = true;

    //判断当前是执黑还是执白  false为黑
    boolean blackWhiteFlag = false;

    //当前局是否退出  true为持续运行不退出
    boolean thisChess = true;

    //判断当前坐标可落子
    boolean checkPointFlag = true;

    char[][] goBang = null;  //棋盘数组
    Scanner sc = new Scanner(System.in); //获取键盘输入的对象

    /**
     * 构造函数作为主入口 new出来对象直接执行
     */
    GoBang(){

        while (true){
            init(); //为了可以重复开始游戏 每次开始前初始化需要的变量
            System.out.println("======================●○欢迎来到澳门皇家五子棋游戏世界○●=========================");
            System.out.println("1.开始    2.重开    3.退出");
            String in = sc.next();
            if ( "1".equals( in ) ){
                start();
            }else if( "2".equals( in ) ){
                flag = true;
                start();
            }else {
                break;
            }
        }

    }

    /**
     * 初始化棋盘和重复黑白下棋
     */
    public void start(){
        System.out.println("请落子 例如:11 1f ab 回车结束。  输入 q 结束本局。");
        if (flag){//棋盘初始化
            goBang = new char[16][16];
            for (int i = 0; i < indexArr.length; i++) {
                for (int j = 0; j < indexArr.length; j++) {
                    if ( i==0 ){
                        goBang[i][j] = indexArr[j];
                    }else if( j==0 ){
                        goBang[i][j] = indexArr[i];
                    }else {
                        goBang[i][j]= '+';
                    }
                }
            }
            flag = false;
        }
        //黑白重复下棋
        while (thisChess){
            show();
            playChess();
        }

    }

    /**
     * 判断当前是白棋执子还是黑棋执子
     */
    public void playChess(){
        if (blackWhiteFlag){
            System.out.print("白方○:");
            getChange();
            blackWhiteFlag = false;
        }else {
            System.out.print("黑方●:");
            getChange();
            blackWhiteFlag = true;
        }

    }

    /**
     * 获取是落子的坐标xy 并判断当前坐标未落子
     */
    public void getChange(){

        //getxy()返回1为结束本局循环
        if( getxy() == 1 ) return;

        //判断当前坐标可落子
        if(  checkPoint() == 1 ) return;

        change();

        //判断是否获胜
        if( checkWin() == 1 ) return;

    }

    /**
     * 获取是落子的坐标xy
     * @return 0为成功 1为退出结束本局循环
     */
    public int getxy(){
        //将玩家输入坐标转换为数组
        char[] inArr = sc.next().toCharArray();
        if ('q'==inArr[0]) {
            thisChess = false; //结束本局循环
            flag = true;//本局结束 之后棋盘需要初始化
            return 1;
        }
        inX = inArr[0];
        inY = inArr[1];
        //获取输入坐标对应的数组index
        x = Arrays.binarySearch(indexArr,inX);
        y = Arrays.binarySearch(indexArr,inY);

        return 0;
    }

    /**
     * 判断当前坐标是否可落子
     * @return 返回1表示中途结束本局游戏
     */
    public int checkPoint(){
        //保证棋子只能下在空位置即'+'位置
        while (checkPointFlag){
            if (goBang[x][y]=='+'){
                checkPointFlag = false;
            }else {
                System.out.println("此处不可落子,请重新落子!");
                System.out.println("请输入:");
                //返回1表示玩家输入了q (q为退出)
                if ( getxy() == 1 ){
                    checkPointFlag = true;
                    return 1;
                }
            }
        }
        checkPointFlag = true;
        return 0;
    }

    /**
     * 将棋盘+改为对应棋子 判断棋盘是否已满
     */
    public void change(){
        //落子操作 将当前坐标的'+' 改为blackWhiteFlag对应的玩家的棋子○●
        if (blackWhiteFlag) {
            goBang[x][y] = '○';
        }else {
            goBang[x][y] = '●';
        }
        //棋盘总棋子数加一
        chessNum++;
    }

    /**
     * 判断当前落子后是否胜利(八个方向对应四条线任意一条线五子连珠即为胜利)
     * @return 返回1表示胜利 结束本局
     */
    public int checkWin(){
        int re = 0;
        //方便玩家的可读性 从棋盘来看我们将纵向作为x 横向作为y
        //判断横向
        if(checkLine(0,-1) + checkLine(0,1)>=4) re = 1;
        //判断纵向
        else if(checkLine(-1,0) + checkLine(1,0)>=4) re = 1;
        //判断左下右上
        else if(checkLine(1,-1) + checkLine(-1,1)>=4) re = 1;
        //判断左上右下
        else if(checkLine(-1,-1) + checkLine(1,1)>=4) re = 1;
        //判断棋盘满了平局
        else if( chessNum==(goBang.length-1)*(goBang[0].length-1) ) re = 2;
        //有re不为0结束游戏
        if (re == 1){
            if (blackWhiteFlag){
                System.out.println("白棋获胜!!!!!!!");
            }else {
                System.out.println("黑棋获胜!!!!!!!");
            }
        }else if (re == 2){
            System.out.println("旗鼓相当!!!!!!");
        }
        if(re != 0){
            thisChess = false; //结束本局循环
            flag = true;//本局结束 之后棋盘需要初始化
            System.out.println("战况如下:");
            show();
        }
        return re;
    }

    public  int checkLine(int addX, int addY){
        int checkNum = 0;//记录连续子数不算当前xy子
        int checkX = x + addX;
        int checkY = y + addY;
        char blackWhite;
        if (blackWhiteFlag){
            blackWhite = '○';
        }else {
            blackWhite = '●';
        }

        //轮询查找记录连续棋子数 同时保证数组不越界
        while (checkX<goBang[0].length && checkX>0 && checkY<goBang.length && checkY>0 && goBang[checkX][checkY]==blackWhite){
            checkNum++;
            checkX = checkX + addX;
            checkY = checkY + addY;
        }

        return checkNum;
    }



    /**
     * 展示当前棋盘
     */
    public void show(){
        for (int i = 0; i < 16; i++) {
            for (int j = 0; j < 16; j++) {
                System.out.print(goBang[i][j] + " ");
            }
            System.out.println();

        }
    }

    /**
     * 初始化变量
     */
    public void init(){
        int chessNum=0;//棋盘总棋子数量
        flag = true;//棋盘初始化标识  true为初始化
        blackWhiteFlag = false;//判断当前是执黑还是执白  false为黑
        thisChess = true; //当前局是否退出  true为持续运行不退出
        checkPointFlag = true;//判断当前坐标可落子
        goBang = null;  //棋盘数组
    }
}

相关标签: java