📅  最后修改于: 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
类表示拼图块,包含 image
、rect
和 position
三个属性。
image
表示拼图块的图像。rect
表示拼图块在屏幕中的位置和尺寸。position
表示拼图块在网格中的行列位置。Slot
类表示网格槽,包含 image
、rect
和 occupied
三个属性。
image
表示网格槽的图像。rect
表示网格槽在屏幕中的位置和尺寸。occupied
表示网格槽是否被占用。Coin
类表示硬币,包含 image
、rect
、speed
和 done
四个属性。
image
表示硬币的图像。rect
表示硬币在屏幕中的位置和尺寸。speed
表示硬币下落的速度。done
表示硬币是否已经落地。make_tiles
函数创建拼图块。
width
和 height
表示拼图块的网格行列数。image
表示拼图块的图像。make_slots
函数创建网格槽。
width
和 height
表示网格槽的行列数。insert_into_slots
函数将拼图块插入网格槽中。
slots
表示网格槽的列表。tile
表示拼图块。main
函数是程序的主函数,负责初始化 Pygame 环境、创建拼图和网格槽、显示拼图和网格槽、处理用户输入等操作。其中 coins
表示硬币的精灵组,groupcollide
函数用于检测拼图块和硬币是否相撞。