JavaSE实现三子棋游戏

 更新时间:2022年05月04日 12:58:32   作者:yemaozi1501  
这篇文章主要为大家详细介绍了JavaSE实现三子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了JavaSE实现三子棋游戏的具体代码,供大家参考,具体内容如下

用面向对象的思维把实现三子棋划分为四个模块:

main函数

public class main {
    public static void main(String[] args) {
        player player1 = new player();
        game game1 = new game(player1);

        while(true){

            game1.initialize();

            game1.play();

            game1.destroy();

            boolean b = player1.queryContinue();
            if (!b) {

                System.out.println("欢迎下次继续游戏");
                break;
            }


        }
    }
}

棋盘模块设计

棋盘初始化

接受玩家落子并返回当前棋盘状态

接受AI落子并返回当前棋盘状态

判断获胜方、平局或是继续游戏,新游戏重置棋盘。

import java.util.Arrays;

public class chessboard {
    private static final int 空白 = 0;
    private static final int 画圈 = 1;
    private static final int 画叉 = 2;

    private int[][] array = {
            {空白,空白,空白},
            {空白,空白,空白},
            {空白,空白,空白},
    };

    public boolean moveCircleAt(int row,int column){
        if(array[row][column] != 空白){
            return false;
        }
        array[row][column] = 画圈;
        return true;
    }
    public boolean moveCrossAt(int row,int column){
        if(array[row][column] != 空白){
            return false;
        }
        array[row][column] = 画叉;
        return true;
    }
    public static final int CIRCLE_WIN = 0;
    public static final int CROSS_WIN = 1;
    public static final int DRAW = 2;
    public static final int CONTINUE = 3;

    private static String display(int i){
        switch (i){
            case 空白:return " ";
            case 画圈:return "@";
            case 画叉:return "*";
            default:return " ";
        }
    }
    @Override
    public String toString() {
        String s = "+-+-+-+-+-+\n";
        for(int i = 0;i<2;i++){
           s +=  String.format("|%s|%s|%s|\n",display(array[i][0]),display(array[i][1]),display(array[i][2]));
//           s += "+-+-+-+-+-+\n";
        }
        s +=  String.format("|%s|%s|%s|\n",display(array[2][0]),display(array[2][1]),display(array[2][2]));
        s += "+-+-+-+-+-+";
        return s;
    }

    public int getState(){
        //按行判断
        for(int i = 0;i<3;i++){
            if(array[i][0] == array[i][1] && array[i][1]== array[i][2]){
                if(array[i][0] == 画圈 ){
                    System.out.println("玩家胜");
                    return CIRCLE_WIN;

                }
                else if(array[i][0] == 画叉){
                    System.out.println("机器赢");
                    return CROSS_WIN;
                }
            }
        }
        //列判断
        for(int i = 0;i<3;i++){
            if(array[0][i] == array[1][i] && array[1][i]== array[2][i]){
                if(array[0][i] == 画圈 ){
                    System.out.println("玩家胜");
                    return CIRCLE_WIN;
                }
                else if(array[0][i] == 画叉){
                    System.out.println("机器赢");
                    return CROSS_WIN;
                }
            }
        }
        //斜线判断
        if(array[0][0] == array[1][1] && array[1][1]== array[2][1]){
            if(array[1][1] == 画圈 ){
                return CIRCLE_WIN;
            }
            else if(array[1][1] == 画叉){
                return CROSS_WIN;
            }
        }
        if(array[0][2] == array[1][1] && array[1][1]== array[2][0]){
            if(array[1][1] == 画圈 ){
                return CIRCLE_WIN;
            }
            else if(array[1][1] == 画叉){
                return CROSS_WIN;
            }
        }
        //没人赢
        for(int i = 0;i<3;i++){
            for(int j = 0;j<3;j++){
                if(array[i][j] == 空白){
                    return CONTINUE;
                }
            }
        }
        return DRAW;
    }

    public void reset() {
        for(int i = 0;i<3;i++){
            Arrays.fill(array[i],空白);
        }
    }
}

玩家模块设计

输入想要落子的位置,决定退出游戏还是再来一局。

import java.util.Scanner;

public class player {
    private final Scanner scanner = new Scanner(System.in);

    public int[] getStation(){
        System.out.println("请输入要落子的位置,行,列,有效输入是0,1,2");

        int r,c;
        while (true) {
            System.out.print(">>>");
             r = scanner.nextInt();
             c = scanner.nextInt();

             if(r >= 0 && r <= 2 &&c >= 0 && c <= 2){
                 break;
             }
            System.out.println("有效范围是0,1,2,请重新输入。");
        }

        return new int[] {r,c};
    }

    public boolean queryContinue(){
        System.out.println("是否再来一把?,请输入true or false");
        System.out.println(">>>");
        return scanner.nextBoolean();

    }
}

AI(电脑)模块设计

生成随机坐标

import java.util.Random;

public class AI {
    //返回落子的位置
    //第几行,第几列都是从0开始
    //有效值0~2

    private final Random random = new Random();
    int r,c;
    public int[] getStation(){
        r = random.nextInt(3);
        c = random.nextInt(3);
        return new int[] {r,c};
    }
}

