Узнайте, как написать фермерский симулятор на Python с Pygame за один день. Полный разбор кода и механик. Попробуйте сами!
Вы когда-нибудь мечтали создать свою версию Harvest Moon? Или просто хотите прокачать навыки геймдева на Python? В этой статье я покажу, как за один день (от рассвета до заката) построить полноценный фермерский симулятор с динамическим небом, циклом роста культур и экономикой. Мы используем Pygame и скомпилируем игру в WebAssembly, чтобы её можно было запустить в браузере.
В основе лежит игровой цикл Pygame, который обрабатывает события, обновляет состояние и рендерит кадры. Вся логика завязана на времени: у вас есть ровно один игровой день. Чем ближе к закату, тем быстрее растут культуры, а собранные в «золотой час» дают двойную прибыль.
Давайте разберём код самых важных частей. Все примеры рабочие и снабжены комментариями.
import pygame
import sys
# Инициализация Pygame
pygame.init()
screen = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()
# Время: от 0 (рассвет) до 1000 (закат)
game_time = 0
MAX_TIME = 1000
SPEED = 0.1 # скорость течения времени
def update_time():
global game_time
game_time += SPEED
if game_time >= MAX_TIME:
game_time = MAX_TIME # день кончился
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
update_time()
# Отрисовка и обновление объектов
pygame.display.flip()
clock.tick(60)def get_sky_color(time):
# От оранжевого рассвета до синего полудня и красного заката
if time < 200:
# Рассвет: оранжевый -> голубой
t = time / 200
r = int(255 * (1 - t) + 135 * t)
g = int(150 * (1 - t) + 206 * t)
b = int(50 * (1 - t) + 235 * t)
elif time < 600:
# Полдень: голубой
r, g, b = 135, 206, 235
else:
# Закат: голубой -> красный
t = (time - 600) / 400
r = int(135 * (1 - t) + 255 * t)
g = int(206 * (1 - t) + 100 * t)
b = int(235 * (1 - t) + 50 * t)
return (r, g, b)
# В игровом цикле:
screen.fill(get_sky_color(game_time))class Crop:
def __init__(self, x, y, growth_time=300):
self.x = x
self.y = y
self.growth = 0 # от 0 до 1
self.growth_time = growth_time # время полного роста
self.harvested = False
def update(self, time_speed):
if not self.harvested and self.growth < 1:
self.growth += time_speed / self.growth_time
if self.growth >= 1:
self.growth = 1
def is_ready(self):
return self.growth >= 1 and not self.harvested
def harvest(self):
if self.is_ready():
self.harvested = True
return True
return False
# В основном цикле:
for crop in crops:
crop.update(SPEED)def calculate_price(crop, game_time):
base_price = 10
# Золотой час: последние 10% дня
if game_time >= 0.9 * MAX_TIME:
return base_price * 2
return base_price
# При продаже:
if crop.harvest():
gold += calculate_price(crop, game_time)Чтобы игра работала в браузере без установки Python, используем Pygbag. Это инструмент, который компилирует Pygame-приложение в WebAssembly.
# Установка
pip install pygbag
# Сборка
pygbag --build your_game_directory
# Результат в папке build/webЗатем загружаем содержимое на Vercel или любой хостинг статики.
1. Установите Pygame: pip install pygame
2. Скопируйте приведённые куски кода в один файл и запустите — вы увидите меняющееся небо.
3. Добавьте спрайты и тайлы — используйте бесплатные ресурсы из OpenGameArt.
4. Реализуйте полный цикл: вспашка -> посадка -> полив -> сбор -> продажа.
5. Скомпилируйте через Pygbag и поделитесь ссылкой на игру!
Мы разобрали, как создать фермерский симулятор на Python с Pygame за один день. Главные выводы: используйте время как основной ресурс, динамическое небо добавляет атмосферы, а Pygbag позволяет запустить игру в браузере. Попробуйте написать свою версию и поделитесь результатом!
Хочешь закрепить знания на практике?
Решай задачи на Algolit — интерактивная платформа для обучения
Начать бесплатно →