Python实现连连看

# coding:utf-8
import pygame, sys, random, time, easygui
from pygame.locals import *
# 初始化pygame环境
pygame.init()
# 创建窗口
canvas = pygame.display.set_mode((1000, 600))
# 加载图片
bg = pygame.image.load("imgs/bg.jpg")
win = pygame.image.load("imgs/win.png")
# 设置标题
pygame.display.set_caption("连连看")
# 图片位置数组
p = [[60, 120], [170, 120], [280, 120], [390, 120], [500, 120], [610, 120], [720, 120], [830, 120],
     [60, 230], [170, 230], [280, 230], [390, 230], [500, 230], [610, 230], [720, 230], [830, 230],
     [60, 340], [170, 340], [280, 340], [390, 340], [500, 340], [610, 340], [720, 340], [830, 340],
     [60, 450], [170, 450], [280, 450], [390, 450], [500, 450], [610, 450], [720, 450], [830, 450]]

# 定义变量存储点击的卡片信息
first_num = 0
first_x = 0
first_y = 0

# 创建handleEvent方法
def handleEvent():
    # 全局变量
    global first_num, first_x, first_y
    for event in pygame.event.get():
        if event.type == pygame.QUIT or event.type == KEYDOWN and event.key == K_ESCAPE:
            sys.exit()
            pygame.quit()
        # 判断点击鼠标左键
        if event.type == MOUSEBUTTONDOWN and event.button == 1:
            # 获取鼠标坐标
            mouse_x = event.pos[0]
            mouse_y = event.pos[1]
            # 调用Click方法获取点击到的卡片信息
            if Click(mouse_x, mouse_y):
                sec_num = Click(mouse_x, mouse_y)[0]
                sec_x = Click(mouse_x, mouse_y)[1]
                sec_y = Click(mouse_x, mouse_y)[2]
                # 创建列表存储点击标号相同卡片的下标
                dellist = []
                # 给第一次点击的卡片信息赋值
                if first_num == 0:
                    first_num = sec_num
                    first_x = sec_x
                    first_y = sec_y
                else:
                    # 第二次点击卡片标号相同判断坐标
                    if sec_num == first_num  :
                        if not(first_x == sec_x and first_y == sec_y) :
                            # 获取标号相同的卡片在cards列表中的下标
                            for i in range(len(cards)):
                                if cards[i].num == sec_num:
                                    dellist.append(i)
                            # 删除卡片
                            for j in range(2):
                                if j == 0:
                                    cards.pop(dellist[j])
                                else:
                                    cards.pop(dellist[j] - 1)
                            first_num = 0
                            first_x = 0
                            first_y = 0
                    # 第二次点击卡片标号不同时给点击卡片信息重新赋值
                    else:
                        first_num = sec_num
                        first_x = sec_x
                        first_y = sec_y
                
# 创建Card类
class Card ():
    def __init__(self, num , x, y):
        self.num = num
        self.img = pygame.image.load('imgs/' + str(num) + '.png')
        self.x = x
        self.y = y
    def paint(self):
        canvas.blit(self.img, (self.x, self.y))
        
# 创建cards列表存储所有卡片
cards = []
for i  in range(0, 32):
    n = int(i % 16 + 1)
    m = int(random.randint(0, (31 - i)))
    x = p[m][0]
    y = p[m][1]
    cards.append(Card(n , x, y))
    p.pop(m)
    
# 添加点击事件获取点击到的卡片信息
def  Click(mouse_x, mouse_y):
    x1 = mouse_x
    y1 = mouse_y
    # 获取所有卡片信息
    for i in range(0, len(cards)):
        imgx = cards[i].x
        imgy = cards[i].y
        # 判断鼠标点击位置是否在卡片上
        if imgx + 100 > x1  and x1 > imgx and imgy + 100 > y1 and y1 > imgy:
            img = cards[i].num
            return img , imgx, imgy
    return False

#获取开始时间
start_time = time.time()
while True:
    # 画出游戏背景
    #canvas.blit(bg, (0, 0))
    #添加游戏结束背景
    if len(cards) == 0:
        canvas.blit(win,(0,0))
    else:
        canvas.blit(bg,(0,0))
    
    # 画出所有图片
    for i in range(0, len(cards)):
        cards[i].paint()
    #获取游戏时间
    if len(cards) != 0:
        end_time = time.time()
    timing = int(end_time - start_time)
    #easygui.msgbox('耗时:' + str(timing))
    Time = pygame.font.SysFont('华文琥珀',40)
    TextTime = Time.render('time:' + str(timing),True,(255,255,255))
    canvas.blit(TextTime,(720,40))
    # 更新屏幕内容
    pygame.display.update()
    # 调用handleEvent方法
    handleEvent()































































































































































































































































































相关推荐

  1. Python实现连连

    2024-03-18 09:36:09       42 阅读
  2. Python实现连连4

    2024-03-18 09:36:09       28 阅读
  3. 实验7-2-10 简易连连(PTA)

    2024-03-18 09:36:09       34 阅读
  4. Python 实现连接攻击

    2024-03-18 09:36:09       65 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-18 09:36:09       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-18 09:36:09       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-18 09:36:09       82 阅读
  4. Python语言-面向对象

    2024-03-18 09:36:09       91 阅读

热门阅读

  1. 如何优化查询ORM

    2024-03-18 09:36:09       42 阅读
  2. IDEA SpringBoot + Gradle无法运行测试问题

    2024-03-18 09:36:09       40 阅读
  3. Spring Data访问Elasticsearch----Elasticsearch对象映射

    2024-03-18 09:36:09       45 阅读
  4. Spring Boot(七十):利用Jasypt对数据库连接进行加密

    2024-03-18 09:36:09       36 阅读
  5. 如何在MATLAB中处理图像和视频?

    2024-03-18 09:36:09       41 阅读
  6. tcpudp面试题

    2024-03-18 09:36:09       36 阅读
  7. vue的一些个人理解

    2024-03-18 09:36:09       43 阅读
  8. 怎样合理规划游戏的玩法、关卡结构及剧情线?

    2024-03-18 09:36:09       43 阅读
  9. Windows程序员用MAC:安装win双系统、wintogo和删除

    2024-03-18 09:36:09       44 阅读