代码吃鸡:Python-Robocode
最近看到一個很有“未來感”的新聞:
一輛特斯拉在拉斯維加斯出了車禍,撞“死”了一個……emmmm……機器人。不知道是意外還是炒作,又或者是這位機器人故意碰瓷,反正人們也無法從受害者口中了解“被特斯拉撞是怎樣一種體驗”了。
隨著“人工智能”的應用場景越來越多,此類新聞以后可能也會越來越頻繁。但愿這些機器人們能嚴格遵守阿西莫夫三定律:
在早些年,人工智能這個概念還沒有這么火的時候,提到 AI 經常是指游戲中電腦角色的運行策略。比如槍戰游戲、即時戰略游戲、MOBA 類游戲中的電腦方,對于尋路、攻擊、躲避等行為的判斷和執行。早期的一些 AI 有點傻,真的可以稱得上“人工智障”。比如玩過星際爭霸的玩家一定知道“勾農民”的戰術:你只要攻擊一下電腦方的基地,它的所有農民就會放下手中工作來追著你。
然而正因為如此,產生了一種程序員之間特有的較量:編程游戲。所有人針對某一個游戲規則編寫策略,看誰的策略表現得更好,能打敗其他人,最終取得勝利。像星際爭霸、CS之類的經典游戲都有過類似的比賽。優秀的代碼甚至可以挑戰人類,比如這兩年為人所熟知的 AlphaGo,就是此類的極致。而對于編程新手來說,編程游戲也是練習代碼的極好方式。
在眾多可編程的游戲中,有個比較知名的項目:Robocode。它是 IBM 在 2001 年發布的坦克機器人戰斗仿真引擎,并在數年后開源。簡單來說,它就是一個“坦克大戰”的游戲,你可以控制一輛坦克,和別人對戰。然而與一般游戲所不同的是:你不是通過鍵盤鼠標控制坦克,而是需要自己寫一段代碼,制定坦克的策略,在游戲開始后自動對戰。
坦克由三部分組成:
在代碼中,你可以通過接口獲取以下數據:
以及控制坦克的:
一些基本規則:
所以我們要做的就是:盡可能避開子彈、盡可能避免撞墻和撞上別人、盡可能擊中敵人(打不中不如不打)、活到最后。這和當下熱門的吃雞游戲(絕地求生)的套路就是一致的嘛。
可是,Robocode 使用的語言是 Java,這是 IBM 當年所大力推廣的。如果你想嘗試,但不懂 JAVA 就尷尬了。好在有人做了個 Python 移植版本:Python-Robocode。
項目地址:
https://github.com/turkishviking/Python-Robocode/wiki/Bot-Example
不過呢,這個項目有點年久失修了,用的還是 python2 PyQt4,在很多比較新的系統上運行會有一些小 bug,比如菜單欄點不出來、不能調參數之類。不要抱太高要求,還是可以玩玩的,我也就玩了一百多局而已。
具體方式:
這里我再給一個更簡單的策略示例:
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的編程教室
總結
以上是生活随笔為你收集整理的代码吃鸡:Python-Robocode的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: docker --- mysql的部署
- 下一篇: 西南科技大学OJ题 顺序表上数据的划分