Java五子棋小游戏(控制台纯算法)

Java五子棋小游戏


2.0版本,增加Ai机器人算法,优化一些小bug,点击进入


一边写一边修复BUG感觉写完快吐血了
奋斗了将近3个小时多,终于搞定了
没有加UI还是,但还是勉强可以玩

下面是Java代码

import java.util.Scanner;

/**
 * 控制台五子棋游戏
 */
public class Gobang {
    private boolean gameover = false;
    //15*15棋盘
    private char[][] table = new char[16][16];
    //两个玩家
    private Player p1,p2;
    //回合
    private int huihe = 0;


    public void createGame(Player p1,Player p2){
        this.p1=p1;
        this.p2=p2;
    }
    /** 展示棋局 **/
    private void show(){
        int xx =0;
        System.out.println("    0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 ");
        for(char[] cs :table){
            System.out.print(" "+xx+(xx>9?"":" ")+" ");
            for(char c : cs){
                if(c==0) System.out.print("·");
                System.out.print(c+" ");
            }
            System.out.println();
            xx++;
        }
    }

      /** 获取下一个走棋的 **/
    private Player getPlayer(){
        //p1先走
        if (huihe==0) return p1;
        if (huihe%2!=0) return p2;
        return p1;
    }
    
    /** 判断是否获胜 **/
    private boolean isWin(int x,int y,char c){
        /*
         x 和 y  代表坐标
        * xx :x方向需要增加的值
        * yy :y方向需要增加的值
        *
        * 例如xx = -1 yy= -1
        * 代表需要获取(x-1,y-1)的棋子颜色
        *
        *  xx = 1 yy= 1
        * 代表需要获取(x+1,y+1)的棋子颜色
        *
        * */
        int xx = 0,yy=0;
        for (int i =1 ;i<9 ;i++ ){
            switch (i){
                case 1:
                    xx=-1;yy=-1;
                    break;
                case 2:
                    xx=-1;yy=1;
                    break;
                case 3:
                    xx=-1;yy=0;
                    break;
                case 4:
                    xx = 1;yy = -1;
                    break;
                case 5:
                    xx = 1;yy = 1;
                    break;
                case 6:
                    xx = 1 ;yy = 0;
                    break;
                case 7:
                    xx = 0;yy = -1;
                    break;
                case 8:
                    xx = 0;yy = 1;
                    break;


            }

            int n = ishas(x,y,xx,yy,0,c)+ishas(x,y,-xx,-yy,0,c);
            if(n>=4)return true;

        }
        return false;
    }



    /**
     * 检测是否有棋子
     * @param x x坐标
     * @param y y坐标
     * @param xx x方向
     * @param yy y方向
     * @param size 缓存
     * @param c 颜色
     * @return 权重
     */
    private int ishas(int x,int y,int xx,int yy,int size ,char c){
        if((x==0&&xx==-1)|| (x==15&&xx==1) || (y==0&&yy==-1) || (y== 15&&yy==1)) return size;

        if(table[x+xx][y+yy] == c){
            return ishas(x+xx,y+yy,xx,yy,size+1,c);
        }
        return size;
    }

    /** 下棋 **/
    public boolean put(int x,int y,Player p){
        if (table[x][y]==0) {
            table[x][y] = p.getColor();

            if(isWin(x,y,p.color)){
                gameover = true;
                System.out.println(p.username+"("+p.color+")赢得了胜利");
            }
            return true;
        }
        return false;
    }



    /** 游戏运行 **/
    public void start(){
        Player p = null;
        Scanner scan = new Scanner(System.in);
        String[] strArr = new String[2];
        while (!gameover){
            if(p==null)p=getPlayer();
            System.out.println("第"+(huihe/2+1)+"回合,下子方:"+p.getUsername()+"("+p.getColor()+")");
            System.out.println("请输入你要下的位置(空格隔开) 例如 10 5");
            //下棋失败重新开始本回合
            try {
                String in = scan.nextLine().trim();
                if ("exit".equals(in)) break;
                strArr = in.split(" ");
                if (!put( Integer.parseInt(strArr[0]),Integer.parseInt(strArr[1]),p))continue;
            }catch (Exception e){
                e.printStackTrace();
            }


            
            show();


            p=null;
            huihe++;
        }
        System.out.println("游戏结束");

    }
    /** 游戏入口 */
    public static void main(String[] args) {
        Gobang game = new Gobang();
        Player p1 = new Player("玩家1",'黑');
        Player p2 = new Player("玩家2",'白');
        game.createGame(p1,p2);
        game.start();
    }
}

/** 玩家类 **/
class Player{
    String username;
    char color;

    public Player(String username, char color) {
        this.username = username;
        this.color = color;
        System.out.println(username+"携带"+color+"颜色的棋子加入游戏");
    }

    public String getUsername() {
        return username;
    }

    public char getColor() {
        return color;
    }
}

游戏运行结果
这里我就很简单的复制了一个结果

第9回合,下子方:玩家2(白)
请输入你要下的位置(空格隔开) 例如 10 5
9 5
玩家2(白)赢得了胜利
    0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 
 0  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  
 1  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  
 2  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  
 3  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  
 4  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  
 5  ·  ·  ·  ·  ·  白 黑 ·  ·  ·  ·  ·  ·  ·  ·  ·  
 6  ·  ·  ·  ·  ·  白 ·  ·  ·  黑 ·  ·  ·  ·  ·  ·  
 7  ·  ·  ·  ·  ·  白 黑 ·  ·  ·  ·  ·  ·  ·  ·  ·  
 8  ·  ·  ·  ·  ·  白 黑 ·  ·  ·  ·  ·  ·  ·  ·  ·  
 9  ·  ·  ·  ·  ·  白 ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  
 10 ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  
 11 ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  
 12 ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  
 13 ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  
 14 ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  
 15 ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  ·  
游戏结束

2.0版本,增加Ai机器人算法,优化一些小bug,点击进入


  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Timeless小帅

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

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

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

打赏作者

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

抵扣说明:

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

余额充值