用Python寫AI機器人來玩殭屍骰子

2020-12-06 幻科一米陽光

編程遊戲是一種遊戲類型,玩家不是直接玩遊戲,而是編寫機器人程序來自主玩遊戲。我已經創建了一個Zombie Dice模擬器,允許程式設計師練習他們的技能,同時玩得開心玩遊戲AI。Zombie Dice機器人可以簡單或非常複雜,非常適合課堂練習或個人編程挑戰。

如何玩殭屍骰子

Zombie Dice是有趣的骰子遊戲。玩家是殭屍,試圖吃儘可能多的人類大腦,而不是「槍擊」。他們的臉上有一杯13個骰子,上面有大腦,腳步聲和霰彈槍的圖標。骰子是綠色(大腦更有可能),紅色(霰彈槍更可能)和黃色(在大腦和霰彈槍之間均勻分開)。

輪到他們了:

玩家隨機從杯子中掏出骰子,直到他們手中有三個骰子並滾動它們。玩家總是擲三個骰子。他們拋開任何大腦(人類大腦被吃掉)和霰彈槍(反擊的人)。如果玩家在本回合中留出了三支霰彈槍,他們的回合以零點結束。如果他們決定再次擲骰子,那麼玩家會手上拿著任何骰子。否則,玩家可以選擇結束他們的回合,他們將在每個大腦中收集一個點並將所有骰子返回到下一個玩家的杯子。或者玩家可以選擇繼續轉彎並再次滾動。回到第1步,注意到任何已經出現的骰子都會被重複使用。殭屍骰子有一個「推動你的運氣」遊戲機制:你重新擲骰子越多,你可以獲得的大腦越多,但你最有可能累積三支霰彈槍而失去一切。一旦玩家達到13分,其餘玩家再轉一圈(可能會趕上)並且遊戲結束。得分最高的玩家獲勝。

Bot編程挑戰

要使用pip安裝模擬器,請運行pip install zombiedice(在Windows上)或pip3 install zombiedice(在macOS和Linux上)。要運行帶有一些預製機器人的演示,運行python -m zombiedice(在Windows上)或python3 -m zombiedice(在macOS和Linux上)以查看模擬器的web gui示例:

模擬器可以快速運行數百個遊戲,注意每個機器人獲得了多少勝利和關係。

你將通過編寫一個帶有turn()方法的類來創建機器人,當你的機器人輪到它時,模擬器就會調用它。在這個turn()方法中,你可以zombiedice.roll()像你想要擲骰子一樣經常調用這個函數(當然,你應該在輪到你時至少調用它一次)。類超出了本文的範圍,但您只需更改myzombie.py中的turn()代碼即可:

import zombiediceclass MyZombie: def __init__(self, name): self.name = name def turn(self, gameState): # gameState is a dict with info about the current state of the game. # You can choose to ignore it in your code. diceRollResults = zombiedice.roll() # first roll # roll() returns a dictionary with keys 'brains', 'shotgun', and # 'footsteps' with how many rolls of each type there were. # The 'rolls' key is a list of (color, icon) tuples with the # exact roll result information. # Example of a roll() return value: # {'brains': 1, 'footsteps': 1, 'shotgun': 1, # 'rolls': [('yellow', 'brains'), ('red', 'footsteps'), # ('green', 'shotgun')]} # The code logic for your zombie goes here: brains = 0 while diceRollResults is not None: brains += diceRollResults['brains'] if brains < 2: diceRollResults = zombiedice.roll() # roll again else: breakclass AlwaysRollsTwicePerTurn: def __init__(self, name): self.name = name def turn(self, gameState): zombiedice.roll() zombiedice.roll()zombies = ( zombiedice.examples.RandomCoinFlipZombie(name='Random'), zombiedice.examples.RollsUntilInTheLeadZombie(name='Until Leading'), zombiedice.examples.MinNumShotgunsThenStopsZombie(name='Stop at 2 Shotguns', minShotguns=2), zombiedice.examples.MinNumShotgunsThenStopsZombie(name='Stop at 1 Shotgun', minShotguns=1), MyZombie(name='My Zombie Bot'), AlwaysRollsTwicePerTurn(name='Rolls Twice'), # Add any other zombie players here.)# Uncomment one of the following lines to run in CLI or Web GUI mode:#zombiedice.runTournament(zombies=zombies, numGames=1000)zombiedice.runWebGui(zombies=zombies, numGames=1000)

