尼姆游戏:
尼姆游戏是一种两个人玩的回合制数学战略游戏。游戏者轮流从一堆棋子(一共有好几堆,一次只能从其中一堆拿。)(或者任何道具)中取走一个或者多个,最后不能再取的就是输家。当指定相应数量时,一堆这样的棋子称作一个尼姆堆。
先存一个错误的代码(刚开始没弄清楚就下手,理解错游戏规则了)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)
中间还有一部分特别的麻烦
这一部分是为了,让电脑在A列表中选取一个不是0的元素,如果n特别大,就会导致运行操作中重复进行的可能性越大。再蹲一个大佬指教一下QAQ
嗯,就写这么多吧。