最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaSE實現(xiàn)三子棋游戲

 更新時間:2022年05月04日 12:58:32   作者:yemaozi1501  
這篇文章主要為大家詳細(xì)介紹了JavaSE實現(xiàn)三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了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;
? ? ? ? ? ? }


? ? ? ? }
? ? }
}

棋盤模塊設(shè)計

棋盤初始化

接受玩家落子并返回當(dāng)前棋盤狀態(tài)

接受AI落子并返回當(dāng)前棋盤狀態(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("機(jī)器贏");
? ? ? ? ? ? ? ? ? ? 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("機(jī)器贏");
? ? ? ? ? ? ? ? ? ? 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],空白);
? ? ? ? }
? ? }
}

玩家模塊設(shè)計

輸入想要落子的位置,決定退出游戲還是再來一局。

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(電腦)模塊設(shè)計

生成隨機(jī)坐標(biāo)

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};
? ? }
}

游戲模塊設(shè)計

初始化工作:打印提示內(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();
? ? }
? ? //游戲開始之前,進(jìn)行一些準(zhǔn)備工作
? ? public void initialize(){

? ? ? ? System.out.println("歡迎進(jìn)入井字棋游戲");
? ? ? ? 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)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • MyBatis-Plus自動化填充的踩坑記錄及解決

    MyBatis-Plus自動化填充的踩坑記錄及解決

    這篇文章主要介紹了MyBatis-Plus自動化填充的踩坑記錄及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • SpringBoot啟動后執(zhí)行方法的五種實現(xiàn)方式

    SpringBoot啟動后執(zhí)行方法的五種實現(xiàn)方式

    本文介紹了SpringBoot中五種在項目啟動后執(zhí)行方法的方式,包括實現(xiàn)CommandLineRunner和ApplicationRunner接口、實現(xiàn)ApplicationListener接口、使用@PostConstruct注解以及實現(xiàn)InitializingBean接口,每種方式都有其特點(diǎn)和適用場景
    2025-02-02
  • java 動態(tài)增加定時任務(wù)示例

    java 動態(tài)增加定時任務(wù)示例

    本篇文章主要介紹了java 動態(tài)增加定時任務(wù)示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Java使用JXLS導(dǎo)出Excel詳解

    Java使用JXLS導(dǎo)出Excel詳解

    jxls是一個輕量級的Java庫,用于基于模板的Excel報表生成,這篇文章主要為大家介紹了Java如何使用JXLS導(dǎo)出Excel,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • springBoot整合shiro如何解決讀取不到@value值問題

    springBoot整合shiro如何解決讀取不到@value值問題

    這篇文章主要介紹了springBoot整合shiro如何解決讀取不到@value值問題,具有很好的參考價值,希望對大家有所幫助,
    2023-08-08
  • spring cloud gateway 限流的實現(xiàn)與原理

    spring cloud gateway 限流的實現(xiàn)與原理

    這篇文章主要介紹了spring cloud gateway 限流的實現(xiàn)與原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • IDEA插件開發(fā)之環(huán)境搭建過程圖文詳解

    IDEA插件開發(fā)之環(huán)境搭建過程圖文詳解

    這篇文章主要介紹了IDEA插件開發(fā)之環(huán)境搭建過程,本文通過圖文并茂實例代碼相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • 遠(yuǎn)程debug調(diào)試入門

    遠(yuǎn)程debug調(diào)試入門

    這篇文章主要介紹了Eclipse的Debug調(diào)試技巧大全(總結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧嗎,希望能給你帶來幫助
    2021-06-06
  • Elasticsearch Join字段類型簡單快速上手教程

    Elasticsearch Join字段類型簡單快速上手教程

    這篇文章主要為大家介紹了Elasticsearch Join字段類型簡單快速上手教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Java中Parser的用法

    Java中Parser的用法

    這篇文章主要介紹了Java?Parser使用指南,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05

最新評論

东乌| 小金县| 河北区| 永福县| 敦煌市| 铁岭市| 莲花县| 桦甸市| 启东市| 慈溪市| 鲜城| 台湾省| 邯郸县| 镇坪县| 忻州市| 商南县| 耒阳市| 鹿泉市| 三亚市| 新沂市| 开远市| 丽水市| 南江县| 赤城县| 玉山县| 张北县| 陇南市| 巢湖市| 凤庆县| 西青区| 乌拉特后旗| 建阳市| 彭山县| 灵璧县| 辰溪县| 乐至县| 杂多县| 岳普湖县| 崇州市| 镇坪县| 华池县|