使用VSCode开发少儿编程项目:饥饿的鲨鱼游戏

我将为您创建一个有趣且教育性的"饥饿的鲨鱼"游戏,适合少儿编程学习。这个项目使用Python的Pygame库,可以帮助孩子们理解游戏开发的基本概念。

项目概述

"饥饿的鲨鱼"是一个简单而有趣的小游戏,玩家控制一条鲨鱼在海洋中游动,吃掉小鱼获得分数,同时避开危险的障碍物。通过这个项目,孩子们可以学习:

  • 游戏循环和事件处理
  • 精灵(Sprite)和碰撞检测
  • 用户输入处理
  • 分数系统和游戏状态管理

环境设置

在开始之前,需要安装Pygame库。在VSCode的终端中运行:

pip install pygame

代码实现

以下是完整的"饥饿的鲨鱼"游戏代码:

import pygame
import random
import sys

# 初始化pygame
pygame.init()

# 游戏窗口设置
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("饥饿的鲨鱼")

# 颜色定义
BLUE = (64, 128, 255)  # 海洋蓝
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)

# 加载图像(如果没有图像,我们将使用简单的几何形状代替)
# 在实际项目中,您可以添加鲨鱼、鱼和炸弹的图片

# 游戏时钟
clock = pygame.time.Clock()