MyZombie類的turn()方法中的代碼一直在調用,zombiedice.roll()直到它至少滾動了兩個大腦。第二個機器人在AlwaysRollsTwicePerTurn類中實現,它有一個turn()方法,每次轉動只需擲骰子兩次。運行此程序會調用runWebGui()並打開Web瀏覽器,如圖6-1所示,準備運行模擬。您可以檢查zombiedice包的examples.py文件中的原始碼,以了解其他bot如何工作。

嘗試編寫一些自己的機器人來玩Zombie Dice,看看他們如何與其他機器人進行比較。如果你發現自己在現實世界中玩這個遊戲,你將獲得成千上萬的模擬遊戲的好處,告訴你最好的策略之一就是在你擲出兩支霰彈槍後停下來。但你總是可以試試你的運氣......

一步一步構建MyZombie

我將MyZombie在上一節中描述創建類的過程。從這個導入zombiedice模塊的基本模板開始,使用turn()調用方法創建一個類zombiedice.roll(),然後運行錦標賽:

import zombiediceclass MyZombie: def __init__(self, name): self.name = name def turn(self, gameState): zombiedice.roll()zombies = ( zombiedice.examples.RandomCoinFlipZombie(name='Random'), MyZombie(name='My Zombie Bot'),)# Uncomment one of the following lines to run in CLI or Web GUI mode:zombiedice.runWebGui(zombies=zombies, numGames=1000)

在MyZombie至今只滾動骰子一個,這是一個非常保守的策略,是不可能得到很多分。為了確定它是否應該再次滾動,我們需要檢查返回值zombiedice.roll(),這是一個顯示三個骰子滾動結果的字典。它看起來像這樣:

{'brains': 1, 'footsteps': 1, 'shotgun': 1, 'rolls': [('yellow', 'brains'), ('red', 'footsteps'), ('green', 'shotgun')]}

這個字典有一個'brains',, 'footsteps'和'shotgun'鍵,其值是那種滾動的數量。確切的卷在'rolls'鍵的值中:元組列表。每個元組代表一個骰子,由一個顏色和出現的圖標組成。

假設我們想要制定戰略,我們的殭屍將繼續滾動,直到至少有兩個大腦滾動。我們需要跟蹤到目前為止在本回合中已經滾動了多少腦(在一個brains變量中),從那開始0。如果將來的召喚zombiedice.roll()回歸None,那麼我們知道我們在本回合中已經達到或超過了三支霰彈槍並且將獲得零分。更新turn(),使其看起來像這樣:

def turn(self,gameState): diceRollResults = zombiedice.roll() 大腦= 0 而diceRollResults不是None: diceRollResults = zombiedice.roll()

現在代碼將繼續滾動骰子直到它返回None。但就在那時,我們已經達到了三支霰彈槍而失去了轉彎。我們需要添加邏輯,以便在某些時候方法在zombiedice.roll()開始返回之前返回None。讓我們diceRollResults來看看有多少腦子被捲起來:

def turn(self, gameState): diceRollResults = zombiedice.roll() brains = 0 while diceRollResults is not None: diceRollResults = zombiedice.roll()

那更好,現在zombiedice.roll()只要我們在輪到我們還沒有達到兩個大腦滾動時就被調用。但是,這種方法沒有變化的條件。它只是永遠循環!讓我們添加更多代碼:

def turn(self, gameState): diceRollResults = zombiedice.roll() brains = 0 while diceRollResults is not None: brains += diceRollResults['brains'] if brains < 2: diceRollResults = zombiedice.roll()

這個新代碼說如果我們至少推出了兩個大腦,那麼繼續前進並突破循環並最終從方法返回,這告訴模擬器機器人完成了它。

為gameState參數傳遞的值是具有以下鍵的字典:

'CURRENT_ZOMBIE' - 當前轉彎的殭屍的字符串'CURRENT_CUP' - 杯子中的骰子字符串列表(即「紅色」,「黃色」,「綠色」)'CURRENT_HAND' - 正在滾動的骰子列表(應始終為三個長度)'SHOTGUNS_ROLLED' - 本回合中到目前為止滾動的霰彈槍數量'BRAINS_ROLLED' - 本回合中到目前為止滾動的大腦數量'ROLLED_BRAINS_DETAILS' - 每個大腦滾動的骰子字符串列表,用於我們用盡大腦骰子的罕見事件'TURN_START_TIME' - 自當前轉折開始的unix時代以來的時間機器人的想法

你可以在Zombie Dice中嘗試很多策略。嘗試編寫執行以下操作的機器人:

機器人有50%的機會選擇重新滾動。了解這個機器人如何與機器人進行比較,有25%或75%的機會重新滾動。機器人當它到達兩個霰彈槍時停止重新滾動。機器人當它到達兩個霰彈槍時停止重新滾動,除非它沒有領先。(查看gameState字典以查找此信息。)只要杯子裡有綠色骰子就會滾動的機器人。(查看gameState字典以查找此信息。)請務必查看模塊中的examples.py文件,以獲取已經創建的一些機器人的代碼。然後將它們加載到模擬器中,看看它們的表現如何!

