国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

在線五子棋對(duì)戰(zhàn) --- 人機(jī)對(duì)戰(zhàn)的實(shí)現(xiàn)

這篇具有很好參考價(jià)值的文章主要介紹了在線五子棋對(duì)戰(zhàn) --- 人機(jī)對(duì)戰(zhàn)的實(shí)現(xiàn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1. 人機(jī)對(duì)戰(zhàn)

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

這里當(dāng)人機(jī)第一次走的時(shí)候, 采用標(biāo)準(zhǔn)開局, 下子在最中間.
當(dāng)玩家走了之后, 人機(jī)就需要去判定下在什么位置合理.

這里采用的是評(píng)分表的方法來計(jì)算落子在每一個(gè)位置的分?jǐn)?shù), 根據(jù)最高分?jǐn)?shù)來進(jìn)行下子.

1.1 演示

在線五子棋對(duì)戰(zhàn) --- 人機(jī)對(duì)戰(zhàn)的實(shí)現(xiàn)

1.2 評(píng)分表

分析棋形的幾種情況.
例如, 自己是黑子.
"_" 代表 沒有子, "1" 代表 黑子 , "0" 代表 白子

當(dāng)落子只有一顆子的情況
_ 1 _
_ 1 0
0 1 _
0 1 0

當(dāng)落子有兩顆子的情況
_ 1 1 _
_ 1 1 0
0 1 1 _
0 1 1 0

當(dāng)落子有三顆子的情況
_ 1 1 1 _
_ 1 1 1 0
0 1 1 1 _
0 1 1 1 0

當(dāng)落子有四顆子的情況
_ 1 1 1 1 _
_ 1 1 1 1 0
0 1 1 1 1 _
0 1 1 1 1 0

當(dāng)落子有五顆子的情況
_ 1 1 1 1 1 _
_ 1 1 1 1 1 0
0 1 1 1 1 1 _
0 1 1 1 1 1 0

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

這里設(shè)計(jì)一種分?jǐn)?shù)表

一子情況

在線五子棋對(duì)戰(zhàn) --- 人機(jī)對(duì)戰(zhàn)的實(shí)現(xiàn)

二子情況

在線五子棋對(duì)戰(zhàn) --- 人機(jī)對(duì)戰(zhàn)的實(shí)現(xiàn)

三子情況

在線五子棋對(duì)戰(zhàn) --- 人機(jī)對(duì)戰(zhàn)的實(shí)現(xiàn)

四子情況

在線五子棋對(duì)戰(zhàn) --- 人機(jī)對(duì)戰(zhàn)的實(shí)現(xiàn)

五子情況

在線五子棋對(duì)戰(zhàn) --- 人機(jī)對(duì)戰(zhàn)的實(shí)現(xiàn)

1.3 算法思路

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

例如, 下子是黑子.
?
橫向, 去看左邊有多少個(gè)黑子, 多少白子, 去看右邊有多少個(gè)黑子, 多少白子. 然后根據(jù)評(píng)分表, 算得分?jǐn)?shù).
?
縱向, 去看上方有多少黑子, 多少白子, 再去下方看有多少個(gè)黑子, 多少白子, 然后根據(jù)評(píng)分表, 算得分?jǐn)?shù).
?
左斜, 去左下方看有多少黑子, 多少白子, 再去右上方看有多少黑子, 多少白子, 然后根據(jù)評(píng)分表, 算得分?jǐn)?shù).
?
右斜. 去左上方看有多少黑子,多少白子, 再去右下方看有多少黑子, 多少白子, 然后根據(jù)評(píng)分表, 算得分?jǐn)?shù).

將四個(gè)方向的得分加起來, 算得分?jǐn)?shù), 進(jìn)行下子.

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

這里就讓, 對(duì)每個(gè)位置, 機(jī)器人落子, 和玩家落子, 算得機(jī)器人落子的得分, 和玩家落子的得分, 對(duì)分?jǐn)?shù)進(jìn)行相加, 然后再去比較, 當(dāng)前是最大的得分情況, 就去當(dāng)前位置落子.

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

1.4 具體代碼

1.4.1 評(píng)分表方法

根據(jù)評(píng)分表來分配分?jǐn)?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ù)
如果遇到空格就不計(jì)算了, 遇到別人的棋子也不計(jì)算了

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ù)
如果遇到空格就不計(jì)算了, 遇到別人的棋子也不計(jì)算了

    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ù)
如果遇到空格就不計(jì)算了, 遇到別人的棋子也不計(jì)算了

    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ù)
如果遇到空格就不計(jì)算了, 遇到別人的棋子也不計(jì)算了

 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)先五子連珠就直接下棋.
