一个模拟骰子游戏的僵尸骰子,可以运行僵尸AI玩家。
zombiedice的Python项目详细描述
一个模拟骰子游戏僵尸骰子,可以运行机器人人工智能玩家。
僵尸骰子是一个快速,有趣的骰子游戏史蒂夫杰克逊游戏。玩家是僵尸,他们试图吃掉尽可能多的人类大脑,而不被人类“猎杀”。轮到他们时,玩家将从13个骰子中随机选择3个骰子并掷骰子。死者的脸是大脑,脚步声和猎枪。你一个脑袋得一分,但如果你掷一个累积的三把散弹枪,你已经被射击了,你的回合得零分。然后你可以决定重新掷骰子,或者把你的回合传给下一个玩家。如果一个骰子出现“足迹”,如果玩家决定重新掷骰子,它会被再次使用。(玩家每次掷骰子总是使用三个骰子。)僵尸骰子有一个“推你的运气”游戏机制:你越是选择重新掷骰子,你可以得到更多的大脑,但你越有可能收集到三支散弹枪。游戏一直持续到一个玩家达到13个大脑,然后其他玩家再得到一个回合。骰子是绿色的(更可能是大脑),红色的(更可能是散弹枪),黄色的(大脑和散弹枪是均匀的)。
僵尸骰子的更完整规则可以在这里找到:
- PDF of the rules in English
- Animated Flash demo of how to play
- Instructables article with the rules
- YouTube video of someone explaining the rules
这个模拟器对于初级/中级编程课程或竞赛很有用。制作机器人程序的api很简单,它还提供了一个web ui,用于在比赛运行时投影一个漂亮的比赛显示。
快速启动
要安装,请运行通常的pip install zombiedice(在Windows上)或pip3 install zombiedice(在MacOS/Linux上)。
您可以通过运行python -m zombiedice(在windows上)或pip3 install zombiedice(在macos/linux上)来查看带有一些预先制作的bots的演示。
或者,您可以运行import zombiedice; zombiedice.demo()
首先,你需要创造你自己的僵尸。这是通过创建一个实现turn()方法的类(在轮到僵尸时调用)来完成的。如果要再次滚动,turn()方法要么调用zombiedice.roll()函数,要么返回以指示轮到它们的结束。turn()方法接受游戏状态的一个参数(在本页后面有文档记录)。这个类还应该有一个包含播放器名称字符串的'name'属性。(这样一个类就可以用于一个游戏中的多个玩家。)
函数zombiedice.roll()返回字典列表。字典表示骰子滚动结果;它有一个'color'和'icon'键,它们的可能值分别为'green'、'yellow'、'red'和'shotgun'、'brains'和'footsteps'。列表将包含三个用于三个骰子掷骰结果的字典。如果玩家已达到三支或更多散弹枪,则此列表将为空。
这里有一个僵尸的例子,它一直滚动到两支散弹枪,然后停下来。更多僵尸示例可以在examples.py中的zombiedice包中找到:
class StopsAt2ShotgunsZombie(object): """This bot keeps rolling until it reaches 2 shotguns.""" def __init__(self, name): self.name = name def turn(self, gameState): shotgunsRolled = 0 while shotgunsRolled < 2: results = roll() if results == []: # Zombie has reached 3 or more shotguns. return for i in results: # Count shotguns in results. if i[ICON] == SHOTGUN: shotguns += 1
接下来,你需要举办一个锦标赛。创建一个调用zombiedice.runWebGui()(对于漂亮的web gui)或zombiedice.runTournament()(对于普通命令行界面)的文件。典型的文件看起来像repo:
中的demo.pyimport zombiedice zombies = ( zombiedice.examples.RandomCoinFlipZombie(name='Random'), zombiedice.examples.MonteCarloZombie(name='Monte Carlo', riskiness=40, numExperiments=20), zombiedice.examples.MinNumShotgunsThenStopsZombie(name='Min 2 Shotguns', minShotguns=2) # 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)
僵尸示例
模块中包括几个僵尸示例:
- zombiedice.examples.RandomCoinFlipZombie(name)-随机决定50/50是否继续滚动或退出。
- zombiedice.examples.MinNumShotgunsThenStopsZombie(name, minShotguns)-继续滚动,直到滚动到指定的最小喷枪数。
- zombiedice.examples.MinNumShotgunsThenStopsOneMoreZombie(name, minShotguns)-类似于minnumshotgunstopszombie,只是它将再次滚动。
- zombiedice.examples.HumanPlayerZombie(name)-调用input(),让人类玩家与机器人进行对抗。
- zombiedice.examples.RollsUntilInTheLeadZombie(name)-一直滚动,直到它们位于第一位。
- zombiedice.examples.MonteCarloZombie(name, riskiness, numExperiments)-进行大量的蒙特卡罗模拟(numExperiments)以确定如果它们再次滚动会发生什么。只要生成三个散弹枪的模拟百分比小于riskiness,它将再次滚动。
待办事项
更多关于这个模块如何工作的细节。