成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

華容道游戲(上)

xi4oh4o / 3399人閱讀

摘要:華容道游戲看似簡單,但求解需要設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)比較復(fù)雜,還牽涉到棋類游戲的棋局判斷,所以整個(gè)過程還是挺費(fèi)勁的。華容道游戲介紹華容道游戲據(jù)說來源于三國故事諸葛亮智算華容,關(guān)云長義釋曹操。

此為《算法的樂趣》讀書筆記,我用javascript(ES6)重新實(shí)現(xiàn)算法。

華容道游戲看似簡單,但求解需要設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)比較復(fù)雜,還牽涉到棋類游戲的棋局判斷,所以整個(gè)過程還是挺費(fèi)勁的。我盡量用面向?qū)ο蟮乃枷雭磉M(jìn)行封裝,整個(gè)過程將分成幾個(gè)部分記錄下來,今天是第一部分,數(shù)據(jù)結(jié)構(gòu)的定義與初始化。
華容道游戲介紹

華容道游戲據(jù)說來源于三國故事“諸葛亮智算華容,關(guān)云長義釋曹操”。在一個(gè)5×4的棋盤上布置多名蜀國大將和軍士作為棋子,將曹操圍困在中間,通過滑動(dòng)各個(gè)棋子,幫助曹操移動(dòng)到出口位置逃走。

算法原理

華容道的數(shù)學(xué)原理尚未研究清楚,還沒有數(shù)學(xué)方法可以一勞永逸的解決它,因此我們只能用計(jì)算機(jī)來窮舉所有的可能解,并找出最優(yōu)解。

代碼及思路

棋局包括棋盤的狀態(tài)和棋子的狀態(tài)兩部分,我們是要用計(jì)算機(jī)來演化和搜索棋局。對(duì)于一個(gè)棋局,如果有一種或多種移動(dòng)武將的方法,這個(gè)棋局就可以演化成一個(gè)或多個(gè)新的棋局,每個(gè)新棋局又可以根據(jù)移動(dòng)武將的方式演化成更多的棋局。

常量定義
const MAX_WARRIOR_TYPE = 5;                                //格子被武將占據(jù)的狀態(tài),空或武將序號(hào),1+4
const HRD_GAME_ROW = 5;                                    //棋盤實(shí)際行數(shù)
const HRD_GAME_COL = 4;                                    //棋盤實(shí)際列數(shù)
const HRD_BOARD_WIDTH = 6;                                 //棋盤定義寬度
const HRD_BOARD_HEIGHT = 7;                                //棋盤定義高度
const BOARD_CELL_EMPTY = 0;                                //格子空置代碼
const BOARD_CELL_BORDER = -1;                              //哨兵代碼
const DIRECTION = [ [0, -1], [1, 0], [0, 1], [-1, 0] ]     //移動(dòng)方向定義
移動(dòng)操作定義
class MoveAction{
    constructor(heroIdx, dirIdx){                          
        this.heroIdx = heroIdx || 0                        //武將序號(hào)
        this.dirIdx = dirIdx  || 0                         //移動(dòng)方向
    }
}
武將類型定義
const WARRIOR_TYPE = {
    HT_BLOCK : 1,  //1x1
    HT_VBAR : 2,   //1x2
    HT_HBAR : 3,   //2x1
    HT_BOX : 4     //2x2
}
武將定義
class Warrior {
    constructor(type, left, top){
        this.type = type
        this.left = left
        this.top = top
    }
}
棋局對(duì)象定義

二維數(shù)組表示棋盤(7×6),擴(kuò)大了一圈,在外圍設(shè)置了“哨兵”;棋盤上各點(diǎn)為零表示空,數(shù)字代表武將的序號(hào)。

