python编程实验,模拟聪明版的尼姆游戏设计原理

实验原理与内容:

本实验完成一个模拟聪明版的尼姆游戏功能:

        尼姆游戏是个著名的游戏,有很多变种玩法。两个玩家轮流从一堆物品中拿走一部分,在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品,然后轮到下一个玩家。拿走最后一个物品的玩家输掉游戏。

        在聪明模式中,计算机每次拿走足够多的物品使得堆的大小是2 的幂次方减1——也就是3,7,15,31 63。除了堆的大小已经是的幂次方减1,在其他情况下这样走都是符合游戏规则的。在那种情况下,计算机就按游戏规则随机拿走一些。

编写程序,模拟聪明版本的尼姆游戏。

本实验中主要涉如下过程。

1.游戏分析与算法设计

2.使用Python编写游戏程序

3.编写Python源文件

4.编译/调试程序

5.运行程序

实现代码:

from random import randint,choice
def everyStep(n):
    half = n/2
    m = 1
    # 所有可能满足的取法
    possible = []
    while True:
        # 机器取走剩下后的数量
        rest = 2**n - 1
        if rest >= n:
            break
        # 剩下的数量大于一半,则取走的不超过一半
        if rest >= half:
            possible.append(n-rest)
        m = m + 1
    #     如果至少存在一种取法使得剩下物品数量为 2*n-1
    if possible:
        return choice(possible)
    # 无法使得剩余物品数量为 2*n-1,随机取走一些
    return randint(1,int(half))

def smartMinGame(n):
    while n>1:
        # 人类玩家先走
        print("现在到你了,我们还有{0}步".format(n))
        # 确保人类玩家输入合法整数值
        while True:
            try:
                num = int(input("你想走多少步:"))
                assert 1<= num <=n//2
                break
            except:
                print("错误,必须在1到{0}".format(n//2))
        n-=num
        if n==1:
            return '我(计算机)输了'
        # 计算机玩家拿走一些
        n -= everyStep(n)
    if n == 1:
        return '你输了'

print(smartMinGame(randint(1,100)))

运行演示:

尼姆游戏是一种非常经典的数学游戏,通常由两个玩家轮流取走一些石子,每次取走的石子数量可以自由选择,但是必须在同一个堆取走至少一个石子。最后无法取走石子的玩家输掉游戏。 而对于聪明尼姆游戏程序设计,其实就是让电脑在尽可能少的步骤内获胜。这可以通过一些数学方法来实现,比如二进制异或运算。 具体来说,假设有n个堆,每个堆的石子数分别为a1, a2, ..., an。我们可以把这n个数都写成二进制形式,然后按位进行异或运算。也就是说,我们把所有数的每一位都相加起来,如果某一位上的和为奇数,那么电脑就应该在该位上取走一个石子。 这样做的原理是,异或运算具有“同0异1”的特性。也就是说,如果两个数在某一位上相同,那么异或运算的结果就是0;否则结果就是1。因此,如果我们让所有堆对应位上的和都为偶数,那么电脑就一定可以在尽可能少的步骤内获胜。 以下是一个简单的聪明尼姆游戏程序的Python实现: ```python def nim_game(piles): x = 0 for pile in piles: x ^= pile if x == 0: # 如果异或和为0,则电脑无法获胜 return False for i in range(len(piles)): # 如果某一堆石子数的异或和与总异或和相同,则在该堆取走一些石子 if piles[i] ^ x < piles[i]: piles[i] ^= x return True # 如果找不到合适的堆,则在第一堆取走一些石子 piles ^= x return True ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hares_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值