使用wxPython和pillow开发拼图小游戏(二)

上篇给大家展示了初始化时的实现,这篇我们来介绍下单格点击事件和判断拼图是否完成的具体实现。

单格点击事件

对于单格的点击事件,我们的目标是只有空格相邻的上下左右四个格可以单击移动,每移动一次都要判断一下拼图是否完成,如果完成则提示通关成功。

上篇说到,我们每个格子都是放了一个按钮,现在就是需要给按钮新增一个单击事件,添加方法如下:

# 按钮的单击事件绑定,btn是创建的Button对象
# OnClick为发生单击时,所要触发的自定义函数
self.Bind(wx.EVT_BUTTON, self.OnClick, btn)  

同时,上篇我们也提到了,初始化时会初始化一个可移动的集合。该集合主要是标注的是,每个格子所能移动到的位置。我们对每个格子都做了编号,从左上角第一个开始,一行一行进行编号,当某个格子上的按钮被单击时,用来判断该格子上的按钮可以向哪些格子进行移动,如果这些格子中有空格,则可以对该按钮进行移动。以下是初始化该列表的具体实现:

def can_move_init(self):
    for i in range(0, self.vac*self.vac):
        temp_can_move = []
        # 判断单元格上方的格子是否可以移动,如果(i-self.vac < 0)则说明上方没有格子
        if i - self.vac >= 0:  
            temp_can_move.append(i - self.vac)
        # 判断单元格左边的格子是否可以移动,如果(i%self.vac = 0)则说明上方没有格子
        if i%self.vac != 0:  
            temp_can_move.append(i-1)
        # 判断单元格右边的格子是否可以移动,如果((i+1)%self.vac = 0)则说明上方没有格子
        if (i+1)%self.vac != 0: 
            temp_can_move.append(i+1)
        # 判断单元格下方的格子是否可以移动,如果(i + self.vac > self.vac*self.vac)则说明上方没有格子
        if i + self.vac <= self.vac*self.vac: 
            temp_can_move.append(i + self.vac)
        self._can_move[str(i)] = temp_can_move

下边我们介绍单击事件的实现,当某个格子(按钮)被单击时,首先我们要判断该格子是否可以移动,然后我们再根据当前空格的位置,将该按钮移动到相应的空格的位置。

def OnClick(self, e):
    o = e.GetEventObject()  # 获取发生单击事件的按钮对象
    can_move = self._can_move[str(o.GetId())]  #获取该方格可以移动到的位置集合
    temp = self._ideal  # 当前空格的编号
    temp_id = o.GetId()
    if temp in can_move: #判断当前的空格编号是否在可移动到的位置集合中,在则进行移动
        if self.step == 0:  #这里是记录所走的步数和时间,如果是首次移动,则单独开启一个线程来记录使用时间
            self.time_thread = threading.Thread(target=self.__updateTime)
            self.time_thread.setName('current_thread')
            self.time_thread.start()
        o.Move(int(temp % self.vac * (540 / self.vac)), int((temp // self.vac) * (540 / self.vac)))  # 单元格移动,根据空格的编号,计算出要移动到的位置
        o.SetId(temp)
        self.indices[self.indices.index(temp_id)] = self._ideal # 当前界面上的每个位置上所放置的按钮编号集合,主要用来判断最后是否完成拼图
        self._ideal = temp_id # 将发生单击事件的编号置为空格编号
        self.Bind(wx.EVT_BUTTON, self.OnClick, o)
        self.step += 1
        self.step_label.SetLabel('步数:' + str(self.step))
    if self.check_success() == 1:  # 判断拼图是否完成
        self.__stopFlag = 'stop'
        dlg = wx.MessageDialog(self, "恭喜闯关成功!", "恭喜", wx.OK)  # (标题,内容,id)
        dlg.ShowModal()
        dlg.Destroy()

判断是否完成拼图

判断是否完成拼图,我这里的实现思路主要是看界面上展示的按钮编号是否和位置编号一致,一致则认为是完成拼图。具体实现如下:

def check_success(self):
    result = 1
    if self._ideal == self.vac * self.vac - 1: # 首先判断空格的编号是否是最后一个格子的编号,不是的话,肯定没有完成,直接返回
        for i in range(0, len(self.indices) - 1): 
            if self.indices[i] != i: # 判断界面上的按钮编号是否与位置编号一致,有一个不一致,则返回没有完成
                result = 0
                break
    else:
        result = 0
    return result

好了,本篇就先到这里吧,有什么疑问或更好的建议可以留言交流

猜你喜欢

转载自blog.csdn.net/wzl19870309/article/details/131693831