尼姆游戏游戏规则:两个玩家轮流从一堆物品中拿走一部分,在每一步中,玩家可以自由选择拿走多少物品,但必须至少拿走一个且最多只能拿走一半物品,然后轮到下一个玩家。拿走最后一个物品的玩家输掉游戏。
计算机玩家每次拿走一定数量的物品使得剩下的数量是2的幂次方减1一即3、7、15、 31、 63等。如果无法做到这一点,计算机则随机拿走一些。每次计算机玩家作为先手。
实验步骤:
1. 导入random库
import random
2. 设置输入物品个数
def __init__(self):
self.number = 0 # 当前物品总数
3. 设计计算机玩家的拿法
计算机玩家拿取规则:
1)如果剩2个物品,计算机玩家只能拿1个
2)如果剩1个物品,计算机玩家不拿,直接宣布玩家胜利
3)拿走物品后,剩余数量为2的幂次方减1
def computer_turn(self):
a = 0
b = 0
if self.number == 2:
b = 1
elif self.number == 1:
print('游戏结束,你赢了')
return 0
else:
while True:
if pow(2, a) < self.number <= pow(2, a + 1):
break
a = a + 1
if self.number == pow(2, a + 1):
b = random.randint(1, int(self.number / 2))
else:
b = self.number - (pow(2, a) - 1)
return b
4. 设计人类玩家拿法
人类玩家拿取规则:
1)如果剩余数量为1,直接宣布计算机玩家胜利
2)每次拿取数量大于1,小于等于剩余数量的一半
def player_turn(self):
if self.number == 1:
print('游戏结束,你输了')
return 0
b = int(input('请输入要拿走的物品个数:'))
flag = b < 1 or b > int(self.number / 2)
while flag:
print('输入数据不符合游戏规则,请重新输入!')
b = int(input('请输入要拿走的物品个数:'))
flag = b < 1 or b > int(self.number / 2)
return b
5. 设计游戏主程序
def begin(self):
computer = 0
player = 0
self.number = int(input('请输入物品总数:'))
while True:
computer = self.computer_turn()
if computer == 0:
break
else:
self.number = self.number - computer
print('电脑回合:拿走{:d}个物品,剩余{:d}个物品'.format(computer, self.number))
player = self.player_turn()
if player == 0:
break
else:
self.number = self.number - player
print('玩家回合:拿走{:d}个物品,剩余{:d}个物品'.format(player, self.number))
6.最外层用Game,完整代码如下
import random
class Game:
def __init__(self):
self.number = 0
def computer_turn(self):
a = 0
b = 0
if self.number == 2:
b = 1
elif self.number == 1:
print('游戏结束,你赢了')
return 0
else:
while True:
if pow(2, a) < self.number <= pow(2, a + 1):
break
a = a + 1
if self.number == pow(2, a + 1):
b = random.randint(1, int(self.number / 2))
else:
b = self.number - (pow(2, a) - 1)
return b
def player_turn(self):
if self.number == 1:
print('游戏结束,你输了')
return 0
b = int(input('请输入要拿走的物品个数:'))
flag = b < 1 or b > int(self.number / 2)
while flag:
print('输入数据不符合游戏规则,请重新输入!')
b = int(input('请输入要拿走的物品个数:'))
flag = b < 1 or b > int(self.number / 2)
return b
def begin(self):
computer = 0
player = 0
self.number = int(input('请输入物品总数:'))
while True:
computer = self.computer_turn()
if computer == 0:
break
else:
self.number = self.number - computer
print('电脑回合:拿走{:d}个物品,剩余{:d}个物品'.format(computer, self.number))
player = self.player_turn()
if player == 0:
break
else:
self.number = self.number - player
print('玩家回合:拿走{:d}个物品,剩余{:d}个物品'.format(player, self.number))
if __name__ == '__main__':
game = Game()
game.begin()
游戏示例: