时隔已久,Python的Pygame助力我打造外星人大战游戏,实战体验分享
这是我用pygame制作的外星人大战
如图:
怎么样,点赞支持一下呗?
源代码:
import pygame
import random
import sys
import os
# 获取当前脚本的目录
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
# 初始化Pygame
pygame.init()
# 屏幕尺寸
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("外星人大战")
# 颜色定义
WHITE = (25, 62, 11)
BLACK = (255, 0, 255)
RED = (255, 0, 0) # 用于显示得分的颜色
# 字体设置
font = pygame.font.Font(None, 36) # 使用系统默认字体,大小为36
chinese_font = pygame.font.SysFont('simhei', 48) # 使用系统自带的中文字体,大小为48
# 加载图片
player_img = pygame.image.load(os.path.join(BASE_DIR, 'ic.bmp'))
player_img = pygame.transform.scale(player_img, (50, 50))
alien_img = pygame.image.load(os.path.join(BASE_DIR, 'in.bmp'))
alien_img = pygame.transform.scale(alien_img, (50, 50))
bullet_img = pygame.image.load(os.path.join(BASE_DIR, 'ib.bmp'))
bullet_img = pygame.transform.scale(bullet_img, (20, 40)) # 已将子弹大小调整为20x40
# 玩家类
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = player_img
self.rect = self.image.get_rect()
self.rect.centerx = SCREEN_WIDTH // 2
self.rect.bottom = SCREEN_HEIGHT - 10
self.speed = 5
def update(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and self.rect.left > 0:
self.rect.x -= self.speed
if keys[pygame.K_RIGHT] and self.rect.right < SCREEN_WIDTH:
self.rect.x += self.speed
def shoot(self):
bullet = Bullet(self.rect.centerx, self.rect.top)
all_sprites.add(bullet)
bullets.add(bullet)
# 外星人类
class Alien(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = alien_img
self.rect = self.image.get_rect()
self.rect.x = random.randint(0, SCREEN_WIDTH - self.rect.width)
self.rect.y = random.randint(-100, -40)
self.speed = random.randint(1, 3)
def update(self):
self.rect.y += self.speed
if self.rect.top > SCREEN_HEIGHT + 10:
self.rect.x = random.randint(0, SCREEN_WIDTH - self.rect.width)
self.rect.y = random.randint(-100, -40)
self.speed = random.randint(1, 3)
# 子弹类
class Bullet(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = bullet_img # 这里先加载原始图片,稍后再缩放
# 将子弹图片缩放到新的大小
self.image = pygame.transform.scale(self.image, (20, 40))
self.rect = self.image.get_rect()
self.rect.centerx = x
self.rect.bottom = y
self.speed = 10
def update(self):
self.rect.y -= self.speed
if self.rect.bottom < 0:
self.kill()
# 创建精灵组
all_sprites = pygame.sprite.Group()
aliens = pygame.sprite.Group()
bullets = pygame.sprite.Group()
# 创建玩家实例并添加到精灵组
player = Player()
all_sprites.add(player)
# 创建多个外星人实例并添加到精灵组
for i in range(8):
alien = Alien()
all_sprites.add(alien)
aliens.add(alien)
# 初始化得分
score = 0
# 游戏循环
running = True
game_over = False # 新增一个标志来表示游戏是否结束
clock = pygame.time.Clock()
while running:
# 处理事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
player.shoot()
# 更新游戏状态
if not game_over: # 只有当游戏没有结束时才更新
all_sprites.update()
# 检查子弹和外星人的碰撞
hits = pygame.sprite.groupcollide(bullets, aliens, True, True)
for hit in hits:
score += 10
alien = Alien()
all_sprites.add(alien)
aliens.add(alien)
# 检查玩家和外星人的碰撞
if pygame.sprite.spritecollide(player, aliens, False):
game_over = True # 设置游戏结束标志
# 绘制
screen.fill(BLACK)
# 显示得分(在游戏结束前显示)
if not game_over:
score_surface = font.render(f"Score: {score}", True, RED)
screen.blit(score_surface, (10, 10))
# 游戏结束逻辑
if game_over:
game_over_surface = chinese_font.render("死了", True, RED)
screen.blit(game_over_surface, (SCREEN_WIDTH // 2 - game_over_surface.get_width() // 2, SCREEN_HEIGHT // 2 - game_over_surface.get_height() // 2))
# 刷新屏幕以显示“死了”消息
pygame.display.flip()
# 等待两秒
pygame.time.delay(2000)
# 退出游戏循环(但此时屏幕已经更新过并且等待了两秒)
running = False
else:
# 如果游戏没有结束,则正常绘制所有精灵并刷新屏幕
all_sprites.draw(screen)
pygame.display.flip()
# 控制帧率(尽管在游戏结束时这个可能不是必需的)
clock.tick(60)
这如果复制不了,我可以用文字展示:
———————————————————————————————————————————
import pygame
import random
import sys
import os
# 获取当前脚本的目录
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
# 初始化Pygame
pygame.init()
# 屏幕尺寸
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("外星人大战")
# 颜色定义
WHITE = (25, 62, 11)
BLACK = (255, 0, 255)
RED = (255, 0, 0) # 用于显示得分的颜色
# 字体设置
font = pygame.font.Font(None, 36) # 使用系统默认字体,大小为36
chinese_font = pygame.font.SysFont('simhei', 48) # 使用系统自带的中文字体,大小为48
# 加载图片
player_img = pygame.image.load(os.path.join(BASE_DIR, 'ic.bmp'))
player_img = pygame.transform.scale(player_img, (50, 50))
alien_img = pygame.image.load(os.path.join(BASE_DIR, 'in.bmp'))
alien_img = pygame.transform.scale(alien_img, (50, 50))
bullet_img = pygame.image.load(os.path.join(BASE_DIR, 'ib.bmp'))
bullet_img = pygame.transform.scale(bullet_img, (20, 40)) # 已将子弹大小调整为20×40
# 玩家类
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = player_img
self.rect = self.image.get_rect()
self.rect.centerx = SCREEN_WIDTH // 2
self.rect.bottom = SCREEN_HEIGHT – 10
self.speed = 5
def update(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and self.rect.left > 0:
self.rect.x -= self.speed
if keys[pygame.K_RIGHT] and self.rect.right < SCREEN_WIDTH:
self.rect.x += self.speed
def shoot(self):
bullet = Bullet(self.rect.centerx, self.rect.top)
all_sprites.add(bullet)
bullets.add(bullet)
# 外星人类
class Alien(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = alien_img
self.rect = self.image.get_rect()
self.rect.x = random.randint(0, SCREEN_WIDTH – self.rect.width)
self.rect.y = random.randint(-100, -40)
self.speed = random.randint(1, 3)
def update(self):
self.rect.y += self.speed
if self.rect.top > SCREEN_HEIGHT + 10:
self.rect.x = random.randint(0, SCREEN_WIDTH – self.rect.width)
self.rect.y = random.randint(-100, -40)
self.speed = random.randint(1, 3)
# 子弹类
class Bullet(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = bullet_img # 这里先加载原始图片,稍后再缩放
# 将子弹图片缩放到新的大小
self.image = pygame.transform.scale(self.image, (20, 40))
self.rect = self.image.get_rect()
self.rect.centerx = x
self.rect.bottom = y
self.speed = 10
def update(self):
self.rect.y -= self.speed
if self.rect.bottom < 0:
self.kill()
# 创建精灵组
all_sprites = pygame.sprite.Group()
aliens = pygame.sprite.Group()
bullets = pygame.sprite.Group()
# 创建玩家实例并添加到精灵组
player = Player()
all_sprites.add(player)
# 创建多个外星人实例并添加到精灵组
for i in range(8):
alien = Alien()
all_sprites.add(alien)
aliens.add(alien)
# 初始化得分
score = 0
# 游戏循环
running = True
game_over = False # 新增一个标志来表示游戏是否结束
clock = pygame.time.Clock()
while running:
# 处理事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
player.shoot()
# 更新游戏状态
if not game_over: # 只有当游戏没有结束时才更新
all_sprites.update()
# 检查子弹和外星人的碰撞
hits = pygame.sprite.groupcollide(bullets, aliens, True, True)
for hit in hits:
score += 10
alien = Alien()
all_sprites.add(alien)
aliens.add(alien)
# 检查玩家和外星人的碰撞
if pygame.sprite.spritecollide(player, aliens, False):
game_over = True # 设置游戏结束标志
# 绘制
screen.fill(BLACK)
# 显示得分(在游戏结束前显示)
if not game_over:
score_surface = font.render(f"Score: {score}", True, RED)
screen.blit(score_surface, (10, 10))
# 游戏结束逻辑
if game_over:
game_over_surface = chinese_font.render("死了", True, RED)
screen.blit(game_over_surface, (SCREEN_WIDTH // 2 – game_over_surface.get_width() // 2, SCREEN_HEIGHT // 2 – game_over_surface.get_height() // 2))
# 刷新屏幕以显示“死了”消息
pygame.display.flip()
# 等待两秒
pygame.time.delay(2000)
# 退出游戏循环(但此时屏幕已经更新过并且等待了两秒)
running = False
else:
# 如果游戏没有结束,则正常绘制所有精灵并刷新屏幕
all_sprites.draw(screen)
pygame.display.flip()
# 控制帧率(尽管在游戏结束时这个可能不是必需的)
clock.tick(60)
———————————————————————————————-———————————
我还分享了应用和源代码和资源文件
夸克:
链接:夸克下载
提取码:8aM5
123云盘:
链接:123云盘下载
提取码:z376
都安全,放心!
以上可以转载,但请标明:
这期到这里了,👍好吗?
作者:程序鸠