Java实现三子棋小游戏简易版

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

游戏操作如图示:

原理:

主要借助3x3的二维数组

实现:

1、Main–主程序

public class Main {
    public static void main(String[] args) {
      Player player=new Player();//玩家
      Game game=new Game(player);

      //一次循环代表一次游戏
      while (true){
          game.Init();//初始化
          game.play();//开始游戏

          game.destory();//释放

          boolean q=player.queryContinue();
          //一局游戏结束后,询问用户是否开始下一局游戏
          if (!q){
              System.out.println("欢迎下次继续游戏!");
              break;
          }
      }
    }
}

2、AI–电脑

import java.util.Random;
//返回AI对象的落子位置
//用数组表示 第几行第几列 从0开始
//所以有效范围是[0,2]
public class AI {
    private final Random random=new Random();
    public int[] getPosition(){
        int r=random.nextInt(3);//生成[0,2]的随机整数 0 1 2
        int c=random.nextInt(3);
        return new int[]{r,c};
    }
}

3、Player–玩家

import java.util.Scanner;

//返回玩家落子位置
//用数组表示 第几行第几列 从0开始
//所以有效范围是[0,2]
public class Player {
    private final Scanner sc=new Scanner(System.in);

    public int[] getPosition(){
        System.out.println("请输入要落子的位置,行列有效取值范围为[0,2]");
        System.out.print(">>>");
        int r,c;
       while (true){
           System.out.print(">>>");
           r=sc.nextInt();
           c=sc.nextInt();

           if (r>=0&&r<=2&&c>=0&&c<=2){
               break;
           }
           System.out.println("行列有效范围为[0,2],请重新输入");

       }
        return new int[]{r,c};
    }
    //询问用户是否继续下一局
    public boolean queryContinue(){
        System.out.println("本局游戏结束,开始新游戏请输入true,否则输入false");
        System.out.print(">>>");
        return sc.nextBoolean();
    }
}

4、ChessBoard–棋盘

import java.util.Arrays;

//棋盘 用来实例化对象
//棋盘对象
//功能 1、落子 2、判断棋盘状态
public class ChessBoard {
   private static final int empty=0;//空白位置用0表示
   private static final int circle=1;//落子为o的位置
   private static final int cross=2;//落子为x的位置
   private final int[][] array={
           {empty,empty,empty},
           {empty,empty,empty},
           {empty,empty,empty}
   };

   public boolean moveCircleAt(int row,int column){//落一个o
      if (array[row][column]!=empty){ //落子前需要先判断该位置是否为空白
         return false;
      }
      array[row][column]=circle;
      return true;
   }

   public boolean moveCrossAT(int row,int column){//某个位置落个x
      if (array[row][column]!=empty){
         return false;
      }
      array[row][column]=cross;
      return true;
   }

   //棋盘的四种状态
   public static final int CIRCLE_WIN=0;//执o者赢  //三横三竖两对角成直线
   public static final int CROSS_WIN=1;//执x者赢
   public static final int DRAW=2;//平局 //没有成直线 但无落子位置了
    public static final int CONTINUE=3;//继续

   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]==circle){
               System.out.println("恭喜你赢了!");
               return CIRCLE_WIN;
            }
            else if (array[i][0]==cross){
               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]==circle){
               System.out.println("恭喜你赢了!");
               return CIRCLE_WIN;
            }
            else if(array[0][i]==cross){
               System.out.println("很遗憾你输了!");
               return CROSS_WIN;
            }
         }
      }

      //正负对角线
      //正负对角线
      if ((array[0][0]==array[1][1]&&array[1][1]==array[2][2])
              ||(array[0][2]==array[1][1]&&array[1][1]==array[2][0])){
         if (array[1][1]==circle){
            System.out.println("恭喜你赢了!");
            return CIRCLE_WIN;
         }
         else if (array[1][1]==cross){
            System.out.println("很遗憾你输了!");
            return CROSS_WIN;
         }
      }
      //无获胜
      for (int i=0;i<3;i++){
        for (int j=0;j<3;j++){
           if (array[i][j]==empty){
              return CONTINUE;
           }
        }
      }
      return DRAW;//无获胜也无空白 平局
   }

   private static String show(int i){ //显示
      switch (i){
         case empty:
            return " ";
         case circle:
            return "o";
         case cross:
            return "x";
         default:
            return "1";
      }
   }

   @Override
   public String toString() {
      String s="---------\n";
      for (int i=0;i<2;i++){ //前两行
         s+=String.format("|%s|%s|%s|\n",show(array[i][0]),show(array[i][1]),show(array[i][2]));
         s+="---------\n";
      }
      //最后一行
      s+=String.format("|%s|%s|%s|\n",show(array[2][0]),show(array[2][1]),show(array[2][2]));
      s+="---------";

      return s;
   }

   public void reset() {
      for (int i=0;i<3;i++){
         Arrays.fill(array[i],empty);//所有位置再次设置为空白
      }
   }
}