相關焦點

  • 骰子獵手:用骰子來戰鬥,像拆彈一樣,策略與運氣並存的卡牌遊戲
    遊戲推薦:用骰子位面決定戰鬥,玩法新穎有趣,策略與運氣並存。遊戲碑語:六面骰子,再啟徵程。《骰子獵人》是Green Grass Oy開發的一款卡牌策略手遊,獲2018芬蘭遊戲獎最佳創意成就提名。玩家通過注有不同生物的六個特殊骰子戰鬥,每個骰子有六面,根據生物不同,骰子六個位面屬性組合也不同。骰子位面有四種屬性,包括劍(攻擊)、盾(護盾)、閃電(魔法)、星星(幸運)四種。操作上,需要選定攻擊對象,再根據需要選擇是否鎖定骰子,骰子充能完畢時選擇是否鎖定目標釋放技能。
  • 被黑客分分鐘玩死的微信聊天機器人
    一個腦洞大開的程序猿寫了用開源程序改了一個微信聊天機器人,並且在不斷調試中給它賦予了n多好玩的功能譬如防撤回信息之類。 以下是正文:前段時間用開源程序做了一個微信聊天機器人,放到i春秋魔法學院群裡做調試。然後被一群黑客玩壞了。但是整個過程還是比較好玩的,所以記錄下來這個事情的來龍去脈,不過提前聲明,這樣做是不對的,沒有考慮後果就貿然跑代碼測試也是不負責任的,尤其是你不知道黑客們會用什麼方法幫你測試,真的有封號的風險哦,請大家不要學我!
  • 骰子玩法大全——收藏起來,以後就這麼玩!
    喝酒怎麼玩骰子?
  • 雲頂之弈灌鉛骰子有什麼用 灌鉛骰子功能介紹[多圖]
    雲頂之弈灌鉛骰子的作用是什麼?灌鉛骰子怎麼使用?灌鉛骰子可以讓你的陣容快速成型,使用灌鉛色子過後你需要英雄的陣容羈絆都會出來,你可以根據自己的需要來進行挑選,這對於快節奏陣容非常好。雲頂之弈灌鉛骰子有什麼用?「灌鉛骰子」,簡單來說就是對某個英雄使用後,商店就會免費刷新一次。
  • Tend.ai 可培訓機器人,幫你同時操作多個3D印表機和雷射切割機
    為什麼不讓機器人來為你做這些事情呢?Tend.ai 就是一個可以滿足您這種需求的新公司,它能夠幫助用戶訓練協作性機器人操作機械,而這種機械操作本來是需要重工業服務機器人來完成的。Tend.ai 的聯合創始人兼 CEO Mark Silliman 在一次採訪中說道:「有一次,我看到我的一個朋友有 20 臺 3D 印表機,為了讓這些機器保持運轉,他妻子必須每隔三分鐘就跑到機器那裡進行一些相關操作,於是我有了這個想法。與其讓配偶來從事這份繁重的操作多個印表機的工作,為什麼不利用最新的協作機器人呢?這些機器人不就是為了與人合作,為人服務的嗎?」
  • 量子測量:「上帝」開始玩骰子了
    量子測量中,「上帝」開始玩骰子了!以至於愛因斯坦作為量子理論的奠基人之一卻至死也不認同量子測量。然而直至今天,科學實驗一次又一次地表明:「上帝」真玩骰子了!還用上次我們舉的例子:在火車上和在飛機裡的量子疊加態。
  • 人生苦短,我用Python,那麼問題來了,普通人要學python嗎?
    話說在金融和IT行當混跡了多年,python一直是被我隨手拿來當個小工具用用,有時候偷懶用python弄個excel自動化整理工具,有時候拿來上各種網站爬蟲搜集點信息,有時候也會拿來寫點量化小工具。那麼到底什麼是python?
  • python入門教程NO.8 用python寫個存款利息計算器
    本文涉及的python基礎語法為def函數,return,函數的各參數示例,匿名函數等函數初識函數是一段組織好的\ 可重複使用的\ 用來實現特定功能的代碼塊。不帶表達式的return相當於返回 None我們通過一個案例來理解一下在上面的例子中,我們講到了形參和實參,那麼具體該如何區分它們呢?形參是形式上的參數的縮寫,實參是實際上的參數的縮寫。以上面的代碼為例:定義函數時的參數 x,y 為形參,調用函數時傳入的參數 5 , 2為實參。
  • python用10行代碼寫一個USB病毒
    於是我心想,能不能用python寫一個程序,讓它在後臺運行。每當有u盤插入的時候,就自動拷貝其中重要文件。如何判斷U盤的插入與否?首先我們打開電腦終端,進入/Volumes目錄,這時候插入U盤,可以發現它被掛載在了這個目錄之下,也就是說,我們只要在固定時間掃描這個目錄,當這個目錄有新文件夾出現的時候,很可能有U盤被插入了。
  • 利用Python來識別並提取圖片中文字
    在文字識別中,許多應用軟體可以幫我們忙,那麼強大的python可以實現圖片中的文字識別嗎?    在學習python的圖像識別中,我們了解到關於中文的識別,效果比較好而且開源的應該就是Tesseract-OCR了,python裡面也有一個包去使用Tesseract-OCR,這個包叫pytesseract。
  • 從0開始學python-6.2 用python讀寫文件
    我們還學習了用python來查找、重命名一個文件。這節課,我們一起學習一下怎麼用python操作一個文件的內容。文件操作對一個文件,我們可以1)讀取裡面的內容、2)往文件裡寫內容、3)追加文件內容。我們來看看用python怎麼做這些事情。打開文件在對文件內容操作之前,我們首先要打開文件。
  • 機器人結構工程師薪資_中國機器學習工程師薪資 - CSDN
    說白了,機器學習就是各種模型做預測,那麼就需要有數據,要想有好的效果,就要把原始的髒數據洗乾淨了才能用。數據內隱藏的信息有時候是肉眼不可見的,那麼就需要一些相關技巧來把有用信息挖出來。所有絞盡腦汁使用的技巧,都是為了能預測的更準確。但是誰也沒辦法做到百分百的命中。
  • 用一篇短文來告訴大家,學習Python都可以用來幹嘛
    python能做太多有趣的事了,看看我是怎麼玩的1.自動發郵件2.自動化操作excel3.定製酷炫二維碼4.下載視頻、MP35.爬蟲6.HTML\網頁自動生成PDF7.製作可視化圖表8.地理空間分析9.數據分析10連接資料庫11.機器學習如果你不知道如何學習python,入門困難,如果你想從事數據分析,學習分析技術,如果你想學習sql
  • 10行Python代碼也能實現,親測好用!
    事實上,本文作者開發了一個基於Python的函數庫,可以用十行代碼高效實現目標檢測。還不熟悉的讀者,我們先來看看,目標檢測到底是什麼,以及軟體開發人員面臨的挑戰。目標檢測是藉助於計算機和軟體系統在圖像/場景中,定位目標並識別出每個目標的類別的技術。目前已廣泛用於人臉檢測、車輛檢測、行人計數、網絡圖像、安全系統和無人駕駛汽車等領域。
  • 用python識別驗證碼
    今天,我們就簡單的說下,怎麼用python來處理驗證碼。(注意:我所有的python相關的文章用的都是python3。)準備工作1、tesseract-ocr軟體Tesseract的OCR引擎最先由HP實驗室於1985年開始研發,至1995年時已經成為OCR業內最準確的三款識別引擎之一。然而,HP不久便決定放棄OCR業務,Tesseract也從此塵封。
  • 薛丁格的貓、雙縫幹涉實驗、平行宇宙,上帝究竟玩不玩骰子?
    正如愛因斯坦所說的:上帝不玩骰子,但是量子力學讓我們不得不相信,上帝似乎是玩骰子的。宇宙中不可能存在這麼大的一片空白,說明這塊冷斑無法用「缺少物質」來解釋。科學家認為這是另一個宇宙的證據。加州大學聖芭芭拉分校的量子物理學家將一個人類頭髮絲寬度的微型「划槳」放入到一個真空罐中,隨後他們撥動「划槳」,它同時出現了振動和靜止兩種量子狀態, 從本質上說,那就意味著物體可以同時存在兩種狀態(或者說存在兩個宇宙)。
  • 薛丁格的貓、雙縫幹涉實驗、平行宇宙,上帝究竟玩不玩骰子?
    正如愛因斯坦所說的:上帝不玩骰子,但是量子力學讓我們不得不相信,上帝似乎是玩骰子的。二,雙縫幹涉實驗。20世紀50年代物理學家通過雙縫幹涉實驗發現量子的不確定性,從微觀層面驗證了「薛丁格貓」佯謬,也推導出了平行宇宙。
  • 用R也可以跑Python了
    但如果你還想來搞點深度學習,整個自然語言處理,那你可還真得用Python。如果你處於交叉領域,很可能就需要兩種語言切換。後果是,寫個for loop還出bug真的是家常便飯。報警!通過安裝包,你現在可以在R上運行Python的安裝包和函數了~今天文摘菌就來教教你咋用這個reticulate包。
  • Python為什麼這麼火?小孩子適合學習python編程嗎?
    今天咱們就來好好聊聊最直接的幾個原因。不想看過程的也可以直接拉到最後一段看結論哈。原因一、Python是一種面向對象的語言誰說程式設計師找不著對象?在Python裡分分鐘就可以寫個新對象,不喜歡的話甚至還能刪掉呢。程式語言兩個非常重要的概念,即面向對象與面向過程。
  • 慢步學習,python語言編程,來扯扯語言的學習理解
    那麼慢步來說說自己對程式語言的學習理解吧。關於語言的共性——累積學習程式語言,跟一個人學習一門自然語言(英語、日語)是差不多的。學習在某種情景下使用語言的詞彙/語句來表達。比如表達善意的問候:「你好」、「hello」、「こんにちは(抗你知哇)」。