我是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 ""

08-25 08:48