5、Game–游戏

import java.util.Arrays;

public class Game {
    private final ChessBoard chessboard;
    private final Player player;
    private final AI ai;

    public Game(Player player){
        this.chessboard=new ChessBoard();
        this.player=player;
        this.ai=new AI();
    }

    //初始化
    public void Init(){
        System.out.println("欢迎进入三子棋游戏");
        System.out.println(chessboard);
    }

    //回合制游戏,游戏主流程
    public void play(){
        while (true){  //一次循环=player回合+AI回合
           if (playerTurn()){//玩家回合
               break;
           }
           if (aiTurn()){//ai回合
               break;
           }
        }
    }

    private boolean aiTurn() {
        System.out.println("AI回合:");
        while (true) {
            int[] rc=ai.getPosition();
            int row=rc[0];
            int column=rc[1];
            if(chessboard.moveCrossAT(row, column)){
                break;
            }
        }
        System.out.println(chessboard);

        return chessboard.getState()!=ChessBoard.CONTINUE;

    }

    private boolean playerTurn() {
        System.out.println("玩家回合:");

        while (true) {
            int[] rc=player.getPosition();
            int row=rc[0];
            int column=rc[1];
            if(chessboard.moveCircleAt(row, column)){
                break;
            }
            System.out.println("该位置已经有棋子,请重新选择位置");
        }
        System.out.println(chessboard);
        return chessboard.getState()!=ChessBoard.CONTINUE;
    }
    //新一局游戏开始时 游戏的界面需要重置 否则会是上一局游戏的结局界面
    public void destory(){
        chessboard.reset();
    }

}

运行结果:

1、测试落子位置合法性

2、测试棋盘状态/输赢

3、测试平局

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

(0)

