python解谜游戏哪吒拼图动画演示

"""哪吒拼图,多图版。本程序需要有PIL模块支持,如果没有安装,请在
cmd模式下用pip install pillow --user  安装

"""

__author__ = "李兴球"
__date__ = "2018/11/23"

import os
from time import sleep
from splitimage import *
from random import shuffle
from turtle import Turtle,Screen


class Game(Turtle):
    xy_cors = []               # 类变量,记录 单击的切分图片的坐标表
    clicked = []               # 记录第一个被单击的角色的列表
    sliced_image_list = []     # 切分图列表,每张切分图就是一个角色,即每张图片被分成的格子图片列表    
    picture_index = 0          # 每张图片的索引号
    def __init__(self,image,initcors):
        Turtle.__init__(self,shape = image,visible=False)
        self.initcors = initcors                              # 自己的初始坐标
        self.penup()
        self.onclick(self.action)
        Game.sliced_image_list.append(self)                   # 装到列表中,以便遍历所有图片有没有归位
        
    def action(self,x,y):
        """单击切分图片时的动作"""
        if len(Game.xy_cors) == 0 :               # 第一次单击
            print("第一次单击")
            self.onclick(None)
            Game.xy_cors.append(self.position()) # 把第一次单击时的坐标存入列表
            Game.clicked.append(self)            # 把自己加入clicked列表,以便下一次单击另一个角色时,取出            
            return            
            
        if len(Game.xy_cors) == 1  :             # 第二次单击,此角色为第二个角色
            print("第二次单击")
            [sprite.onclick(None) for sprite in Game.sliced_image_list]  # 第2次单击后,全部禁用单击绑定,防乱点引起意外
            "如果已经单击了一个角色,那么自己就是第二个角色,首先把第一个角色的坐标弹出来,用first_xy引用。"
            first_xy = Game.xy_cors.pop()                    # 取出第一次单击时的坐标            
            second_xy = self.position() 
            self.goto(first_xy)                              # 自己到 原先第一个角色的位置             
            
            first_sprite = Game.clicked.pop()                # 弹出保存的第一个角色
            first_sprite.goto(second_xy)                     # 第一个角色到第二个角色的位置
            "每单击二次就进行一次遍历,检查每个图片有没有归位"       
            Game.check_all_picture()
            
            [sprite.onclick(sprite.action) for sprite in Game.sliced_image_list]

            return
        
    @staticmethod
    def check_all_picture():
        """检测每张切分的图片是否归位,如果全部归位,则进入下一关"""
        counter = 0
        for image in Game.sliced_image_list:
           "检测每部分图是否归位"               
           if abs(image.xcor() - image.initcors[0])< 5 and abs(image.ycor() - image.initcors[1]) < 5:
                counter = counter + 1        
                continue
           else:
                break
        print(counter)
        if  counter == amounts :                            # 归位了就过关了
            print("成功,") ; print(screen.getshapes())
            for i in range(40):
                sleep(0.01)
                screen.update()
                
            "过关后,善后,把以前注册的gif全部清除,经分析turtle.py得知 screen._shapes是保存所有形状的字,而screen.getshapes只是获取排序后的key"
            for sprite in Game.sliced_image_list:
                sprite.turtle.shapeIndex  = "blank"        # 由于要删除注册的gif,而它的这个属性会记录原先形状key,所以要改成自带的
                del sprite
            for shape in screen.getshapes():
                if shape.endswith(".gif"):screen._shapes.pop(shape)           # 从'形状'字典中弹出
            Game.sliced_image_list = []
                       
            Game.start()
 
    @staticmethod
    def make_cors_list(rows,cols,image_height,image_width):
        """根据行,列数,与图像宽放和高度,形成从左上角开始数起的坐标表。坐标是每个切分的图形的中心点坐标"""
        pass
    
    @staticmethod
    def make_random_index_list(amounts):
        """产生一个随机数列表,需要绝对的随机,所以可能要重新shuffle"""
        random_index_list = list(range(amounts))
        tmp_list = random_index_list.copy()                   # 为了绝对产生不同列表而设的临时列表
        while True:
            shuffle(random_index_list)                        # 洗牌随机索引表,可能和原列表顺序相同
            if random_index_list != tmp_list:break            # 万一洗牌后,还是一样,那是不行的,所以要重新洗牌
        return random_index_list
        

        

You must log in to read the rest of this article. Please log in or register as a user.