我是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 =“BOMB”有效)。
答案 0 :(得分:1)
每次调用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 ""