使用VSCode开发少儿编程项目:蚂蚁农场模拟

我将为您设计一个适合少儿的蚂蚁农场模拟项目,使用Python和Pygame库在VSCode中开发。这个项目将模拟蚂蚁在农场中的基本行为,如寻找食物、返回巢穴等。

项目概述

蚂蚁农场模拟是一个教育性的编程项目,旨在帮助少儿学习:

  • 基础编程概念(变量、循环、条件判断)
  • 面向对象编程基础
  • 简单的生物模拟
  • 问题解决和逻辑思维

项目结构

ant-farm-simulation/
├── main.py              # 主程序文件
├── ant.py               # 蚂蚁类定义
├── food.py              # 食物类定义
├── nest.py              # 蚁巢类定义
├── utils.py             # 工具函数
└── requirements.txt     # 项目依赖

代码实现

1. requirements.txt

pygame==2.1.2

2. main.py

import pygame
import sys
from ant import Ant
from food import Food
from nest import Nest
from utils import draw_text

# 初始化Pygame
pygame.init()

# 屏幕设置
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("蚂蚁农场模拟 - 少儿编程项目")

# 颜色定义
BACKGROUND = (230, 255, 230)
ANT_COLOR = (50, 50, 50)
FOOD_COLOR = (255, 100, 100)
NEST_COLOR = (150, 75, 0)
TEXT_COLOR = (0, 0, 0)

