我是python和kivy的新手,我试图通过制作一个小型的扫雷游戏来学习python,但是,我觉得以下代码中的逻辑是正确的,但不知何故不起作用:完整的文件如下:
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
import random
class spot(Button):
'''
classdocs
'''
def __init__(self, **kwargs):
'''
Constructor
'''
super(spot,self).__init__(**kwargs)
self.ismine=False
self.text="X"
if 'id' in kwargs:
self.id=kwargs['id']
#else:
# self.text="X"
class minesholder(GridLayout):
def __init__(self,**kwargs):
super(minesholder,self).__init__(**kwargs)
class game(BoxLayout):
spots={}
mines=[]
def __init__(self,**kwargs):
super(game,self).__init__(**kwargs)
self.m=minesholder(rows=5, cols=5)
self.add_widget(self.m)
self.attachtogrid()
def attachtogrid(self):
self.m.clear_widgets()
self.spots.clear()
for r in range(0,5):
for c in range(0,5):
idd=str(r)+","+str(c)
self.spots[idd]=idd
s = spot(id=idd)
self.m.add_widget(s)
s.bind(on_press=self.spottouched)
print(idd)
self.createmines()
def createmines(self):
self.mines.clear()
count=0
while (count <= 10):
c=str(random.randint(0,4))+','+str(random.randint(0,4))
print(c)
if self.mines.count(c)==0:
self.mines.append(c)
count+=1
def spottouched(self,spotted):
#if self.mines.count(str(spotted.id))==1:
# spotted.text="BOMB"
#else: spotted.text=""
for k in self.mines:
if k==spotted.id: spotted.text="BOMB"
else:
spotted.text=""
问题是最后4行,当我删除“ spotted.text =”“”时,代码工作正常,但是当我保留text =“”时,该代码不再工作,尽管只有11枚炸弹1被检测到,没有text =“”,所有炸弹都被正确检测到(text =“ BOMB”有效)。
最佳答案
每次调用spottouched()
时,您将遍历每个地雷并相应地设置文本。但是,假设您有两个炸弹-称这些炸弹为['bomb-a', 'bomb-b']
。
现在,您触摸ID为'bomb-a'
的按钮。 spottouched()
遍历地雷。列表中的第一个地雷是'bomb-a'
-因此它将文本设置为"BOMB"
。然后循环-列表中的第二个地雷是'bomb-b'
,因此文本被设置回""
。因此,唯一显示"BOMB"
文本的地雷是列表中的最后一个地雷。
尝试这样的事情:
def spottouched(self, spotted):
spotted.text = "BOMB" if spotted.id in self.mines else ""