坏巧克力问题:

      两个玩家轮流掰一块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()