# 鲨鱼类
class Shark:
    def __init__(self):
        self.x = WIDTH // 2
        self.y = HEIGHT // 2
        self.speed = 5
        self.size = 40
        self.direction = 1  # 1表示向右,-1表示向左
        
    def move(self, keys):
        if keys[pygame.K_LEFT]:
            self.x -= self.speed
            self.direction = -1
        if keys[pygame.K_RIGHT]:
            self.x += self.speed
            self.direction = 1
        if keys[pygame.K_UP]:
            self.y -= self.speed
        if keys[pygame.K_DOWN]:
            self.y += self.speed
            
        # 确保鲨鱼不会离开屏幕
        self.x = max(self.size // 2, min(WIDTH - self.size // 2, self.x))
        self.y = max(self.size // 2, min(HEIGHT - self.size // 2, self.y))
        
    def draw(self):
        # 绘制鲨鱼(简化为一个三角形)
        if self.direction == 1:  # 向右
            points = [(self.x - self.size//2, self.y), 
                     (self.x + self.size//2, self.y - self.size//2),
                     (self.x + self.size//2, self.y + self.size//2)]
        else:  # 向左
            points = [(self.x + self.size//2, self.y), 
                     (self.x - self.size//2, self.y - self.size//2),
                     (self.x - self.size//2, self.y + self.size//2)]
        
        pygame.draw.polygon(screen, (100, 100, 100), points)
        # 绘制眼睛
        eye_x = self.x + self.direction * self.size//4
        pygame.draw.circle(screen, WHITE, (eye_x, self.y - self.size//8), 5)
        pygame.draw.circle(screen, (0, 0, 0), (eye_x, self.y - self.size//8), 2)

# 鱼类(食物)
class Fish:
    def __init__(self):
        self.size = random.randint(10, 20)
        self.x = random.randint(self.size, WIDTH - self.size)
        self.y = random.randint(self.size, HEIGHT - self.size)
        self.speed = random.uniform(1, 3)
        self.color = (random.randint(200, 255), random.randint(100, 200), random.randint(0, 100))
        
    def move(self):
        # 鱼会随机移动一点
        self.x += random.uniform(-1, 1)
        self.y += random.uniform(-1, 1)
        
        # 确保鱼不会离开屏幕
        self.x = max(self.size // 2, min(WIDTH - self.size // 2, self.x))
        self.y = max(self.size // 2, min(HEIGHT - self.size // 2, self.y))
        
    def draw(self):
        pygame.draw.circle(screen, self.color, (self.x, self.y), self.size)
        # 绘制鱼尾
        pygame.draw.polygon(screen, self.color, [
            (self.x - self.size, self.y),
            (self.x - self.size*1.5, self.y - self.size//2),
            (self.x - self.size*1.5, self.y + self.size//2)
        ])

# 炸弹类(障碍物)
class Bomb:
    def __init__(self):
        self.size = 25
        self.x = random.randint(self.size, WIDTH - self.size)
        self.y = random.randint(self.size, HEIGHT - self.size)
        self.speed = random.uniform(0.5, 1.5)
        
    def move(self):
        # 炸弹会缓慢向下移动
        self.y += self.speed
        
        # 如果炸弹到达底部,重新放置到顶部
        if self.y > HEIGHT + self.size:
            self.y = -self.size
            self.x = random.randint(self.size, WIDTH - self.size)
            
    def draw(self):
        pygame.draw.circle(screen, RED, (self.x, self.y), self.size)
        # 绘制炸弹引线
        pygame.draw.line(screen, (100, 100, 100), 
                        (self.x, self.y - self.size), 
                        (self.x + self.size//2, self.y - self.size*1.5), 3)

# 游戏主函数
def main():
    shark = Shark()
    fishes = [Fish() for _ in range(10)]
    bombs = [Bomb() for _ in range(5)]
    
    score = 0
    font = pygame.font.SysFont(None, 36)
    
    running = True
    game_over = False
    
    while running:
        # 处理事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            if game_over and event.type == pygame.KEYDOWN:
                if event.key == pygame.K_r:
                    # 重新开始游戏
                    return main()
                if event.key == pygame.K_q:
                    running = False
        
        if not game_over:
            # 获取按键状态
            keys = pygame.key.get_pressed()
            
            # 更新鲨鱼位置
            shark.move(keys)
            
            # 更新鱼的位置
            for fish in fishes:
                fish.move()
                
                # 检测鲨鱼是否吃到鱼
                distance = ((shark.x - fish.x) ** 2 + (shark.y - fish.y) ** 2) ** 0.5
                if distance < shark.size//2 + fish.size:
                    score += 1
                    fishes.remove(fish)
                    fishes.append(Fish())
            
            # 更新炸弹位置
            for bomb in bombs:
                bomb.move()
                
                # 检测鲨鱼是否碰到炸弹
                distance = ((shark.x - bomb.x) ** 2 + (shark.y - bomb.y) ** 2) ** 0.5
                if distance < shark.size//2 + bomb.size:
                    game_over = True
        
        # 绘制背景
        screen.fill(BLUE)
        
        # 绘制海底气泡
        for i in range(20):
            x = random.randint(0, WIDTH)
            y = random.randint(0, HEIGHT)
            size = random.randint(2, 5)
            pygame.draw.circle(screen, (200, 200, 255, 128), (x, y), size)
        
        # 绘制鱼
        for fish in fishes:
            fish.draw()
            
        # 绘制炸弹
        for bomb in bombs:
            bomb.draw()
            
        # 绘制鲨鱼
        shark.draw()
        
        # 显示分数
        score_text = font.render(f"分数: {score}", True, WHITE)
        screen.blit(score_text, (10, 10))
        
        # 游戏结束显示
        if game_over:
            game_over_text = font.render("游戏结束! 按R重新开始 按Q退出", True, WHITE)
            screen.blit(game_over_text, (WIDTH//2 - 180, HEIGHT//2))
        
        # 更新显示
        pygame.display.flip()
        
        # 控制游戏速度
        clock.tick(60)
    
    pygame.quit()
    sys.exit()

# 启动游戏
if __name__ == "__main__":
    main()

在VSCode中设置和运行

  1. 安装Pygame库

    • 在VSCode中打开终端(Ctrl+`)
    • 输入命令:pip install pygame
  2. 创建项目文件

    • 创建一个新文件夹用于您的项目
    • 在该文件夹中创建一个新文件,命名为hungry_shark.py
    • 将上面的代码复制到文件中
  3. 运行程序

    • 在终端中输入命令运行程序:python hungry_shark.py
    • 或者,点击右上角的运行按钮(▶)

游戏操作说明

  • 使用方向键(上、下、左、右)控制鲨鱼移动
  • 吃掉小鱼增加分数
  • 避开红色炸弹,碰到炸弹游戏结束
  • 游戏结束后,按R键重新开始,按Q键退出游戏

教学要点

  1. 解释代码结构

    • 游戏初始化设置
    • 游戏主循环和事件处理
    • 类定义:鲨鱼、鱼和炸弹
    • 碰撞检测原理
    • 游戏状态管理
  2. 编程概念学习

    • 面向对象编程:类和对象
    • 游戏循环和帧率控制
    • 随机数生成和应用
    • 条件语句和循环
    • 函数定义和调用
  3. 扩展练习

    • 添加不同类型的鱼,提供不同分数
    • 实现鲨鱼成长系统(吃得越多,鲨鱼越大)
    • 添加时间限制和关卡系统
    • 加入音效和背景音乐
    • 使用真实的图片替代几何图形

简化版本(适合更小的孩子)

如果学习者是更小的孩子,可以使用这个更简化的版本:

import pygame
import random

# 初始化pygame
pygame.init()

# 屏幕设置
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("简单鲨鱼游戏")

# 颜色
BLUE = (100, 100, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)

# 鲨鱼位置
shark_x = 400
shark_y = 300

# 鱼的位置
fish_x = random.randint(50, 750)
fish_y = random.randint(50, 550)

# 分数
score = 0
font = pygame.font.SysFont(None, 36)

# 游戏循环
running = True
while running:
    # 处理事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    
    # 获取按键
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        shark_x -= 5
    if keys[pygame.K_RIGHT]:
        shark_x += 5
    if keys[pygame.K_UP]:
        shark_y -= 5
    if keys[pygame.K_DOWN]:
        shark_y += 5
    
    # 检测是否吃到鱼
    if abs(shark_x - fish_x) < 30 and abs(shark_y - fish_y) < 30:
        score += 1
        fish_x = random.randint(50, 750)
        fish_y = random.randint(50, 550)
    
    # 绘制背景
    screen.fill(BLUE)
    
    # 绘制鱼
    pygame.draw.circle(screen, GREEN, (fish_x, fish_y), 15)
    
    # 绘制鲨鱼
    pygame.draw.circle(screen, (100, 100, 100), (shark_x, shark_y), 30)
    
    # 显示分数
    score_text = font.render(f"分数: {score}", True, (255, 255, 255))
    screen.blit(score_text, (10, 10))
    
    # 更新屏幕
    pygame.display.update()
    pygame.time.delay(30)

pygame.quit()

故障排除

如果遇到问题:

  1. 确保已安装Pygame(在终端输入pip show pygame检查)
  2. 确保在VSCode中选择了正确的Python解释器
  3. 如果遇到显示问题,尝试调整游戏窗口大小

这个"饥饿的鲨鱼"项目非常适合编程初学者,特别是孩子们,通过有趣的游戏学习编程基础概念。您可以根据学习者的进度调整代码复杂度和功能。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