本文主要是介绍坏巧克力 两个玩家轮流掰一块m*n的巧克力,其中一块1*1的小块是坏的。每次掰只能顺着方格的边界,沿直线一掰到底。每掰一次,掰的人把两块中不含坏巧克力的那块吃掉,谁碰到最后那块坏巧克力就算输了。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
坏巧克力问题:
两个玩家轮流掰一块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] = 0print('生成的坏巧克力')print(chocolate)return chocolate,x,y #返回坏的巧克力,和坏巧克力的下标#掰巧克力操作,默认吃掉不含坏巧克力的一半
def Split(Chocolate_Bad, x, y ,m ,n): #xy mn分别为坏巧克力的横纵坐标,巧克力的当前大小m*nprint('沿着一个方向水平或者垂直(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=xy=ym=indexbn=nelif(indexb<x or indexb == x):#当掰开的位置在坏的上边Chocolate_Bad = Chocolate_Bad[indexb:m, :]x=x-indexby=ym=m-indexbn=nelse:print('输入错误')elif(aix == 'y'):#沿着竖直掰if (indexb > y):#当掰开的位置在坏的右边Chocolate_Bad = Chocolate_Bad[:, 0:indexb]x=xy=ym=mn=indexbelif (indexb < y or indexb == y):#当掰开的位置在坏的左边Chocolate_Bad = Chocolate_Bad[:, indexb:n]x=xy=y-indexbm=mn=n-indexbelse:print('输入错误')return Chocolate_Bad,x,y,m,ndef 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()
这篇关于坏巧克力 两个玩家轮流掰一块m*n的巧克力,其中一块1*1的小块是坏的。每次掰只能顺着方格的边界,沿直线一掰到底。每掰一次,掰的人把两块中不含坏巧克力的那块吃掉,谁碰到最后那块坏巧克力就算输了。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!