尼姆游戏:

尼姆游戏是一种两个人玩的回合制数学战略游戏。游戏者轮流从一堆棋子(一共有好几堆,一次只能从其中一堆拿。)(或者任何道具)中取走一个或者多个,最后不能再取的就是输家。当指定相应数量时,一堆这样的棋子称作一个尼姆堆

先存一个错误的代码(刚开始没弄清楚就下手,理解错游戏规则了)TAT:
 

import random
n = int(input("你认为多少堆棋子合适?"))
print("每堆棋子的个数我要随机生成了!")
A = [random.randint(50,100) for i in range(0,n)]
print("生成棋子堆如下:",A)
m = input("你先拿棋子还是我先拿?如果你想先拿棋子,就请输入Y,反之输入N。")
if m == 'Y':
    b = int(input("请开始取走棋子"))     #p等于0的时候,表示下一次该玩家取走棋子;p等于1的时候,表示下一次该电脑取走棋子
    A[0] = A[0] - b
    print(A)
    p = 1
else:
    b = random.randint(1,A[0])
    print("我先拿"+str(b)+"个棋子。")
    A[0] = A[0] - b
    print(A)
    p = 0
for i in range(0,n):
    if A[n-1] == 0:
        if p ==1:
            print("OMG,你赢了,太厉害了!")
        else:
            print("嗨害嘿,我赢了!")
    elif A[i] == 0:
        print("第"+str(i)+"堆棋子被拿完了,我们开始去下一堆棋子。")
        break
    else:
        while A[i] != 0:
            if p == 0:
                b = int(input("请开始取走棋子"))
                A[i] = A[i] - b
                print(A)
                p = 1
            else:
                b = random.randint(1, A[i])
                print("我拿了" + str(b) + "个棋子。")
                A[i] = A[i] - b
                print(A)
                p = 0
        else:
            if A[n - 1] == 0:
                if p == 1:
                    print("OMG,你赢了,太厉害了!")
                else:
                    print("嗨害嘿,我赢了!")

推荐一个理解游戏规则的链接,你可以深入了解尼姆游戏:

组合博弈中最经典的尼姆(Nim)游戏,怎么玩才能必胜? - 新东方超尖生计划的文章 - 知乎 https://zhuanlan.zhihu.com/p/358979118

下面是正常的代码TAT:

import random
def pandin(A):
    for i in A:
        if i != 0:
            return 0
def panding(A):
    if pandin(A) == 0:
        return 0
    else:
        return 1
n = int(input("你认为多少堆棋子合适?"))
print("每堆棋子的个数我要随机生成了!")
A = [random.randint(50,100) for i in range(0,n)]
B = [i for i in range(1,n+1)]
print("生成棋子堆如下:",dict(zip(B,A)))
m = input("你先拿棋子还是我先拿?如果你想先拿棋子,就请输入Y,反之输入N。")
if m == 'Y':
    a,b = map(int,input("请开始选定堆号并拿走棋子(先输入堆号,在输入取走棋子的个数)").split( ))
    A[a-1] = A[a-1] - b
    print(dict(zip(B,A)))
    p = 1       #p等于0的时候,表示下一次该玩家取走棋子;p等于1的时候,表示下一次该电脑取走棋子
else:
    a = random.randint(1,n)
    b = random.randint(1,A[a-1])
    print("我在第"+str(a)+"堆棋子中拿走"+str(b)+"个棋子。")
    A[a-1] = A[a-1] - b
    print(dict(zip(B,A)))
    p = 0
while panding(A) == 0:
    if p == 0:
        a, b = map(int, input("请开始选定堆号并拿走棋子(先输入堆号,在输入取走棋子的个数)").split())
        A[a - 1] = A[a - 1] - b
        print(dict(zip(B, A)))
        p = 1
    else:
        if panding(A) == 1:
            break
        else:
            a = random.randint(1, n)
            b = random.randint(1, A[a - 1])
            while b == 0:
                a = random.randint(1, n)
                b = random.randint(1, A[a - 1])
            A[a - 1] = A[a - 1] - b
            print("我在第" + str(a) + "堆棋子中拿走" + str(b) + "个棋子。")
            print(dict(zip(B, A)))
            p = 0
else:
    if p == 1:
        print("OMG,你赢了,太厉害了!")
    else:
        print("嗨害嘿,我赢了!")

开头的两个函数是用来判断结束没有的(孩子还是不会简单地写这种函数,这类函数就是要对一个对象进行一系列操作,只要有一个的操作结果不符合预期,就结束操作并将其归为一类;全部操作结果均符合预期的,则归为另一类。又会的大佬教教俺TAT)

中间还有一部分特别的麻烦

python尼姆游戏聪明版实验报告 尼姆游戏python代码_python

 这一部分是为了,让电脑在A列表中选取一个不是0的元素,如果n特别大,就会导致运行操作中重复进行的可能性越大。再蹲一个大佬指教一下QAQ

嗯,就写这么多吧。