如果沒有這種情況, 再去判定是否他可以五子連珠, 如果有直接堵住
其他就計(jì)算總分?jǐn)?shù)文章來源地址http://www.zghlxwxcb.cn/news/detail-451679.html

    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 確認(rèn)落子位置的方法

 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)于在線五子棋對(duì)戰(zhàn) --- 人機(jī)對(duì)戰(zhàn)的實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C++項(xiàng)目:在線五子棋對(duì)戰(zhàn)網(wǎng)頁版--匹配對(duì)戰(zhàn)模塊開發(fā)

    玩家匹配是根據(jù)自己的天梯分?jǐn)?shù)進(jìn)行匹配的,而服務(wù)器中將玩家天梯分?jǐn)?shù)分為三個(gè)檔次: 1. 普通:天梯分?jǐn)?shù)小于2000分 2. 高手:天梯分?jǐn)?shù)介于2000~3000分之間 3. 大神:天梯分?jǐn)?shù)大于3000分 當(dāng)玩家進(jìn)行對(duì)戰(zhàn)匹配時(shí),服務(wù)器會(huì)根據(jù)檔次,將玩家送到不同檔次的匹配隊(duì)列當(dāng)中。共有

    2024年02月13日
    瀏覽(20)
  • C++在線五子棋對(duì)戰(zhàn)(網(wǎng)頁版)項(xiàng)目:websocket協(xié)議

    C++在線五子棋對(duì)戰(zhàn)(網(wǎng)頁版)項(xiàng)目:websocket協(xié)議

    目標(biāo):認(rèn)識(shí)理解websocket協(xié)議、websocket切換過程和websocket協(xié)議格式。認(rèn)識(shí)和學(xué)會(huì)使用websocketpp庫常用接口。了解websocketpp庫搭建服務(wù)器流程,認(rèn)識(shí)和學(xué)會(huì)使用websocketpp庫bin接口,最后使用websocketpp庫搭建服務(wù)器。 平時(shí)我們?cè)诠淠硨?,點(diǎn)擊商品查看商品信息,從HTTP角度來看,就是客

    2024年02月13日
    瀏覽(39)
  • C++項(xiàng)目:在線五子棋對(duì)戰(zhàn)網(wǎng)頁版--數(shù)據(jù)模塊開發(fā)

    數(shù)據(jù)管理模塊,基于mysql數(shù)據(jù)庫進(jìn)行數(shù)據(jù)管理以及封裝數(shù)據(jù)管理模塊實(shí)現(xiàn)數(shù)據(jù)庫訪問。因此,在數(shù)據(jù)庫中,我需要為每一張表創(chuàng)建出對(duì)應(yīng)類,通過類實(shí)例化的對(duì)象來訪問這張數(shù)據(jù)庫表中的數(shù) 據(jù),這樣的話當(dāng)我們要訪問哪張表的時(shí)候,使?哪個(gè)類實(shí)例化的對(duì)象即可。 那么在五子

    2024年02月13日
    瀏覽(22)
  • 基于FPGA(basys3)的雙人對(duì)戰(zhàn)人機(jī)對(duì)戰(zhàn)五子棋(vivado)課程設(shè)計(jì)項(xiàng)目

    基于FPGA(basys3)的雙人對(duì)戰(zhàn)人機(jī)對(duì)戰(zhàn)五子棋(vivado)課程設(shè)計(jì)項(xiàng)目

    目錄 主界面顯示與選擇模式 雙人對(duì)戰(zhàn) 人機(jī)對(duì)戰(zhàn) 勝利界面顯示 部分源碼 VGA顯示器顯示圖片,顯示圖片利用Block Memory Generator將圖片像素點(diǎn)儲(chǔ)存在RAM里面。 效果圖:(防止侵權(quán)打了馬賽克) ?通過開發(fā)板上的按鍵進(jìn)行模式選擇,模式確定 雙人對(duì)戰(zhàn)就是采用簡(jiǎn)單的存數(shù)組的辦法

    2024年01月18日
    瀏覽(53)
  • C++ 實(shí)現(xiàn)對(duì)戰(zhàn)AI五子棋

    C++ 實(shí)現(xiàn)對(duì)戰(zhàn)AI五子棋

    ?個(gè)人主頁: 日刷百題 系列專欄 : 〖C/C++小游戲〗 〖Linux〗 〖數(shù)據(jù)結(jié)構(gòu)〗 ? 〖 C語言 〗 ?? 歡迎各位 → 點(diǎn)贊 ??+ 收藏 ??+ 留言 ??? ? ? ? ? ?為了能夠快速上手一門語言,我們往往在學(xué)習(xí)了基本語法后,采用寫一個(gè)小項(xiàng)目的方式來加深理解語言的語法及運(yùn)用,本文采

    2024年02月03日
    瀏覽(25)
  • JAVA五子棋手機(jī)網(wǎng)絡(luò)對(duì)戰(zhàn)游戲的設(shè)計(jì)與實(shí)現(xiàn)(源代碼+論文)

    在現(xiàn)代社會(huì)中,手機(jī)及其它無線設(shè)備越來越多的走進(jìn)普通老百姓的工作和生活。 隨著3G技術(shù)的普及與應(yīng)用,基于Java開發(fā)的軟件在手機(jī)上的使用非常的廣泛,手機(jī)增值服務(wù)的內(nèi)容也是越來越多,對(duì)豐富人們的生活內(nèi)容、提供快捷的資訊起著不可忽視的作用。 本文基于J2ME技術(shù),以

    2024年02月09日
    瀏覽(23)
  • 【項(xiàng)目設(shè)計(jì)】網(wǎng)絡(luò)對(duì)戰(zhàn)五子棋(上)

    【項(xiàng)目設(shè)計(jì)】網(wǎng)絡(luò)對(duì)戰(zhàn)五子棋(上)

    想回家過年… 1.1 http1.0/1.1和websocket協(xié)議 1. a. http協(xié)議在Linux的學(xué)習(xí)部分我們就已經(jīng)學(xué)習(xí)過了,當(dāng)時(shí)http和https是一塊學(xué)的,我們當(dāng)時(shí)其實(shí)已經(jīng)了解了http的大部分知識(shí)內(nèi)容,比如http請(qǐng)求和響應(yīng)的格式,各自的報(bào)頭字段都有哪些,cookie和session機(jī)制,http1.1的長(zhǎng)連接策略keep-alive,還有

    2024年02月07日
    瀏覽(21)
  • Linux項(xiàng)目實(shí)戰(zhàn)——五子棋(單機(jī)人人對(duì)戰(zhàn)版)

    Linux項(xiàng)目實(shí)戰(zhàn)——五子棋(單機(jī)人人對(duì)戰(zhàn)版)

    Linux操作系統(tǒng)項(xiàng)目實(shí)戰(zhàn)——五子棋 GIF: 目錄 ? ? ? ? ???Linux操作系統(tǒng)項(xiàng)目——五子棋 一、問題導(dǎo)引: 二、實(shí)現(xiàn)要求: 三、五子棋原理: 1.落子數(shù)據(jù)信息保存載體: 2.落子思路: 3.判斷“五子連珠” 四、項(xiàng)目實(shí)現(xiàn)步驟: Ⅰ.創(chuàng)建目錄及文件: 1.在Linux環(huán)境下創(chuàng)建名為Gobang的文

    2024年02月03日
    瀏覽(26)
  • 網(wǎng)頁版Java(Spring/Spring Boot/Spring MVC)五子棋項(xiàng)目(四)對(duì)戰(zhàn)模塊

    網(wǎng)頁版Java(Spring/Spring Boot/Spring MVC)五子棋項(xiàng)目(四)對(duì)戰(zhàn)模塊

    匹配成功返回?cái)?shù)據(jù) 1. message消息類別 2. ok 3. reson 4. 房間id 5. 雙方id 6.白色玩家 一個(gè)類記錄房間中的信息(房間id,兩個(gè)用戶id,是否為白棋) 信息提示框 處理匹配API 初始化游戲(棋盤,下一個(gè)棋子,接受棋子處理響應(yīng),判斷是否結(jié)束) 1. 客戶端連接到游戲房間后, 服務(wù)器返回

    2024年02月13日
    瀏覽(20)
  • 2.6.C++項(xiàng)目:網(wǎng)絡(luò)版五子棋對(duì)戰(zhàn)之?dāng)?shù)據(jù)管理模塊-游戲房間管理模塊的設(shè)計(jì)

    2.6.C++項(xiàng)目:網(wǎng)絡(luò)版五子棋對(duì)戰(zhàn)之?dāng)?shù)據(jù)管理模塊-游戲房間管理模塊的設(shè)計(jì)

    對(duì)匹配成功的玩家創(chuàng)建房間,建立起一個(gè)小范圍的玩家之間的關(guān)聯(lián)關(guān)系! 房間里一個(gè)玩家產(chǎn)生的動(dòng)作將會(huì)廣播給房間里的其他用戶。 將這些房間管理起來,以便于進(jìn)行房間生命周期的控制! 游戲房間類: // 實(shí)現(xiàn)兩個(gè)部分: // 1. 房間的設(shè)計(jì) // 2. 房間管理的設(shè)置 // 游戲房間的

    2024年02月08日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包