最近看到一個頗有「將來感」的新聞:
一輛 特斯拉 在拉斯維加斯出了車禍,撞「死」了一個……emmmm……機器人。不知道是意外仍是炒做,又或者是這位機器人故意碰瓷,反正人們也沒法從受害者口中瞭解「 被特斯拉撞是怎樣一種體驗 」了。python
圖爲受害者,情緒看起來很穩定git
隨着「 人工智能 」的應用場景愈來愈多,此類新聞之後可能也會愈來愈頻繁。希望這些機器人們能嚴格遵照 阿西莫夫三定律 :程序員
在早些年,人工智能這個概念尚未這麼火的時候,提到 AI 常常是指 遊戲中電腦角色的運行策略 。好比槍戰遊戲、即時戰略遊戲、MOBA 類遊戲中的電腦方,對於 尋路、攻擊、躲避 等行爲的判斷和執行。早期的一些 AI 有點傻,真的能夠稱得上「人工智障」。好比玩過星際爭霸的玩家必定知道「勾農民」的戰術:你只要攻擊一下電腦方的基地,它的全部農民就會放下手中工做來追着你。github
然而正由於如此,產生了一種程序員之間特有的較量: 編程遊戲 。全部人 針對某一個遊戲規則編寫策略,看誰的策略表現得更好 ,能戰勝其餘人,最終取得勝利。像星際爭霸、CS之類的經典遊戲都有過相似的比賽。優秀的代碼甚至能夠挑戰人類,好比這兩年爲人所熟知的 AlphaGo ,就是此類的極致。而 對於編程新手來講,編程遊戲也是練習代碼的極好方式。編程
在衆多可編程的遊戲中,有個比較知名的項目: Robocode 。它是 IBM 在 2001 年發佈的 坦克機器人戰鬥仿真引擎 ,並在數年後開源。簡單來講,它就是一個「坦克大戰」的遊戲,你能夠控制一輛坦克,和別人對戰。然而與通常遊戲所不一樣的是:你不是經過鍵盤鼠標控制坦克,而是須要 本身寫一段代碼,制定坦克的策略 ,在遊戲開始後自動對戰。框架
坦克由三部分組成:dom
在代碼中,你能夠經過接口獲取如下數據:ide
以及控制坦克的:學習
一些基本規則:人工智能
因此咱們要作的就是: 儘量避開子彈 、 儘量避免撞牆和撞上別人 、 儘量擊中敵人 (打不中不如不打)、活到最後。這和當下熱門的吃雞遊戲(絕地求生)的套路就是一致的嘛。
但是,Robocode 使用的語言是 Java ,這是 IBM 當年所大力推廣的。若是你想嘗試,但不懂 JAVA 就尷尬了。好在有人作了個 Python 移植版本: Python-Robocode 。
項目地址:
https://github.com/turkishviking/Python-Robocode/wiki/Bot-Example
不過呢,這個項目有點年久失修了,用的仍是 python2 + PyQt4 ,在不少比較新的系統上運行會有一些小 bug,好比菜單欄點不出來、不能調參數之類。不要抱過高要求,仍是能夠玩玩的,我也就玩了一百多局而已。
具體方式:
python main.py
啓動項目
這裏我再給一個更簡單的策略示例:
from robot import Robot import random # 坦克類 class World(Robot): # 初始化 def init(self): self.lockRadar("gun") # 遊戲循環 def run(self): self.gunTurn(90) self.turn(random.randint(-45, 45)) self.move(random.randint(-100, 100)) # 發現敵人事件 def onTargetSpotted(self, botId, botName, botPos): self.fire(1) self.gunTurn(10)
這裏我定義了一個名叫 World 的坦克類,繼承框架提供的 Robot 類。在初始化裏,把雷達和炮臺角度綁定,這樣只要發現敵人就能夠開炮了。run是主體策略部分,會一直循環執行,這裏我讓它同時作三件事:炮臺旋轉90度、車身旋轉隨機角度、車身前進/後退隨機距離。而當發現敵人後,就開炮,並將炮臺移動10度(避免死鎖)。
就這幾行代碼,保存到 hello.py裏,從菜單欄添加到遊戲中,已經可讓你的坦克上場 PK(當炮灰)了。接下來,你能夠在此基礎上繼續擴展它,實現你本身的策略。
我還寫了一個稍微複雜一點點的版本,對付這幾個示例策略仍是能夠一戰的。
代碼在此:
https:// gitee.com/crossin/snippet/tree/master/tank
或者在公號(Crossin的編程教室)裏回覆關鍵字「 坦克 」獲取。
你能夠下載到你的目錄中,這樣就能夠和我隔空對戰了。歡迎你們把本身的策略發上來。
除了這個 Python 版本的 Robocode 以外,騰訊也作過一個很相似的 HTML5 版本,叫 CodeTank (鵝廠當年還不太習慣收購)。雖然說 idea 不新鮮,但有個很大優點是 能夠在線使用 ,不用下載搭建環境了,並且你能夠看到其餘開發者提交的代碼。對於瞭解一些 JS 的學習者來講,這很是方便。關於 JS 咱們暫時不展開說了。但即便你不太會 JS,也能夠複製一些別人的代碼,嘗試改點參數,這個並不複雜。
在 CodeTank 裏,你也能夠挑戰我,從 坦克庫 - 坦克對戰 裏搜 crossin 就能找到了。
但願你們寓教於樂,玩得開心~
════
其餘文章及回答:
如何自學Python | 新手引導 | 精選Python問答 | Python單詞表 | 人工智能 | 爬蟲 | 我用Python | requests | 計算機視覺 | 字符播放器 | 一圖學Python
歡迎搜索及關注公衆號: Crossin的編程教室