class HrdGameState {
    constructor(){
        this.board = []                              //棋盤
        for(let i = 0; i
武將放置函數(shù)
function addGameStateHero(gameState, heroIdx, hero)
{
    if(isPositionAvailable(gameState, hero.type, hero.left, hero.top))     //檢測給定位置是否能放置該武將
    {
        takePosition(gameState, heroIdx, hero.type, hero.left, hero.top);    //放置武將到棋盤上
        gameState.heroes.push(hero);                        //將武將存入列表中
        return true;
    }

    return false;
}
檢測能否放置武將函數(shù)
function isPositionAvailable(gameState, type, left, top)
{
    let isOK = false;

    switch(type)
    {
    case WARRIOR_TYPE.HT_BLOCK:
        isOK = (gameState.board[top + 1][left + 1] == BOARD_CELL_EMPTY);
        break;
    case WARRIOR_TYPE.HT_VBAR:
        isOK = (gameState.board[top + 1][left + 1] == BOARD_CELL_EMPTY)
               && (gameState.board[top + 2][left + 1] == BOARD_CELL_EMPTY);
        break;
    case WARRIOR_TYPE.HT_HBAR:
        isOK = (gameState.board[top + 1][left + 1] == BOARD_CELL_EMPTY)
               && (gameState.board[top + 1][left + 2] == BOARD_CELL_EMPTY);
        break;
    case WARRIOR_TYPE.HT_BOX:
        isOK = (gameState.board[top + 1][left + 1] == BOARD_CELL_EMPTY)
               && (gameState.board[top + 1][left + 2] == BOARD_CELL_EMPTY)
               && (gameState.board[top + 2][left + 1] == BOARD_CELL_EMPTY)
               && (gameState.board[top + 2][left + 2] == BOARD_CELL_EMPTY);
        break;
    default:
        isOK = false;
        break;
    }

    return isOK;
}
放置武將函數(shù)
function takePosition(gameState, heroIdx, type, left, top)
{
    switch(type)
    {
    case WARRIOR_TYPE.HT_BLOCK:
        gameState.board[top + 1][left + 1] = heroIdx + 1;
        break;
    case WARRIOR_TYPE.HT_VBAR:
        gameState.board[top + 1][left + 1] = heroIdx + 1;
        gameState.board[top + 2][left + 1] = heroIdx + 1;
        break;
    case WARRIOR_TYPE.HT_HBAR:
        gameState.board[top + 1][left + 1] = heroIdx + 1;
        gameState.board[top + 1][left + 2] = heroIdx + 1;
        break;
    case WARRIOR_TYPE.HT_BOX:
        gameState.board[top + 1][left + 1] = heroIdx + 1;
        gameState.board[top + 1][left + 2] = heroIdx + 1;
        gameState.board[top + 2][left + 1] = heroIdx + 1;
        gameState.board[top + 2][left + 2] = heroIdx + 1;
        break;
    default:
        break;
    }
}
棋局對(duì)象測試

測試代碼

var hs = [new Warrior(WARRIOR_TYPE.HT_VBAR,0,0),          //構(gòu)建武將列表,初始棋局
          new Warrior(WARRIOR_TYPE.HT_BOX,1,0),
          new Warrior(WARRIOR_TYPE.HT_VBAR,3,0),
          new Warrior(WARRIOR_TYPE.HT_VBAR,0,2),
          new Warrior(WARRIOR_TYPE.HT_HBAR,1,2),
          new Warrior(WARRIOR_TYPE.HT_VBAR,3,2),
          new Warrior(WARRIOR_TYPE.HT_BLOCK,0,4),
          new Warrior(WARRIOR_TYPE.HT_BLOCK,1,3),
          new Warrior(WARRIOR_TYPE.HT_BLOCK,2,3),
          new Warrior(WARRIOR_TYPE.HT_BLOCK,3,4)
]
var gameState = new HrdGameState()                        //新建棋局對(duì)象
gameState.initState(hs)                                   //初始化棋局,往空棋盤上擺開局
console.dir(gameState.board)                              //輸出棋局
測試結(jié)果

結(jié)果符合預(yù)期

[ [ -1, -1, -1, -1, -1, -1 ],
  [ -1, 1, 2, 2, 3, -1 ],
  [ -1, 1, 2, 2, 3, -1 ],
  [ -1, 4, 5, 5, 6, -1 ],
  [ -1, 4, 8, 9, 6, -1 ],
  [ -1, 7, 0, 0, 10, -1 ],
  [ -1, -1, -1, -1, -1, -1 ] ]
完整代碼

代碼托管在開源中國,其中的hyd.js即華容道解法。

https://gitee.com/zhoutk/test
小結(jié)

盡量使用面向?qū)ο蟮乃枷雭斫鉀Q問題,讓數(shù)據(jù)和操作綁定在一起,努力使代碼容易看懂。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/79346.html

相關(guān)文章

  • 容道游戲(中)

    摘要:棋類游戲一般需要行數(shù)列數(shù)狀態(tài)數(shù)個(gè)狀態(tài),以華容道為例,需要為個(gè)狀態(tài)分配編碼值。對(duì)于華容道游戲來說,這種左右鏡像的情況對(duì)于滑動(dòng)棋子尋求結(jié)果的影響是一樣的。 此為《算法的樂趣》讀書筆記,我用javascript(ES6)重新實(shí)現(xiàn)算法。 華容道游戲看似簡單,但求解需要設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)比較復(fù)雜,還牽涉到棋類游戲的棋局判斷,所以整個(gè)過程還是挺費(fèi)勁的。我盡量用面向?qū)ο蟮乃枷雭磉M(jìn)行封裝,整個(gè)過程將分成幾...

    Jason 評(píng)論0 收藏0
  • 容道游戲(下)

    摘要:華容道游戲看似簡單,但求解需要設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)比較復(fù)雜,還牽涉到棋類游戲的棋局判斷,所以整個(gè)過程還是挺費(fèi)勁的。 此為《算法的樂趣》讀書筆記,我用javascript(ES6)重新實(shí)現(xiàn)算法。 華容道游戲看似簡單,但求解需要設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)比較復(fù)雜,還牽涉到棋類游戲的棋局判斷,所以整個(gè)過程還是挺費(fèi)勁的。我盡量用面向?qū)ο蟮乃枷雭磉M(jìn)行封裝,整個(gè)過程將分成幾個(gè)部分記錄下來,今天是最后一部分,棋局的廣...

    BicycleWarrior 評(píng)論0 收藏0
  • 用React寫一個(gè)數(shù)字容道,你需要知道的秘密

    摘要:還在上班很無聊數(shù)字華容道暢玩地址開發(fā)源碼地址這個(gè)叫前言年末了。光隨機(jī)生成一個(gè)亂序數(shù)列是不夠的,還得保證這個(gè)數(shù)列的逆序數(shù)為偶數(shù),嗦嘎。所以,我們直接將交換的次數(shù),記為數(shù)列逆序數(shù)個(gè)數(shù),就達(dá)到了想要的效果。 還在上班?很無聊?數(shù)字華容道暢玩地址 開發(fā)源碼地址 這個(gè)叫前言 年末了。哦,不,要過年了。以前只能一路站到公司的我,今早居然是坐著過來的。新的一年,總要學(xué)一個(gè)新東西來迎接新的未來吧,所以...

    Jason 評(píng)論0 收藏0
  • 一只青蛙跳下水

    這是一個(gè)關(guān)于獨(dú)立鉆石的游戲 獨(dú)立鉆石起源于法國,是一種風(fēng)靡世界的益智游戲與中國發(fā)明的華容道、匈牙利人發(fā)明的魔方, 并稱為智力游戲界的三大不可思議它類似于跳棋,但不能走步,只能跳。走棋時(shí)棋子跳過相鄰的棋子到空位上,并把跳過的棋子吃掉。棋子可以沿棋盤的格線橫跳、縱跳,但不能斜跳 了解更多 游戲截圖 showImg(https://segmentfault.com/img/bVAdq3); 游戲地址 游...

    鄒強(qiáng) 評(píng)論0 收藏0
  • “云”必有一戰(zhàn),商業(yè)誘惑的第一顆棋子就是游戲

    摘要:不難理解,近兩年云計(jì)算技術(shù)如風(fēng)暴一般席卷了世界的每一個(gè)角落,游戲市場自然也不會(huì)例外。同樣不難猜測,收購與云服務(wù)器也成為沃爾瑪進(jìn)入這部分市場的慣用籌碼,電商對(duì)云技術(shù)應(yīng)用的把控成為他們想要進(jìn)一步挑戰(zhàn)游戲的動(dòng)力所在。不久前,谷歌在今年舉行的游戲開發(fā)者大會(huì)上宣布了自家的云游戲服務(wù)平臺(tái):Stadia,隨后亞馬遜也表示自己正在搭建云游戲服務(wù),甚至連零售業(yè)巨頭沃爾瑪都表示計(jì)劃啟動(dòng)自己的云游戲平臺(tái),大佬們的...

    JaysonWang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<