练习:尼姆游戏

Posted 梦幻精灵_cq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了练习:尼姆游戏相关的知识,希望对你有一定的参考价值。

题目

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

代码运行效果


回首页

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)

回首页

上一篇:
下一篇:


回首页

精品文章:

来源:老齐教室


以上是关于练习:尼姆游戏的主要内容,如果未能解决你的问题,请参考以下文章

(HDU - 2176)取(m堆)石子游戏(尼姆博弈)

USTC 1213取石子游戏(尼姆博弈)

ACM-尼姆博弈之取(m堆)石子游戏——hdu2176

HDU 2176 取(m堆)石子游戏 尼姆博弈

尼姆博奕+SG函数

HDU 2176 取(m堆)石子游戏 (尼姆博奕)