相关推荐

  • JavaSE实现三子棋游戏

    目录 main函数 棋盘模块设计 玩家模块设计 AI(电脑)模块设计 游戏模块设计 本文实例为大家分享了JavaSE实现三子棋游戏的具体代码,供大家参考,具体内容如下 用面向对象的思维把实现三子棋划分为四个模块: main函数 public class main {     public static void main(String[] args) {         player player1 = new player();         game game1 = new game(pl

  • Java实现三子棋游戏

    本文实例为大家分享了Java实现三子棋游戏的具体代码,供大家参考,具体内容如下 一.题目要求 编写程序,实现简单的三子棋游戏.在三子棋中,双方在3×3的棋盘中轮流下棋,一方用*示,另一方用O表示.如果一方的3个棋子占据了同一行,同一列或者对角线,则该方获胜.如果棋盘已被棋子占满,但没有一方获胜则出现平局.在程序中,一方为用户,用户在界面上输入每次下棋的位置:另一方下棋的位置为随机自动生成. 二.代码示例 import javax.swing.JOptionPane;   public class

  • Java实现三子棋小游戏

    # 前言 之前在学习C语言的时候,做过一个三子棋的小游戏,最近开始学习Java,就想着能不能用Java再把之前的练习重新实现一边,既然有这个想法了,那就开始行动啦~. 再写的过程中,能感觉到面向过程语言和面向对象语言的一些差异.最让我头疼的是类的设计,感觉不仅得考虑功能得实现,还需要考虑类之间得逻辑关系,函数的功能是单一的,但函数与函数之间谈不上什么关系,你要用的上我,你就用,不用就拉倒.类在设计的时候需要考虑将哪些方法封装在哪个类当中,封装位置不合适,尽管也可能实现功能,但总感觉怪怪的.自己最

  • Java实现三子棋小游戏简易版

    本文实例为大家分享了Java实现三子棋小游戏的具体代码,供大家参考,具体内容如下 游戏操作如图示: 原理: 主要借助3x3的二维数组 实现: 1.Main–主程序 public class Main {     public static void main(String[] args) {       Player player=new Player();//玩家       Game game=new Game(player);       //一次循环代表一次游戏       while

  • C语言版三子棋小游戏

    本文实例为大家分享了C语言版三子棋小游戏的具体代码,供大家参考,具体内容如下 ①游戏效果 有一个3*3的棋盘 每次下棋后(电脑和玩家),棋盘会更新数据 会有菜单提示相关命令进行相关操作 下棋方法是输入坐标 每一局游戏结束后,会询问是否继续. ②主函数逻辑搭建 任何一个项目的实现,最重要的就是逻辑结构搭建,而各个功能的实现就是采取函数(模块化)进行细分. 所以我们需要搭建逻辑,那么逻辑结构是啥呢? 首先会跳出提示菜单,内容为 0退出游戏,1开始/继续游戏,其他键提示错误,并重新输入 按0后提示 "

  • C语言实现简易的三子棋小游戏

    本文实例为大家分享了C语言实现三子棋小游戏的具体代码,供大家参考,具体内容如下 1.基本流程 1.菜单界面选择开始或者退出游戏.2.创建棋盘并初始化.3.打印棋盘.4.玩家落子并打印棋盘5.电脑落子并打印棋盘6.判定胜负关系(输,赢,平局) 2. 配置运行环境 本次游戏用到三个文件,两个源文件test.c,game.c,一个头game.h.其中,game.c,game.h可以称作一个游戏模块,为什么要这样做呢?因为多个文件可以分别处理各自模块的功能,能更好处理各个模块之间的逻辑并且便于后期调试,

  • C语言三子棋小游戏的实现代码

    本文实例为大家分享了C语言三子棋小游戏的具体代码,供大家参考,具体内容如下 一.介绍: 运用C语言的数组等相关知识:实现一个简易的三子棋小游戏: 三子棋小游戏的大概内容为 此游戏在设计时:总共设计了三个文件: game.h: 类型的声明和函数的声明 game.c:函数功能的具体实现 test.c: 测试文件 二.具体实现: (1).game.h模块: 代码实现如下: #define _CRT_SECURE_NO_WARNINGS 1 //头文件包含 #include <stdio.h> #in

  • C语言代码实现三子棋小游戏

    本文实例为大家分享了C语言实现三子棋小游戏的具体代码,供大家参考,具体内容如下 设计思路 三子棋的C语言设计的思路: 1.设计一个界面:让玩家运行后即可以看到一个界面,而此时界面需要一个让玩家选择的语句,即可以选择玩游戏或者退出操作.界面设计需要swich语句的实现,退出游戏设计选项为0,即可以当选择退出游戏时直接退出while(循环),即结束游戏. 2.游戏实现:当玩家选择玩游戏时,调用启动游戏的函数,而在游戏中,应当有的内容有: (1)游戏内的棋盘设计:三子棋应当是三行三列的一个棋盘,通过函

  • C语言实现三子棋小游戏详解

    在用c语言实现三子棋小游戏之前,我们应当了解三子棋的游戏规则:在九宫格棋盘上,哪一方三个棋子连成一线(一行或一列或对角线)即判定哪一方胜利. 以下为源代码: 1.首先打印出菜单. void menu() { printf("**********************************\n"); printf("**********************************\n"); printf("***** 0.play *********

  • C语言实现三子棋小游戏(vs2013多文件)

    本文通过实例为大家分享了C语言实现三子棋小游戏的具体代码,供大家参考,具体内容如下 基本思路: 1.创建一个游戏选择面板. 2.创建并初始化棋盘. 3.玩家落子并判定,电脑落子并判定. 4.判定结果 ,游戏结束! 代码如下: 头文件: #pragma once #include<stdio.h> #include<windows.h> #include<stdlib.h> #include <time.h> #pragma warning(disable:4

  • 用C语言实现三子棋小游戏

    本文实例为大家分享了C语言实现三子棋小游戏的具体代码,供大家参考,具体内容如下 1. 规则介绍 三子棋是一种民间传统游戏,又叫九宫棋.圈圈叉叉.一条龙.井字棋等.将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了.但是,有很多时候会出现和棋的情况. 2. 编写思路 2.1 选择界面的编写 提供选择界面(设计者可根据自己的喜好设定棋盘的大小:输入何种数字或者符号开始或者退出游戏也可由设计者自己确定数字) static void Menu() { pri

  • 适合初学者练习的C语言实现三子棋小游戏

    目录 一.写代码前明确下棋时的步骤与顺序 二 根据初步的主函数完成想要的代码 1.写一个函数来初始化棋盘 2.打印棋盘 3.玩家落子 4.电脑落子 5.判断胜负 三.三子棋实现代码 用简单的C语言来实现小时候玩的三子棋游戏,下面是人机对战,当然这个代码的电脑对手是人工智障而不是人工智能 一.写代码前明确下棋时的步骤与顺序 1.创建一个3*3的棋盘. 2.将上面创建的棋盘中每个格初始化成' '状态. 3.打印出初始化完成的棋盘 4.玩家落子 5.电脑落子 6.判断胜负 写代码之前梳理好大概的思路,

随机推荐