JavaSE實現(xiàn)三子棋游戲
本文實例為大家分享了JavaSE實現(xiàn)三子棋游戲的具體代碼,供大家參考,具體內(nèi)容如下
用面向?qū)ο蟮乃季S把實現(xiàn)三子棋劃分為四個模塊:
main函數(shù)
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("歡迎下次繼續(xù)游戲");
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? }
}棋盤模塊設計
棋盤初始化
接受玩家落子并返回當前棋盤狀態(tài)
接受AI落子并返回當前棋盤狀態(tài)
判斷獲勝方、平局或是繼續(xù)游戲,新游戲重置棋盤。
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};
? ? }
}游戲模塊設計
初始化工作:打印提示內(nèi)容和分割線,加載棋盤
判斷是玩家落子還是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("規(guī)則如下;省略");
? ? ? ? System.out.println("===========================");
? ? ? ? System.out.println(chessboard1);
? ? }
? ? public void play(){//cintinue會繼續(xù),玩家勝,AI勝和平局 都是break,退出循環(huán)。
? ? ? ? while(true){
? ? ? ? ? ? if(playerTurn()){
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? ? ? if(aiTurn()) {
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? //游戲結(jié)束之前,完成一些收尾工作
? ? 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("該位置已經(jīng)有子,請重新選擇位置");
? ? ? ? }
? ? ? ? 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("該位置已經(jīng)有子,請重新選擇位置");
? ? ? ? }
? ? ? ? System.out.println(chessboard1);
? ? ? ? if(chessboard1.getState() == chessboard.CONTINUE){
? ? ? ? ? ? return false;
? ? ? ? }
? ? ? ? return true;
? ? }
}代碼還有不完善的地方,希望大家多提意見啦
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
SpringBoot啟動后執(zhí)行方法的五種實現(xiàn)方式
本文介紹了SpringBoot中五種在項目啟動后執(zhí)行方法的方式,包括實現(xiàn)CommandLineRunner和ApplicationRunner接口、實現(xiàn)ApplicationListener接口、使用@PostConstruct注解以及實現(xiàn)InitializingBean接口,每種方式都有其特點和適用場景2025-02-02
springBoot整合shiro如何解決讀取不到@value值問題
這篇文章主要介紹了springBoot整合shiro如何解決讀取不到@value值問題,具有很好的參考價值,希望對大家有所幫助,2023-08-08
spring cloud gateway 限流的實現(xiàn)與原理
這篇文章主要介紹了spring cloud gateway 限流的實現(xiàn)與原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12
Elasticsearch Join字段類型簡單快速上手教程
這篇文章主要為大家介紹了Elasticsearch Join字段類型簡單快速上手教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09

