尼姆游戏是一个著名的游戏,有很多变种玩法。两个玩家轮流从一堆物品中拿走一部分。在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品,然后轮到下一个玩家。拿走最后一个物品的玩家输掉游戏。
在smart模式中,计算机每次拿走一定数量的物品使得堆的大小是2的幂次方减1—也就是2,7,15,31,63等。如果有一定数量的剩余物品,计算就随机拿走一些。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 编写程序,模拟聪明版及非聪明版的尼姆游戏
# 并进行两种的比较及分析,给出聪明版比非聪明版的胜算结论
from random import randint
from math import floor
def nim_silly(n): # 愚钝版本随机取数
if n <= 3:
return 1
return randint(1, floor(n / 2))
def nim_smart(n): # 聪明版本自动选择最佳数
if n <= 3:
return 1
x = 0
while (True):
if pow(2, x) <= n < pow(2, x + 1):
break
x += 1
num = n - pow(2, x) + 1
if 1 <= num <= n / 2:
return num
else: # 若最佳数不在范围内,则选取随机数
return randi