📜  拼图 | (圆桌投币游戏)(1)

📅  最后修改于: 2023-12-03 15:25:52.458000             🧑  作者: Mango

拼图 | (圆桌投币游戏)

介绍:

拼图 | (圆桌投币游戏)是一款基于Python语言开发的游戏。这款游戏基于经典拼图游戏规则,玩家需要将不同形状的拼图块放置在正确的位置上,以完成拼图并过关。同时,游戏还增加了投币机制和圆桌模式,让游戏更加有趣和刺激。

代码示例:

import pygame, sys
from pygame.locals import *
import random

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600


class Tile(pygame.sprite.Sprite):
    def __init__(self, image, position):
        super(Tile, self).__init__()
        self.image = image
        self.rect = self.image.get_rect()
        self.rect.x, self.rect.y = position


class Slot(pygame.sprite.Sprite):
    width = 128

    def __init__(self, position):
        super(Slot, self).__init__()
        self.image = pygame.Surface((self.width, self.width))
        self.image.fill((255, 255, 255))
        self.image.set_alpha(100)
        self.rect = self.image.get_rect()
        self.rect.x, self.rect.y = position
        self.occupied = False


class Coin(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super(Coin, self).__init__()
        self.image = pygame.image.load('images/coin.png')
        self.rect = self.image.get_rect()
        self.rect.x, self.rect.y = x, y
        self.speed = 5
        self.done = False

    def update(self, *args):
        if not self.done:
            self.rect.y += self.speed
            if self.rect.y > SCREEN_HEIGHT:
                self.done = True

    def discard(self):
        self.kill()


def make_tiles(width, height, image):
    tiles = []
    tile_width = image.get_width() / width
    tile_height = image.get_height() / height
    for i in range(height):
        for j in range(width):
            rect = (j * tile_width, i * tile_height, tile_width, tile_height)
            image_tile = pygame.Surface((tile_width, tile_height))
            image_tile.blit(image, (0, 0), rect)
            position = (j * Slot.width, i * Slot.width)
            tile = Tile(image_tile, position)
            tiles.append(tile)
    return tiles


def make_slots(width, height):
    slots = []
    for i in range(height):
        for j in range(width):
            position = (j * Slot.width, i * Slot.width)
            slot = Slot(position)
            slots.append(slot)
    return slots


def insert_into_slots(slots, tile):
    for slot in slots:
        if not slot.occupied:
            distance = pygame.math.Vector2(slot.rect.center) - pygame.math.Vector2(tile.rect.center)
            if distance.length() < Slot.width / 2:
                tile.rect.center = slot.rect.center
                slot.occupied = True
                return


def main():
    pygame.init()
    screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
    pygame.display.set_caption('拼图 | (圆桌投币游戏)')
    clock = pygame.time.Clock()

    tile_image = pygame.image.load('images/puzzle.jpg')
    tiles = make_tiles(4, 4, tile_image)
    slots = make_slots(4, 4)
    coins = pygame.sprite.Group()

    for tile in tiles:
        insert_into_slots(slots, tile)

    while True:
        screen.fill((255, 255, 255))

        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == MOUSEBUTTONDOWN:
                if pygame.mouse.get_pressed()[0]:
                    pos = pygame.mouse.get_pos()
                    coin = Coin(pos[0], pos[1])
                    coins.add(coin)

        if pygame.sprite.groupcollide(tiles, coins, False, True):
            pass

        for coin in coins:
            coin.update()
            if coin.done:
                coin.discard()

        for tile in tiles:
            screen.blit(tile.image, tile.rect)

        for slot in slots:
            pygame.draw.rect(screen, (0, 0, 0), slot.rect, 2)

        pygame.display.update()
        clock.tick(60)


if __name__ == '__main__':
    main()

说明:

  • Tile 类表示拼图块,包含 imagerectposition 三个属性。

    • image 表示拼图块的图像。
    • rect 表示拼图块在屏幕中的位置和尺寸。
    • position 表示拼图块在网格中的行列位置。
  • Slot 类表示网格槽,包含 imagerectoccupied 三个属性。

    • image 表示网格槽的图像。
    • rect 表示网格槽在屏幕中的位置和尺寸。
    • occupied 表示网格槽是否被占用。
  • Coin 类表示硬币,包含 imagerectspeeddone 四个属性。

    • image 表示硬币的图像。
    • rect 表示硬币在屏幕中的位置和尺寸。
    • speed 表示硬币下落的速度。
    • done 表示硬币是否已经落地。
  • make_tiles 函数创建拼图块。

    • widthheight 表示拼图块的网格行列数。
    • image 表示拼图块的图像。
  • make_slots 函数创建网格槽。

    • widthheight 表示网格槽的行列数。
  • insert_into_slots 函数将拼图块插入网格槽中。

    • slots 表示网格槽的列表。
    • tile 表示拼图块。
  • main 函数是程序的主函数,负责初始化 Pygame 环境、创建拼图和网格槽、显示拼图和网格槽、处理用户输入等操作。其中 coins 表示硬币的精灵组,groupcollide 函数用于检测拼图块和硬币是否相撞。