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

Java實現(xiàn)在線五子棋對戰(zhàn)游戲(人機對戰(zhàn))

 更新時間:2022年09月27日 08:25:51   作者:獨一無二的哈密瓜  
這篇文章主要為大家詳細介紹了如何利用Java語言實現(xiàn)在線五子棋對戰(zhàn)游戲(人機對戰(zhàn)),文中的實現(xiàn)步驟講解詳細,感興趣的可以嘗試一下

1. 人機對戰(zhàn)

要增添一個人機對戰(zhàn)的模塊, 最大的難點就是如何讓人機知道下在什么位置是最好的, 不僅要具備進攻的能力, 還需要具備防守的能力.

這里當人機第一次走的時候, 采用標準開局, 下子在最中間.

當玩家走了之后, 人機就需要去判定下在什么位置合理.

這里采用的是評分表的方法來計算落子在每一個位置的分數(shù), 根據(jù)最高分數(shù)來進行下子.

1.1 演示

1.2 評分表

分析棋形的幾種情況.

例如, 自己是黑子.

"_" 代表 沒有子, "1" 代表 黑子 , "0" 代表 白子

當落子只有一顆子的情況

  • ① _ 1 _
  • ② _ 1 0
  • ③ 0 1 _
  • ④ 0 1 0

當落子有兩顆子的情況

  • ① _ 1 1 _
  • ② _ 1 1 0
  • ③ 0 1 1 _
  • ④ 0 1 1 0

當落子有三顆子的情況

  • ① _ 1 1 1 _
  • ② _ 1 1 1 0
  • ③ 0 1 1 1 _
  • ④ 0 1 1 1 0

當落子有四顆子的情況

  • ① _ 1 1 1 1 _
  • ② _ 1 1 1 1 0
  • ③ 0 1 1 1 1 _
  • ④ 0 1 1 1 1 0

當落子有五顆子的情況

  • ① _ 1 1 1 1 1 _
  • ② _ 1 1 1 1 1 0
  • ③ 0 1 1 1 1 1 _
  • ④ 0 1 1 1 1 1 0

這里大概的情況分為這幾種, 分別對這幾種情況進行一個分數(shù)的設(shè)定, 讓機器人根據(jù)分數(shù)的高低優(yōu)先去處理某種情況.

這里設(shè)計一種分數(shù)表

一子情況

二子情況

三子情況

四子情況

五子情況

1.3 算法思路

使用暴力搜索的方法, 將棋盤中每個空格的子, 當下子的時候, 去判定下子之后, 橫向得分情況, 豎向得分情況, 左斜得分情況, 右斜的得分情況.

例如, 下子是黑子.

  • 橫向, 去看左邊有多少個黑子, 多少白子, 去看右邊有多少個黑子, 多少白子. 然后根據(jù)評分表, 算得分數(shù).
  • 縱向, 去看上方有多少黑子, 多少白子, 再去下方看有多少個黑子, 多少白子, 然后根據(jù)評分表, 算得分數(shù).
  • 左斜, 去左下方看有多少黑子, 多少白子, 再去右上方看有多少黑子, 多少白子, 然后根據(jù)評分表, 算得分數(shù).
  • 右斜. 去左上方看有多少黑子,多少白子, 再去右下方看有多少黑子, 多少白子, 然后根據(jù)評分表, 算得分數(shù).

將四個方向的得分加起來, 算得分數(shù), 進行下子.

這里這種算法, 只具備了進攻, 不具備防守的能力. 要想人機下棋具備防守的能力, 還需要讓人機對玩家落子的分數(shù)進行評估, 如果玩家落子得分更高, 就需要考慮去防守了.

這里就讓, 對每個位置, 機器人落子, 和玩家落子, 算得機器人落子的得分, 和玩家落子的得分, 對分數(shù)進行相加, 然后再去比較, 當前是最大的得分情況, 就去當前位置落子.

這里進行測試的時候, 發(fā)現(xiàn)出現(xiàn)四子的時候, 會出現(xiàn)不進攻 或者不防守的情況. 所以在判定的時候, 如果出現(xiàn)了五子連珠的情況, 首先進攻. 如果對方有四子, 自己沒法五子, 首先防守.

1.4 具體代碼

1.4.1 評分表方法

根據(jù)評分表來分配分數(shù), my表示我下的棋子, his表示他下的棋子

public int score(int my,int his){
        if(my > 5) return 200000;
        if(my == 5 && his == 0) return 200000;
        if(my == 5 && his == 1) return 200000;
        if(my == 5 && his == 2) return 200000;
        if(my == 4 && his == 1) return 3000;
        if(my == 4 && his == 0) return 50000;
        if(my == 4 && his == 2) return 1000;
        if(my == 3 && his == 0) return 3000;
        if(my == 3 && his == 1) return 1000;
        if(my == 3 && his == 2) return 500;
        if(my == 2 && his == 0) return 500;
        if(my == 2 && his == 1) return 200;
        if(my == 2 && his == 2) return 100;
        if(my == 1 && his == 0) return 100;
        if(my == 1 && his == 1) return 50;
        if(my == 1 && his == 2) return 30;
        return 0;
    }

