一个模拟骰子游戏的僵尸骰子,可以运行僵尸AI玩家。

zombiedice的Python项目详细描述


一个模拟骰子游戏僵尸骰子,可以运行机器人人工智能玩家。

僵尸骰子是一个快速,有趣的骰子游戏史蒂夫杰克逊游戏。玩家是僵尸,他们试图吃掉尽可能多的人类大脑,而不被人类“猎杀”。轮到他们时,玩家将从13个骰子中随机选择3个骰子并掷骰子。死者的脸是大脑,脚步声和猎枪。你一个脑袋得一分,但如果你掷一个累积的三把散弹枪,你已经被射击了,你的回合得零分。然后你可以决定重新掷骰子,或者把你的回合传给下一个玩家。如果一个骰子出现“足迹”,如果玩家决定重新掷骰子,它会被再次使用。(玩家每次掷骰子总是使用三个骰子。)僵尸骰子有一个“推你的运气”游戏机制:你越是选择重新掷骰子,你可以得到更多的大脑,但你越有可能收集到三支散弹枪。游戏一直持续到一个玩家达到13个大脑,然后其他玩家再得到一个回合。骰子是绿色的(更可能是大脑),红色的(更可能是散弹枪),黄色的(大脑和散弹枪是均匀的)。

僵尸骰子的更完整规则可以在这里找到:

这个模拟器对于初级/中级编程课程或竞赛很有用。制作机器人程序的api很简单,它还提供了一个web ui,用于在比赛运行时投影一个漂亮的比赛显示。

screenshot.jpg

快速启动

要安装,请运行通常的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.py
import 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,它将再次滚动。

待办事项

更多关于这个模块如何工作的细节。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Kafka producer大量内存使用(泄漏?)   java NullPointerException。。。正在插入数据但无法检索数据[Mysql DB]   java spring+jpa+hibernate=没有可用于当前线程的实际事务的EntityManager无法可靠地处理“persist”调用   getelementbyid在没有ID的情况下如何在java中使用GetElementsById   java有没有一种使用WatchService强制轮询的方法?   java将值从jframe传递给另一个jframe并使用它   Java/Groovy中带重试的反应式事件处理   具有两个包装器元素的java Jackson XML ArrayList输出   java总是在范围内使用不同的随机元素   取消选择java下拉列表值   多线程如何在Java中为对象的不同成员拥有不同的同步块   java如何使用多线程从文本文件中读取输入   java Spring启动附加崩溃命令   java使用公共或单独的actionPerfomed方法有什么区别   java用Spring3.0中的SpEL替换JSP中的EL   java作为windows服务运行应用程序时无法访问共享文件夹   java xml 1.1规范中的“解析数据”是什么意思?   以编程方式设置JComboBox索引时java触发ItemListener   java Android WebView:只加载HTML,不加载JS或CSS(在某些设备中)   Java:计算do/while循环的数量