两个玩家轮流掰一块m*n的巧克力,其中一块1*1的小块是坏的。每次掰只能顺着方格的边界,沿直线一掰到底。每掰一次,掰的人把两块中不含坏巧克力的那块吃掉,谁碰到最后那块坏巧克力就算输了。在这个游戏中,先走好还是后走好?
写一个互动程序,让大家可以和计算机玩这个游戏。这个程序在胜局应该走出致胜一步,在败局中则只要随机下出合规的一步就好。
import numpy as np
#定义一个m*n矩阵,初始化时,默认其值均为1。随机选择一个位置另其为0,代表坏巧克力。
# 生成巧克力
def Create_Choclate():
print('输入巧克力的大小m*n')
m = int(input('输入 m:'))
n = int(input('输入n:'))
Sum = m*n #巧克力块总数
chocolate = np.ones(Sum).reshape(m, n)
return chocolate, m, n
#随机一个位置 置为0,生成坏巧克力
def Create_Bad(chocolate,m,n):
x = np.random.randint(0, m)
y = np.random.randint(0, n)
chocolate[x][y] = 0
print('生成的坏巧克力')
print(chocolate)
return chocolate,x,y #返回坏的巧克力,和坏巧克力的下标
#掰巧克力操作,默认吃掉不含坏巧克力的一半
def Split(Chocolate_Bad, x, y ,m ,n): #xy mn分别为坏巧克力的横纵坐标,巧克力的当前大小m*n
print('沿着一个方向水平或者垂直(x或者y)及下标a~b中间掰开(下标从0开始)')
aix = input('选择掰开的方向为:')
indexa = int(input('a='))
indexb = int(input('b='))
if(aix =='x'): #沿着水平方向掰开
if(indexb>x):#当掰开的位置在坏的下边
Chocolate_Bad = Chocolate_Bad[0:indexb, :]
x=x
y=y
m=indexb
n=n
elif(indexb<x or indexb == x):#当掰开的位置在坏的上边
Chocolate_Bad = Chocolate_Bad[indexb:m, :]
x=x-indexb
y=y
m=m-indexb
n=n
else:
print('输入错误')
elif(aix == 'y'):#沿着竖直掰
if (indexb > y):#当掰开的位置在坏的右边
Chocolate_Bad = Chocolate_Bad[:, 0:indexb]
x=x
y=y
m=m
n=indexb
elif (indexb < y or indexb == y):#当掰开的位置在坏的左边
Chocolate_Bad = Chocolate_Bad[:, indexb:n]
x=x
y=y-indexb
m=m
n=n-indexb
else:
print('输入错误')
return Chocolate_Bad,x,y,m,n
def main():
Chocolate_good,m,n = Create_Choclate()
Chocolate_Bad, x, y = Create_Bad(Chocolate_good, m, n)
print('坏巧克力下标(%d,%d) '%(x,y))
while(m>1 or n>1):
Chocolate_Bad,x,y,m,n = Split(Chocolate_Bad, x, y, m, n)
print('吃掉一块后为')
print(Chocolate_Bad)
print('当前坏巧克力的坐标为(%d,%d),巧克力的大小为(%d,%d)'%(x, y, m, n))
if((m==1 and n==2) or (m==2 and n==1)):
print('你赢了')
print('游戏结束,你输了')
if __name__ == "__main__":
main()