尼姆游戏
本文最后更新于 207 天前,其中的信息可能已经有所发展或是发生改变。

基本规则

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

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

获胜方法:

#玩家获胜:取完后保证剩余的数量为2的n次幂-1,让电脑随机取数

#电脑获胜:取数让剩余数量为2的n次幂-1,玩家取时数量为2的n次幂-1,则电脑必胜

代码实现

from math import log2
from random import randint

def everyStep(n):
    num = n - (2**int(log2(n))-1)
    half = n // 2
    #让剩余物品数量为2的幂次方减1
    if num <= half:
        return num
    #如果实在没有办法,就随机拿走一些
    return randint(1, half)                       #随机产生括号里两个参数之间的整数,且包括这两个参数
def smartNimuGame(n):
    while n > 1:
        #人类玩家先走
        print("轮到玩家,物品的数量为 {0} .".format(n))
        #确保人类玩家输入合法整数值
        while True:
            try:
                num = int(input('你想拿走多少物品(最少拿走一个,最多只能拿走一半):'))
                print(f'现在还有{n-num}个物品')
                assert 1 <= num <= n//2
                break
            except:
                print('你可以获取物品的数量只能在 1 - {0} 之间'.format(n//2))
        n -= num
        if n == 1:
            return 'I fail !'
        #计算机玩家拿走一些
        num = everyStep(n)
        n -= num
        print(f'计算机玩家拿走了{num}个物品,现在还剩{n}')
    else:
        return 'You fail !'
print(smartNimuGame(randint(1, 100)))

结果展示

尼姆游戏 : http://116.62.240.154:9520/nimu/
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