JavaSE实现三子棋游戏

目录
  • main函数
  • 棋盘模块设计
  • 玩家模块设计
  • AI(电脑)模块设计
  • 游戏模块设计

本文实例为大家分享了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;
    }
}

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

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

(0)

相关推荐

  • Java实现三子棋游戏

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

  • Java实现三子棋小游戏

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

  • JavaSE实现三子棋游戏

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

  • C语言实现三子棋游戏

    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<stdlib.h> #include<time.h> void chess_board(char arr[3][3]) //打印棋盘 { int i = 0; int j = 0; for (i = 0; i < 3; i++) { printf( " %c | %c | %c \n", arr [i][0], a

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

    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 什么是多文件? 多数大型的工程的头文件和源文件非常多,我们也不可能把所有的代码都写在同一个文件里,这样也不方便代码的阅读与维护,通常都会根据不同的功能将代码分别书写到多个源文件与头文件中. 游戏介绍 三子棋是个简单的双人游戏,双方在3X3的棋盘上轮流落子,当一条直线上出现三颗连续且相同的棋子时即获胜.此程序让玩家先落子,电脑在棋盘上随机落子.游戏结束时显示胜负,玩家可以选择是否继续玩游戏. 代码实现 chess.h 通

  • C语言实现简单三子棋游戏

    本文实例为大家分享了C语言实现简单三子棋游戏的具体代码,供大家参考,具体内容如下 游戏介绍:使用C语言中二维数组和函数的基本知识实现一个三子棋游戏,这个游戏要实现的基本功能有初始化棋盘.棋盘的打印.玩家下棋.电脑下棋.判断输赢. 代码框架: 1.头文件(game.h) #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<st

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

    C语言:三子棋游戏,供大家参考,具体内容如下 首先,我们从main函数开始写起,分析游戏的整体逻辑 int main() { int input=0; srand((unsigned int)time(NULL)); do { menu(); printf("请选择:"); scanf("%d",&input); switch(input) { case 1: game(); break; case 0: printf("退出游戏\n")

  • C语言实现三子棋游戏(初级版)

    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 game.h #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 3 #define COL 3 //声明函数 void InitBoard(char board[ROW][COL], int row, int col); //打印棋盘 void PrintBoard(char board[ROW][COL], i

  • C语言实现简单的控制台三子棋游戏

    用C语言实现简单的控制台三子棋游戏 首先,确定一局游戏的基本流程: 1.创建棋盘并初始化.(将棋盘看作一个二维数组) 2.打印显示出棋盘. 3.玩家落子(玩家通过输入行列坐标的方式来落子). 4.判定胜负关系.(如果玩家胜出,则退出游戏.) 5.电脑落子(随机位置落子) . 6.判定胜负关系(如果电脑胜出,退出游戏.否则,回到步骤 2 继续执行.) 第一步,此处通过构造menu()函数搭建一个简单的交互菜单和玩家交互,用来判断是否开始进行一局游戏. #define _CRT_SECURE_NO_

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

    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 1.游戏介绍 三子棋是一种民间传统游戏,又叫九宫棋.圈圈叉叉.一条龙等.将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了. 2.游戏效果 3.源代码 (1)头文件命名为为game.h 主要是整个程序中函数的声明 #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 3

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

    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 说明:该游戏的实现需要用到三个文件 1.test.c:放置主函数(main())和菜单函数(menu())和游戏函数(game()). 2.game.c:放置game()里面的相应操作的函数,例如玩家移动(PlayerMove(board)),电脑移动(ComputerMove(board)),以及每一次移动之后打印当前棋盘内容的函数(DisplayBoard(board))等等.由于这些函数内容较多,所以单独放在一个

  • 使用tkinter实现三子棋游戏

    本文实例为大家分享了tkinter实现三子棋游戏的具体代码,供大家参考,具体内容如下 整体游戏很简单.下棋,判断胜利或者平局.没有加入电脑下棋的算法. 游戏界面: 代码: import tkinter as tk from tkinter import messagebox, Label, Button from TicTacToeModel import TicTacToeModel import requests from PIL import ImageTk, Image from io

随机推荐