python 实现尼姆游戏

 

题目

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

 

代码运行效果

 

python代码

#/sur/bin/nve python
# coding: utf-8
import os #用os.system(r'clear')清屏
import random #用random.randint()随机取数



def clear():
  '''#Linux清屏'''
  clear = os.system(r'clear')


def optimal(n):
  '''机器最优拿法'''
  if n in (1, 2, 3, 4):
      return 1
  take = int(n/2)
  m = 1
  for i in range(take):
      if m>take:
          break
      m *= 2
  take = n-m+1
  if take>int(n/2):
      take = random.randint(1, int(n/2))
  return take


def common(n):
  '''机器一般拿法'''
  while True:
      if n==1:
          return 1
      return random.randint(1, int(n/2))


def effect(first, take, n):
  '''结果输出'''
  cl()
  print('\n'*6)
  flag_s = ('简单', '困难')[flag-1]
  print('%s\n'%('【%s】'%flag_s).rjust(20))
  print('﹊'*21)
  print(' '*4, end='')
  print('%s已取走%s。物品堆物品还剩%s。'%(first, take, n))
  print('﹊'*21)


def show_error():
  '''报错信息打印'''
  print('\n\n%s'%error)
  print('输入错误!请重试。'.rjust(20))
  print('﹊'*21)
  input('任意键继续……'.rjust(20))


#Main Codes
cl = clear
s = '''
    尼姆游戏,这是一个著名的游戏,
有很多变种玩法。
    两个玩家轮流从一堆物品中拿走
一部分。在每一步中,玩家可以自由
选择拿走多少物品,但是必须拿走一个
并且最多只能拿走一半物品,然后轮到
下一个玩家。
    拿走最后一个物品的玩家输掉游戏。
    先手随机。
'''
#规则打印
cl()
print('\n\n%s'%'“尼姆”游戏规则'.rjust(20))
print()
print('﹊'*21)
print(s)
print('﹊'*21)
input('任意键继续……'.rjust(20))
#难度选择
while True:
  cl()
  print('\n'*6)
  print('\n%s'%'【难度选择】'.rjust(20))
  print()
  print('﹊'*21)
  print('1. 简单  2. 困难'.rjust(24))
  print('﹊'*21)
  try:
      flag = int(input('请选择:'.rjust(12)))
      if flag not in (1, 2):
          error()
          continue
      break
  except Exception as error:
      show_error()

#开始游戏
p = '小可爱'
cl()
print('\n'*6)
while True:
  try:
      c = input('给对手命名:'.rjust(12))
      break
  except Exception as error:
      error()
      continue
if flag==2:
  n = random.randint(1, 500)
else:
  n = random.randint(1, 100)
cl()
print('\n'*6)
print('﹊'*21)
print('%s\n'%'【本局游戏物品堆】'.rjust(21))
print(('%s:%3d'%('物品总数', n)).rjust(22))
print('﹊'*21)
input('任意键继续……'.rjust(20))
#随机先手选择
first = random.choice((c, p))
while n>0:
  #机器取
  if flag==2 and first==c:
      take = optimal(n)
      n = n-take
  if flag==1 and first==c:
      take = common(n)
      n = n-take
  if first==c:
      effect(first, take, n)
  if n==0:
      break
  first = p #转换玩家先手
  #玩家取
  if first==p:
      while True:
          try:
              take = int(input('\n%s'%'您取物:'.rjust(12)))
              if take==1 and (n in (1, 2, 3)):
                  break
              if take>int(n/2) or take<1:
                  error()
                  continue 
              break
          except Exception as error:
              show_error()
      n = n-take
  if first==p:
      effect('您', take, n)
      input('任意键继续……'.rjust(20))
  if n==0:
      break
  first = c #转换机器先手
  
#结果输出
if first==p:
  first = '您'
cl()
print('\n'*6)
print('﹊'*21)
print(('%s输了!'%first).rjust(20))
print('﹊'*21)

关于python实现尼姆游戏的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程宝库

随着微信的普及,越来越多的人开始使用微信。微信渐渐从一款单纯的社交软件转变成了一个生活方式,人们的日常沟通需要微信,工作交流也需要微信。微信里的每一个好友,都代表着人们在社会里扮演的不同角色。今天这篇文章会基 ...