时隔已久,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

都安全,放心!

以上可以转载,但请标明:

这期到这里了,👍好吗?

作者:程序鸠

物联沃分享整理
物联沃-IOTWORD物联网 » 时隔已久,Python的Pygame助力我打造外星人大战游戏,实战体验分享

发表回复