1.4.2 橫向得分方法

算得橫向自己棋子數(shù), 和他的棋子數(shù)

如果遇到空格就不計算了, 遇到別人的棋子也不計算了

public int getXScore(int x,int y, int chess){
        int my = 1;
        int his = 0;
        for(int i = x-1; i >= 0; i--){
            if(chess == board[i][y]){
                my++;
            }else if(board[i][y] == 0){
                break;
            }else{
                his++;
                break;
            }
        }
        for(int i = x+1; i<board.length; i++) {
            if(chess == board[i][y]){
                my++;
            }else if(board[i][y] == 0){
                break;
            }else{
                his++;
                break;
            }
        }
        return score(my,his);
    }

1.4.3 縱向得分方法

算得縱向自己棋子數(shù), 和他的棋子數(shù)

如果遇到空格就不計算了, 遇到別人的棋子也不計算了

    private int getYScore(int x, int y, int chess) {
        int my = 1;
        int his = 0;
        for(int i = y-1; i >= 0; i--){
            if(chess == board[x][i]){
                my++;
            }else if(board[x][i] == 0){
                break;
            }else{
                his++;
                break;
            }
        }
        for(int i = y+1; i < board.length; i++){
            if(chess == board[x][i]){
                my++;
            }else if(board[x][i] == 0){
                break;
            }else{
                his++;
                break;
            }
        }
        return score(my,his);
    }

1.4.4 左斜得分方法

算得左斜向自己棋子數(shù), 和他的棋子數(shù)

如果遇到空格就不計算了, 遇到別人的棋子也不計算了

    private int getSkewScore2(int x, int y, int chess) {
        int my = 1;
        int his = 0;
        for(int i = x+1,j=y-1; i<board.length && j >=0; i++,j--){
            if(chess == board[i][j]){
                my++;
            }else if(board[i][j] == 0){
                break;
            }else{
                his++;
                break;
            }
        }
        for(int i = x-1,j=y+1; i>=0 && j<board.length; i--,j++){
            if(chess == board[i][j]){
                my++;
            }else if(board[i][j] == 0){
                break;
            }else{
                his++;
                break;
            }
        }
        return score(my,his);
    }

1.4.5 右斜得分方法

算得右斜向自己棋子數(shù), 和他的棋子數(shù)

如果遇到空格就不計算了, 遇到別人的棋子也不計算了

 private int getSkewScore1(int x, int y, int chess) {
        int my = 1;
        int his = 0;
        for(int i = x-1,j =y-1; i >=0 && j>=0; i--,j--){
            if(chess == board[i][j]){
                my++;
            }else if(board[i][j] == 0){
                break;
            }else{
                his++;
                break;
            }
        }
        for(int i = x+1,j=y+1; j<board.length && i < board.length; i++,j++){
            if(chess == board[i][j]){
                my++;
            }else if(board[i][j] == 0){
                break;
            }else{
                his++;
                break;
            }
        }
        return score(my,his);
    }

1.4.6 落子總得分方法

這里如果自己下的子可以優(yōu)先五子連珠就直接下棋.

如果沒有這種情況, 再去判定是否他可以五子連珠, 如果有直接堵住

其他就計算總分數(shù)

    public int getScore(int x,int y) {
        int numX1 = getXScore(x,y,1);
        int numX2 = getXScore(x,y,2);
        int numY1 = getYScore(x,y,1);
        int numY2 = getYScore(x,y,2);
        int skew1 = getSkewScore1(x,y,1);
        int skew2 = getSkewScore1(x,y,2);
        int skew3 = getSkewScore2(x,y,1);
        int skew4 = getSkewScore2(x,y,2);
        if(numX2 >= 200000 || numY2 >= 200000 || skew2 >= 200000 || skew4 >= 200000) {
            return Integer.MAX_VALUE;
        }
        if(numX1 >= 200000 || numY1 >= 200000 || skew1 >= 200000 || skew3 >= 200000){
            return Integer.MAX_VALUE;
        }
        int xScore = getXScore(x,y,1)+getXScore(x,y,2);
        int yScore = getYScore(x,y,1)+getYScore(x,y,2);
        int skewScore1 = getSkewScore1(x,y,1)+getSkewScore1(x,y,2);
        int skewScore2 = getSkewScore2(x,y,1)+getSkewScore2(x,y,2);
        return xScore + yScore + skewScore1 + skewScore2;
    }

