提供学习或者毕业设计使用,功能基本都有,不能和市场上正式游戏相提比论,请理性对待!
在本文中,我们将使用 Pygame 和 Tkinter 创建一个简单的打砖块游戏。游戏的目标是通过控制挡板来击碎屏幕上的砖块,同时避免小球掉落到屏幕底部。游戏包含了一些额外的功能,比如吃到掉落的筛子可以增加得分或者生成新的小球。
玩法:移动鼠标接住小球即可。
目录
一、准备工作
二、初始化游戏环境
三、定义游戏元素类
四、初始化游戏元素
五、游戏主循环
六、结束游戏
七、完整代码
八、进阶版游戏
一、准备工作
首先,我们需要导入必要的库。在这个游戏中,我们将使用 Pygame 来创建游戏窗口和处理游戏逻辑,同时使用 Tkinter 来显示游戏结束时的消息框。
import pygame
import random
import sys
import tkinter as tk
from tkinter import messagebox
二、初始化游戏环境
接下来,我们需要初始化 Pygame 并设置游戏窗口的大小和标题。
pygame.init()
SCREEN_WIDTH = 700
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("打砖块游戏")
三、定义游戏元素类
class Paddle(pygame.sprite.Sprite):
# 挡板类
class Ball(pygame.sprite.Sprite):
# 小球类
class Brick(pygame.sprite.Sprite):
# 砖块类
四、初始化游戏元素
我们需要创建挡板、小球和砖块,并将它们添加到游戏中。
paddle = Paddle()
balls = [Ball()]
all_sprites = pygame.sprite.Group()
all_sprites.add(paddle, *balls)
bricks = pygame.sprite.Group()
# 创建砖块对象并添加到精灵组中
五、游戏主循环
游戏主循环中包含了游戏的逻辑,包括事件处理、元素更新、碰撞检测、绘制等。
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 游戏逻辑
all_sprites.update()
# 碰撞检测
# 绘制
pygame.display.flip()
clock.tick(60)
六、结束游戏
游戏结束时,我们弹出一个消息框显示得分,并询问玩家是否想要重试游戏。
root = tk.Tk()
root.withdraw()
messagebox.showinfo("游戏结束", "游戏结束,您的得分:" + str(score))
if messagebox.askyesno("重试?", "你想重试吗?"):
# 重置游戏
else:
running = False
七、完整代码
素材联系博主提供!
import pygame
import random
import sys
import tkinter as tk
from tkinter import messagebox
# 初始化 Pygame
pygame.init()
# 游戏窗口大小
SCREEN_WIDTH = 700
SCREEN_HEIGHT = 600
# 颜色定义
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
# 定义挡板类
class Paddle(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface([100, 10])
self.image.fill(GREEN)
self.rect = self.image.get_rect()
self.rect.x = (SCREEN_WIDTH - self.rect.width) // 2
self.rect.y = SCREEN_HEIGHT - 20
def update(self):
pos = pygame.mouse.get_pos()
self.rect.x = pos[0]
if self.rect.x < 0:
self.rect.x = 0
elif self.rect.x > SCREEN_WIDTH - self.rect.width:
self.rect.x = SCREEN_WIDTH - self.rect.width
# 定义小球类
class Ball(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface([20, 20])
self.image.fill(BLUE)
self.rect = self.image.get_rect()
self.rect.x = SCREEN_WIDTH // 2
self.rect.y = SCREEN_HEIGHT // 2
self.speed_x = random.choice([-5, 5])
self.speed_y = -5
def update(self):
self.rect.x += self.speed_x
self.rect.y += self.speed_y
# 碰到墙壁反弹
if self.rect.x <= 0 or self.rect.x >= SCREEN_WIDTH - self.rect.width:
self.speed_x = -self.speed_x
if self.rect.y <= 0:
self.speed_y = -self.speed_y
# 定义砖块类
class Brick(pygame.sprite.Sprite):
def __init__(self, color, width, height):
super().__init__()
self.image = pygame.Surface([width, height])
self.image.fill(color)
self.rect = self.image.get_rect()
# 初始化游戏窗口
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("打砖块游戏")
# 加载背景图
background = pygame.image.load('23.jpg')
# 创建挡板和小球对象
paddle = Paddle()
balls = [Ball()] # 创建一个小球列表
all_sprites = pygame.sprite.Group()
all_sprites.add(paddle, *balls) # 将小球列表添加到精灵组
# 定义颜色列表
colors = [(255, 0, 0), # 红色
(255, 165, 0), # 橙色
(255, 255, 0), # 黄色
(0, 128, 0), # 绿色
(0, 0, 255), # 蓝色
(75, 0, 130), # 靛色
(238, 130, 238)] # 紫色
# 创建砖块对象
bricks = pygame.sprite.Group()
for row in range(6):
for column in range(10):
color = colors[row % len(colors)] # 从颜色列表中选择颜色
brick = Brick(color, 60, 20)
brick.rect.x = column * (brick.rect.width + 5) + 30
brick.rect.y = row * (brick.rect.height + 5) + 50
bricks.add(brick)
all_sprites.add(brick)
# 游戏主循环
clock = pygame.time.Clock()
running = True
score = 0
falling_dice = False
falling_dice_speed = 5
falling_dice_value = 1
falling_dice_x = 0
falling_dice_y = 0
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 游戏逻辑
all_sprites.update()
# 碰撞检测
for ball in balls: # 遍历小球列表
hits = pygame.sprite.spritecollide(ball, bricks, True)
for brick in hits:
score += 1
ball.speed_y = -ball.speed_y
# 小球与挡板的碰撞检测
if pygame.sprite.collide_rect(ball, paddle):
ball.speed_y = -ball.speed_y
if ball.rect.y > paddle.rect.y: # 只有当小球在挡板上方时才会反弹
ball.speed_x = -ball.speed_x # 反弹后小球的横向速度取反
if not bricks:
running = False
root = tk.Tk()
root.withdraw()
messagebox.showinfo("恭喜", "恭喜您已经通过,您的得分:" + str(score))
if messagebox.askyesno("再来一次?", "你想再玩一次吗?"):
# 重置游戏
balls = [Ball()]
all_sprites = pygame.sprite.Group()
all_sprites.add(paddle, *balls)
bricks = pygame.sprite.Group()
for row in range(6):
for column in range(10):
brick = Brick(RED, 60, 20)
brick.rect.x = column * (brick.rect.width + 5) + 30
brick.rect.y = row * (brick.rect.height + 5) + 50
bricks.add(brick)
all_sprites.add(brick)
score = 0
running = True
else:
running = False
# 生成掉落的筛子
if not falling_dice:
if random.randint(1, 1000) == 1:
falling_dice = True
falling_dice_value = random.randint(1, 6)
falling_dice_x = random.randint(0, SCREEN_WIDTH - 20)
falling_dice_y = 0
# 移动掉落的筛子
if falling_dice:
falling_dice_y += falling_dice_speed
if falling_dice_y > SCREEN_HEIGHT:
falling_dice = False
elif paddle.rect.colliderect(pygame.Rect(falling_dice_x, falling_dice_y, 20, 20)):
score *= falling_dice_value
falling_dice = False
# 吃到筛子生成新的小球
new_ball = Ball()
balls.append(new_ball) # 将新的小球添加到小球列表
all_sprites.add(new_ball)
# 小球掉出底部,游戏结束
for ball in balls: # 遍历小球列表
if ball.rect.y > SCREEN_HEIGHT:
balls.remove(ball) # 如果小球掉出底部,从小球列表中移除
all_sprites.remove(ball) # 从精灵组中移除
if len(balls) == 0: # 如果小球列表为空,即所有的小球都掉出底部,游戏结束
running = False
root = tk.Tk()
root.withdraw()
messagebox.showinfo("游戏结束", "游戏结束,您的得分:" + str(score))
if messagebox.askyesno("重试?", "你想重试吗?"):
# 重置游戏
balls = [Ball()]
all_sprites = pygame.sprite.Group()
all_sprites.add(paddle, *balls)
bricks = pygame.sprite.Group()
for row in range(6):
for column in range(10):
color = colors[row % len(colors)] # 从颜色列表中选择颜色
brick = Brick(color, 60, 20)
brick.rect.x = column * (brick.rect.width + 5) + 30
brick.rect.y = row * (brick.rect.height + 5) + 50
bricks.add(brick)
all_sprites.add(brick)
score = 0
running = True
else:
running = False
# 绘制背景图
screen.blit(background, (0, 0))
# 绘制
all_sprites.draw(screen)
# 绘制得分
font = pygame.font.Font(None, 36)
text = font.render("Score: " + str(score), True, RED)
screen.blit(text, [10, 10])
# 绘制掉落的筛子
if falling_dice:
pygame.draw.rect(screen, GREEN, [falling_dice_x, falling_dice_y, 20, 20])
pygame.display.flip()
clock.tick(60)
pygame.quit()
sys.exit()
八、进阶版游戏
以上只是个功能基础版本游戏,高阶打砖块游戏可以联系博主进行购买!包售后,主打就是诚信。