有没有想象过自己独立编写一个有趣的小游戏。在本实践课程中,你不仅可以实现这个想法,而且还将得到通义灵码智能编程助手的支持与指导。我们将携手步入编程的神奇世界,以一种简洁、高效且具有创造性的方式,一步步构建起一个完全属于你自己的个性化小游戏。这将开启你对游戏开发深远理解的大门,让你享受到创作的乐趣和编程带来的无限可能。
实验步骤
步骤一:下载安装登录通义灵码
参考安装教程https://tongyi.aliyun.com/lingma
步骤二:实验源码
import pygame
import sys
from random import randint
# 初始化 Pygame
pygame.init()
# 设置屏幕尺寸
screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("飞机大战")
# 加载图像
player_image = pygame.image.load('images/player.svg')
enemy_image = pygame.image.load('images/enemy.svg')
bullet_image = pygame.image.load('images/bullet.svg')
explosion_image = pygame.image.load('images/explosion.svg')
background_image = pygame.image.load('images/background1.png') # 背景图片
# 加载声音
shoot_sound = pygame.mixer.Sound('sounds/sound.wav')
class Player:
def __init__(self):
self.image = player_image
self.rect = self.image.get_rect()
self.rect.topleft = (screen_width // 2, screen_height - 100)
self.speed = 5
def move(self, keys):
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
if keys[pygame.K_UP] and self.rect.top > 0:
self.rect.y -= self.speed
if keys[pygame.K_DOWN] and self.rect.bottom < screen_height:
self.rect.y += self.speed
def draw(self, surface):
surface.blit(self.image, self.rect)
class Enemy:
def __init__(self):
self.image = enemy_image
self.rect = self.image.get_rect()
self.rect.topleft = (randint(0, screen_width - self.rect.width), -self.rect.height)
self.speed = 2
def move(self):
self.rect.y += self.speed
def draw(self, surface):
surface.blit(self.image, self.rect)
class Bullet:
def __init__(self, x, y):
self.image = bullet_image
self.rect = self.image.get_rect()
self.rect.centerx = x
self.rect.centery = y
self.speed = 10
def move(self):
self.rect.y -= self.speed
def draw(self, surface):
surface.blit(self.image, self.rect)
class Explosion:
def __init__(self, x, y):
self.image = explosion_image
self.rect = self.image.get_rect()
self.rect.centerx = x
self.rect.centery = y
self.duration = 50 # 爆炸持续时间(毫秒)
def draw(self, surface):
surface.blit(self.image, self.rect)
def update(self):
self.duration -= 1
return self.duration <= 0
def main():
clock = pygame.time.Clock()
player = Player()
enemies = []
bullets = []
explosions = []
enemy_spawn_time = 0
score = 0 # 添加分数变量
font = pygame.font.Font(None, 36) # 创建字体对象
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
bullet = Bullet(player.rect.centerx, player.rect.top)
bullets.append(bullet)
shoot_sound.play() # 播放射击声音
keys = pygame.key.get_pressed()
player.move(keys)
# 敌人生成
current_time = pygame.time.get_ticks()
if current_time - enemy_spawn_time > 1000:
enemy = Enemy()
enemies.append(enemy)
enemy_spawn_time = current_time
# 更新敌人位置
for enemy in enemies:
enemy.move()
if enemy.rect.top > screen_height:
enemies.remove(enemy)
# 更新子弹位置
for bullet in bullets:
bullet.move()
if bullet.rect.bottom < 0:
bullets.remove(bullet)
# 检测碰撞
for enemy in enemies[:]:
if player.rect.colliderect(enemy.rect):
print("Game Over!")
pygame.quit()
sys.exit()
for bullet in bullets[:]:
if bullet.rect.colliderect(enemy.rect):
enemies.remove(enemy)
bullets.remove(bullet)
explosion = Explosion(enemy.rect.centerx, enemy.rect.centery)
explosions.append(explosion)
score += 10 # 增加分数
# 更新爆炸效果
for explosion in explosions[:]:
if explosion.update():
explosions.remove(explosion)
# 绘制背景图片
screen.blit(background_image, (0, 0))
# 绘制玩家
player.draw(screen)
# 绘制敌人
for enemy in enemies:
enemy.draw(screen)
# 绘制子弹
for bullet in bullets:
bullet.draw(screen)
# 绘制爆炸效果
for explosion in explosions:
explosion.draw(screen)
# 绘制分数
score_text = font.render(f"Score: {score}", True, (255, 255, 255))
screen.blit(score_text, (10, 10))
pygame.display.flip()
clock.tick(60)
if __name__ == "__main__":
main()
代码解析与功能说明
初始化与设置
pygame.init()
:初始化 Pygame。screen
:创建一个 800x600 的游戏窗口,并设置标题为“飞机大战”。player_image
,enemy_image
,bullet_image
,explosion_image
,background_image
:加载玩家、敌人、子弹、爆炸和背景图像。shoot_sound
:加载射击声音。
类定义
Player 类
:
__init__
:初始化玩家的位置和速度。move
:根据按键移动玩家。draw
:在屏幕上绘制玩家。
Enemy 类
:
__init__
:初始化敌人的位置和速度。move
:向下移动敌人。draw
:在屏幕上绘制敌人。
Bullet 类
:
__init__
:初始化子弹的位置和速度。move
:向上移动子弹。draw
:在屏幕上绘制子弹。
Explosion 类
:
__init__
:初始化爆炸的位置和持续时间。draw
:在屏幕上绘制爆炸。update
:更新爆炸的持续时间,如果持续时间结束则返回True
。
主循环
clock
:创建一个时钟对象来控制帧率。player
:创建一个玩家对象。enemies
,bullets
,explosions
:分别存储敌人、子弹和爆炸的列表。enemy_spawn_time
:记录上一次生成敌人的时刻。score
:记录玩家的得分。font
:创建一个字体对象用于显示分数。
事件处理
- 处理退出事件和射击事件。
- 根据按键移动玩家。
敌人生成
- 每隔 1 秒生成一个新的敌人。
更新位置
- 更新敌人和子弹的位置。
- 如果敌人或子弹超出屏幕范围,则移除它们。
碰撞检测
- 检测玩家与敌人的碰撞,如果碰撞则游戏结束。
- 检测子弹与敌人的碰撞,如果碰撞则移除敌人和子弹,并生成爆炸效果,增加分数。
绘制
- 绘制背景、玩家、敌人、子弹和爆炸效果。
- 绘制分数。
更新屏幕
- 使用
pygame.display.flip()
更新屏幕。 - 控制帧率为 60 帧/秒。
- 使用
运行说明
- 确保所有图像文件(
player.svg
,enemy.svg
,bullet.svg
,explosion.svg
,background1.png
)和声音文件(sound.wav
)存在于images
和sounds
文件夹中。 - 运行
main()
函数即可启动游戏。 - 使用方向键控制玩家移动,空格键发射子弹。
- 游戏目标是击毁尽可能多的敌人,避免被敌人撞到。
运行效果
欢迎大家体验、试用阿里云百炼大模型和阿里云服务产品,链接如下:
阿里云百炼大模型
https://bailian.console.aliyun.com/
通义灵码_智能编码助手面向用户上线个人和企业版产品
https://tongyi.aliyun.com/lingma/pricing?userCode=jl9als0w
云工开物_阿里云高校计划助力高校科研与教育加速。
https://university.aliyun.com/mobile?userCode=jl9als0w
无影云电脑个人版简单易用、安全高效的云上桌面服务
https://www.aliyun.com/product/wuying/gws/personal_edition?userCode=jl9als0w
云服务器ECS省钱攻略五种权益,限时发放,不容错过
https://www.aliyun.com/daily-act/ecs/ecs_trial_benefits?userCode=jl9als0w