游戏模块设计

初始化工作:打印提示内容和分割线,加载棋盘

判断是玩家落子还是AI落子

玩家落子情况下:判断玩家输入的合法性,超出边界或是覆盖落子都是不合法行为

AI落子情况下:判断输入的合法性。

控制棋盘重置新棋局

package 三子棋;

public class game {
    private final chessboard chessboard1;
    private final player player1;
    private final AI ai;
    public game(player player1){
        this.chessboard1 = new chessboard();
        this.player1 = player1;
        this.ai = new AI();
    }
    //游戏开始之前,进行一些准备工作
    public void initialize(){

        System.out.println("欢迎进入井字棋游戏");
        System.out.println("规则如下;省略");
        System.out.println("===========================");
        System.out.println(chessboard1);

    }
    public void play(){//cintinue会继续,玩家胜,AI胜和平局 都是break,退出循环。
        while(true){
            if(playerTurn()){
                break;
            }
            if(aiTurn()) {
                break;
            }

        }
    }
    //游戏结束之前,完成一些收尾工作
    public void destroy(){
//        ai.reset();
//        player1.reset();
        chessboard1.reset();
    }
    private boolean playerTurn(){

        System.out.println("玩家回合");


        while (true){
            int[] rc = player1.getStation();
            int row = rc[0];
            int column = rc[1];
            if(chessboard1.moveCircleAt(row,column))
            {
                break;
            }
            System.out.println("该位置已经有子,请重新选择位置");
        }

        System.out.println(chessboard1);

        if(chessboard1.getState() == chessboard.CONTINUE){
            return false;
        }
        return true;
    }
    private boolean aiTurn(){
        System.out.println("AI回合");


        while (true){
            int[] rc = ai.getStation();
            int row = rc[0];
            int column = rc[1];
            if(chessboard1.moveCrossAt(row,column))
            {
                break;
            }
            System.out.println("该位置已经有子,请重新选择位置");
        }

        System.out.println(chessboard1);
        if(chessboard1.getState() == chessboard.CONTINUE){
            return false;
        }
        return true;
    }
}

代码还有不完善的地方,希望大家多提意见啦

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java中channel用法总结

    Java中channel用法总结

    这篇文章主要介绍了Java中channel用法,较为详细的总结了channel的定义、类型及使用技巧,需要的朋友可以参考下
    2015-06-06
  • Maven打包并生成运行脚本的示例代码

    Maven打包并生成运行脚本的示例代码

    这篇文章主要介绍了Maven打包并生成运行脚本,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Java中字符数组、String类、StringBuffer三者之间相互转换

    Java中字符数组、String类、StringBuffer三者之间相互转换

    这篇文章主要介绍了Java中字符数组、String类、StringBuffer三者之间相互转换,需要的朋友可以参考下
    2018-05-05
  • java编译器的基础知识点

    java编译器的基础知识点

    在本篇文章里小编给大家整理的是一篇关于java编译器的基础知识点内容,有兴趣的朋友们可以阅读下。
    2020-02-02
  • 一文带你搞懂什么是BIO

    一文带你搞懂什么是BIO

    BIO英文全名是 blocking IO,也叫做 阻塞IO,是最容易理解、最容易实现的IO工作方式,本文就来通过一些简单的示例为大家讲讲什么是BIO吧
    2023-06-06
  • springboot 使用yml配置文件自定义属性的操作代码

    springboot 使用yml配置文件自定义属性的操作代码

    在SpringBoot中yml/yaml文件可以自定义一些属性,以供注入给自定义bean对象的属性,主要通过空格和层次来实现,类似于python代码,本文通过实例代码给大家介绍springboot 使用yml配置文件自定义属性,感兴趣的朋友跟随小编一起看看吧
    2024-03-03
  • 解决CollectionUtils.isNotEmpty()不存在的问题

    解决CollectionUtils.isNotEmpty()不存在的问题

    这篇文章主要介绍了解决CollectionUtils.isNotEmpty()不存在的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Spring中的@Async原理分析

    Spring中的@Async原理分析

    这篇文章主要介绍了Spring中的@Async原理分析,自定义new ThreadPoolExecutor并调用invokeAll等进行并发编程,后面发现只要在方法上添加@Async注解,并使用@EnableAsync进行开启默认会使用SimpleAsyncTaskExecutor类型,需要的朋友可以参考下
    2024-01-01
  • 图文讲解IDEA中根据数据库自动生成实体类

    图文讲解IDEA中根据数据库自动生成实体类

    这篇文章主要以图文讲解IDEA中根据数据库自动生成实体类,本文主要以Mysql数据库为例,应该会对大家有所帮助,如果有错误的地方,还望指正
    2023-03-03
  • 获取Java加载器和类完整结构的方法分享

    获取Java加载器和类完整结构的方法分享

    这篇文章主要为大家详细介绍了获取Java加载器和类完整结构的方法,文中的示例代码讲解详细,对我们学习Java有一定的帮助,需要的可以参考一下
    2022-12-12

最新评论