1.4.7 確認落子位置的方法

 public int[] concluate() {
        int[] res = new int[2];
        int max = 0;
        for(int i = 0; i < Constant.ROW; i++) {
            for(int j = 0; j < Constant.COL; j++) {
                if(board[i][j] != 0) {
                    continue;
                }
                int num = getScore(i,j);
                if(num == 200000){
                    res[0] = i;
                    res[1] = j;
                    return res;
                }
                if(num > max) {
                    max = num;
                    res[0] = i;
                    res[1] = j;
                }
            }
        }
        return res;
    }

到此這篇關(guān)于Java實現(xiàn)在線五子棋對戰(zhàn)游戲(人機對戰(zhàn))的文章就介紹到這了,更多相關(guān)Java在線五子棋游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot動態(tài)注入配置與docker設(shè)置環(huán)境變量的方法

    springboot動態(tài)注入配置與docker設(shè)置環(huán)境變量的方法

    這篇文章主要介紹了springboot動態(tài)注入配置與docker設(shè)置環(huán)境變量的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • redis?redisTemplate數(shù)據(jù)類型基礎(chǔ)操作

    redis?redisTemplate數(shù)據(jù)類型基礎(chǔ)操作

    這篇文章主要介紹了redis?redisTemplate數(shù)據(jù)類型基礎(chǔ)操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 解決springboot啟動Logback報錯ERROR in ch.qos.logback.classic.joran.action.ContextNameAction - Failed to rena

    解決springboot啟動Logback報錯ERROR in ch.qos.logback.cla

    這篇文章主要介紹了解決springboot啟動Logback報錯ERROR in ch.qos.logback.classic.joran.action.ContextNameAction - Failed to rena問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Mybatis-Plus使用MetaObjectHandler實現(xiàn)自動填充實體對象字段

    Mybatis-Plus使用MetaObjectHandler實現(xiàn)自動填充實體對象字段

    在我們使用Mybatis-Plus時,一些簡單的CRUD,你會發(fā)現(xiàn)好多表,許多字段是重復的,如果我們每次更新或者新增,都要手動賦值,那么會出現(xiàn)許多不必要的重復操作,所以本文介紹了Mybatis-Plus使用MetaObjectHandler實現(xiàn)自動填充實體對象字段,需要的朋友可以參考下
    2024-11-11
  • 關(guān)于File與MultipartFile的用法概述

    關(guān)于File與MultipartFile的用法概述

    這篇文章主要介紹了關(guān)于File與MultipartFile的用法概述,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java使用通配符實現(xiàn)增強泛型詳解

    Java使用通配符實現(xiàn)增強泛型詳解

    泛型是JAVA重要的特性,使用泛型編程,可以使代碼復用率提高。本文將利用通配符實現(xiàn)增強泛型,文中的示例代碼講解詳細,感興趣的可以了解一下
    2022-08-08
  • 在SpringBoot中配置Thymeleaf的模板路徑方式

    在SpringBoot中配置Thymeleaf的模板路徑方式

    這篇文章主要介紹了在SpringBoot中配置Thymeleaf的模板路徑方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Spring中緩存注解@Cache的使用詳解

    Spring中緩存注解@Cache的使用詳解

    這篇文章主要介紹了Spring中緩存注解@Cache的使用詳解,使用注解對數(shù)據(jù)進行緩存功能的框架,只需要簡單地加一個注解,就能實現(xiàn)緩存功能,大大簡化我們在業(yè)務(wù)中操作緩存的代碼,需要的朋友可以參考下
    2023-07-07
  • Kotlin 基礎(chǔ)教程之泛型

    Kotlin 基礎(chǔ)教程之泛型

    這篇文章主要介紹了Kotlin 基礎(chǔ)教程之泛型的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • IDEA配置靜態(tài)資源熱加載操作(Springboot修改靜態(tài)資源不重啟)

    IDEA配置靜態(tài)資源熱加載操作(Springboot修改靜態(tài)資源不重啟)

    這篇文章主要介紹了IDEA配置靜態(tài)資源熱加載操作(Springboot修改靜態(tài)資源不重啟),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10

最新評論

肇州县| 延长县| 许昌市| 绥中县| 彩票| 玉田县| 弥渡县| 达日县| 崇信县| 北宁市| 达州市| 长兴县| 丰顺县| 肥城市| 长春市| 辉南县| 手机| 新巴尔虎右旗| 吉首市| 赤水市| 乐东| 瓮安县| 昔阳县| 板桥市| 黑龙江省| 封丘县| 荆门市| 武乡县| 台中县| 明星| 芜湖县| 连山| 新安县| 广宁县| 房山区| 铜鼓县| 修武县| 庆元县| 泊头市| 中方县| 耒阳市|