# 创建蚁巢
nest = Nest(WIDTH // 2, HEIGHT // 2)

# 创建食物
foods = [
    Food(100, 100),
    Food(700, 100),
    Food(100, 500),
    Food(700, 500)
]

# 创建蚂蚁群
ants = [Ant(nest.x, nest.y) for _ in range(10)]

# 游戏主循环
clock = pygame.time.Clock()
running = True

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN:
            # 点击添加食物
            x, y = pygame.mouse.get_pos()
            foods.append(Food(x, y))
    
    # 更新蚂蚁状态
    for ant in ants:
        ant.update(foods, nest, WIDTH, HEIGHT)
    
    # 绘制背景
    screen.fill(BACKGROUND)
    
    # 绘制食物
    for food in foods:
        food.draw(screen)
    
    # 绘制蚁巢
    nest.draw(screen)
    
    # 绘制蚂蚁
    for ant in ants:
        ant.draw(screen)
    
    # 绘制统计信息
    ants_with_food = sum(1 for ant in ants if ant.has_food)
    draw_text(screen, f"蚂蚁数量: {len(ants)}", 10, 10, TEXT_COLOR)
    draw_text(screen, f"携带食物的蚂蚁: {ants_with_food}", 10, 30, TEXT_COLOR)
    draw_text(screen, f"食物数量: {len(foods)}", 10, 50, TEXT_COLOR)
    draw_text(screen, "点击屏幕添加食物", 10, HEIGHT - 30, TEXT_COLOR)
    
    pygame.display.flip()
    clock.tick(30)

pygame.quit()
sys.exit()

3. ant.py

import pygame
import random
import math

class Ant:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.size = 4
        self.speed = 2
        self.direction = random.uniform(0, 2 * math.pi)
        self.has_food = False
        self.search_time = 0
        self.color = (50, 50, 50)
        self.trail = []  # 记录蚂蚁的路径(简化版信息素)
        
    def update(self, foods, nest, screen_width, screen_height):
        # 限制轨迹长度
        if len(self.trail) > 50:
            self.trail.pop(0)
        self.trail.append((self.x, self.y))
        
        if self.has_food:
            # 如果携带食物,返回巢穴
            self.return_to_nest(nest)
        else:
            # 寻找食物
            self.search_for_food(foods)
            
        # 移动蚂蚁
        self.x += math.cos(self.direction) * self.speed
        self.y += math.sin(self.direction) * self.speed
        
        # 边界检查
        self.x = max(self.size, min(screen_width - self.size, self.x))
        self.y = max(self.size, min(screen_height - self.size, self.y))
        
        # 随机改变方向(模拟探索行为)
        if random.random() < 0.05:
            self.direction += random.uniform(-0.5, 0.5)
            
        # 检查是否找到食物
        if not self.has_food:
            for food in foods:
                distance = math.sqrt((self.x - food.x)**2 + (self.y - food.y)**2)
                if distance < self.size + food.size:
                    self.has_food = True
                    food.amount -= 1
                    if food.amount <= 0:
                        foods.remove(food)
                    break
                    
        # 检查是否返回巢穴
        if self.has_food:
            distance_to_nest = math.sqrt((self.x - nest.x)**2 + (self.y - nest.y)**2)
            if distance_to_nest < self.size + nest.size:
                self.has_food = False
                nest.food_stored += 1
    
    def search_for_food(self, foods):
        # 简单寻找食物逻辑
        if foods:
            # 找到最近的食物
            closest_food = min(foods, key=lambda f: math.sqrt((self.x - f.x)**2 + (self.y - f.y)**2))
            target_x, target_y = closest_food.x, closest_food.y
            
            # 计算方向
            dx = target_x - self.x
            dy = target_y - self.y
            target_dir = math.atan2(dy, dx)
            
            # 逐渐转向目标方向
            angle_diff = target_dir - self.direction
            # 确保角度差在[-π, π]范围内
            while angle_diff > math.pi:
                angle_diff -= 2 * math.pi
            while angle_diff < -math.pi:
                angle_diff += 2 * math.pi
                
            # 转向目标方向(但不是立即转向,模拟真实蚂蚁行为)
            self.direction += angle_diff * 0.1
    
    def return_to_nest(self, nest):
        # 返回巢穴逻辑
        dx = nest.x - self.x
        dy = nest.y - self.y
        target_dir = math.atan2(dy, dx)
        
        # 逐渐转向巢穴方向
        angle_diff = target_dir - self.direction
        # 确保角度差在[-π, π]范围内
        while angle_diff > math.pi:
            angle_diff -= 2 * math.pi
        while angle_diff < -math.pi:
            angle_diff += 2 * math.pi
            
        # 转向巢穴方向
        self.direction += angle_diff * 0.1
    
    def draw(self, screen):
        # 绘制蚂蚁轨迹(简化版信息素)
        for i in range(1, len(self.trail)):
            alpha = i / len(self.trail) * 100
            color = (100, 100, 100, alpha)
            pygame.draw.line(screen, color, self.trail[i-1], self.trail[i], 1)
        
        # 绘制蚂蚁身体
        pygame.draw.circle(screen, self.color, (int(self.x), int(self.y)), self.size)
        
        # 如果携带食物,在蚂蚁上方绘制一个小点表示食物
        if self.has_food:
            pygame.draw.circle(screen, (255, 100, 100), (int(self.x), int(self.y - self.size - 2)), 2)
        
        # 绘制蚂蚁方向指示器
        end_x = self.x + math.cos(self.direction) * (self.size + 3)
        end_y = self.y + math.sin(self.direction) * (self.size + 3)
        pygame.draw.line(screen, self.color, (self.x, self.y), (end_x, end_y), 1)

4. food.py

import pygame

class Food:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.size = 8
        self.amount = 10  # 食物量
        self.color = (255, 100, 100)
    
    def draw(self, screen):
        pygame.draw.circle(screen, self.color, (int(self.x), int(self.y)), self.size)
        # 绘制食物量指示器
        pygame.draw.circle(screen, (255, 200, 200), (int(self.x), int(self.y)), self.size - 2)

5. nest.py

import pygame

class Nest:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.size = 20
        self.color = (150, 75, 0)
        self.food_stored = 0
    
    def draw(self, screen):
        # 绘制蚁巢
        pygame.draw.circle(screen, self.color, (int(self.x), int(self.y)), self.size)
        pygame.draw.circle(screen, (200, 150, 100), (int(self.x), int(self.y)), self.size - 5)
        
        # 绘制存储的食物计数
        font = pygame.font.SysFont(None, 24)
        text = font.render(str(self.food_stored), True, (255, 255, 255))
        screen.blit(text, (self.x - text.get_width() // 2, self.y - text.get_height() // 2))

6. utils.py

import pygame

def draw_text(screen, text, x, y, color, size=24):
    font = pygame.font.SysFont(None, size)
    text_surface = font.render(text, True, color)
    screen.blit(text_surface, (x, y))

在VSCode中设置项目

  1. 创建新文件夹 ant-farm-simulation
  2. 在VSCode中打开该文件夹
  3. 创建上述所有Python文件
  4. 安装Pygame库:
    pip install pygame
    
  5. 运行主程序:
    python main.py
    

教学要点

  1. 基础概念:变量、循环、条件判断
  2. 面向对象编程:类、对象、方法
  3. 数学应用:坐标系统、角度计算、距离公式
  4. 生物模拟:蚂蚁行为模拟、生态系统基础

扩展建议

  1. 添加更多蚂蚁行为(信息素追踪、分工合作)
  2. 实现障碍物系统
  3. 添加天气或季节变化影响
  4. 创建更复杂的食物链
  5. 添加统计图表显示蚂蚁行为数据

这个项目适合8-12岁的少儿学习编程,通过有趣的模拟帮助他们理解编程概念和生物行为。您可以根据学生的水平调整代码复杂度。

Logo

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

更多推荐