zoukankan      html  css  js  c++  java
  • python实现聪明的尼姆游戏(人机对战)

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

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

     1 #   聪明的尼姆游戏。
     2 import random
     3 
     4 
     5 class Game():
     6     def __init__(self, num):
     7         self.number = num
     8         self.flag = 1
     9 
    10     def computer_turn(self):
    11         if self.number & (self.number + 1) == 0:  # 如果是2的幂次方-1个物品
    12             if int(self.number / 2) <= 1:
    13                 self.number -= 1
    14                 print('电脑回合,拿走%d个物品,剩余%d个物品' % (1, self.number))
    15             else:
    16                 temp = random.randint(1, int(self.number / 2))
    17                 self.number -= temp
    18                 print('电脑回合,拿走%d个物品,剩余%d个物品' % (temp, self.number))
    19         else:
    20             temp = self.number
    21             while self.number & (self.number + 1) != 0:  # 变成2的幂次方-1
    22                 self.number -= 1
    23             temp = temp - self.number
    24             print('电脑回合,拿走%d个物品,剩余%d个物品' % (temp, self.number))
    25         if self.number == 0:
    26             print('Game over!玩家获胜!')
    27             self.flag = 0
    28 
    29     def player_turn(self):
    30         temp = int(input('玩家回合,剩余%s个物品,请输入拿取物品的个数:' % self.number))
    31         if self.number == 1:
    32             self.number -= 1
    33         elif temp > int(self.number) / 2:
    34             temp = int(input('拿去物品数量超过规则限制,请重新输入:'))
    35         else:
    36             self.number -= temp
    37         if self.number == 0:
    38             print('Game over!电脑获胜!')
    39             self.flag = 0
    40 
    41     def begin(self):
    42         print('初始总共%d个物品' % self.number)
    43         while True:
    44             if self.flag == 0:
    45                 break
    46             self.computer_turn()
    47             if self.flag == 0:
    48                 break
    49 
    50             self.player_turn()
    51 
    52 
    53 # g1=Game(17)
    54 g1 = Game(15)
    55 g1.begin()
  • 相关阅读:
    896. Monotonic Array单调数组
    865. Smallest Subtree with all the Deepest Nodes 有最深节点的最小子树
    489. Robot Room Cleaner扫地机器人
    JavaFX
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
  • 原文地址:https://www.cnblogs.com/manbaout/p/12989544.html
Copyright © 2011-2022 走看看