时间:2023-02-07 09:48:21 | 栏目: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)