提供学习或者毕业设计使用,功能基本都有,不能和市场上正式游戏相提比论,请理性对待!
在本文中,我们将使用 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) // 2self.rect.y = SCREEN_HEIGHT - 20def update(self):pos = pygame.mouse.get_pos()self.rect.x = pos[0]if self.rect.x < 0:self.rect.x = 0elif 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 // 2self.rect.y = SCREEN_HEIGHT // 2self.speed_x = random.choice([-5, 5])self.speed_y = -5def update(self):self.rect.x += self.speed_xself.rect.y += self.speed_y# 碰到墙壁反弹if self.rect.x <= 0 or self.rect.x >= SCREEN_WIDTH - self.rect.width:self.speed_x = -self.speed_xif 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) + 30brick.rect.y = row * (brick.rect.height + 5) + 50bricks.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 = 0while 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 += 1ball.speed_y = -ball.speed_y# 小球与挡板的碰撞检测if pygame.sprite.collide_rect(ball, paddle):ball.speed_y = -ball.speed_yif ball.rect.y > paddle.rect.y: # 只有当小球在挡板上方时才会反弹ball.speed_x = -ball.speed_x # 反弹后小球的横向速度取反if not bricks:running = Falseroot = 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) + 30brick.rect.y = row * (brick.rect.height + 5) + 50bricks.add(brick)all_sprites.add(brick)score = 0running = Trueelse:running = False# 生成掉落的筛子if not falling_dice:if random.randint(1, 1000) == 1:falling_dice = Truefalling_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_speedif falling_dice_y > SCREEN_HEIGHT:falling_dice = Falseelif paddle.rect.colliderect(pygame.Rect(falling_dice_x, falling_dice_y, 20, 20)):score *= falling_dice_valuefalling_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 = Falseroot = 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) + 30brick.rect.y = row * (brick.rect.height + 5) + 50bricks.add(brick)all_sprites.add(brick)score = 0running = Trueelse: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()
八、进阶版游戏
以上只是个功能基础版本游戏,高阶打砖块游戏可以联系博主进行购买!包售后,主打就是诚信。