Python.Middle: Игра «Волк и яйца»

В игре 7 файлов:

  1. WEConf.py | Файл конфигурации
class WEConf:
    scWidth = 400 # ширина окна
    scHeight = 600 # высота окна
    white = (255,255,255) # белый цвет
    black = (0, 0, 0) # чёрный цвет
    red = (255,0,0) # красный цвет
    clock = 60 # частота обновления игры/экрана

2. CollObject.py | Файл для Абстрактного класса Colladable Object, который содержит все ОБЩИЕ методы для всех участников игрового процесса, которые должны взаимодействовать (создавать коллизии)

from WEConf import WEConf as conf
class CollObject():
# основные ПОЛЯ (СВОЙСТВА) объекта для коллизий: 
# координата нуля объекта и
# ширина(width) с высотой(height)
    x = 0
    y = 0
    h = 0
    w = 0
# Дальше идут МЕТОДЫ класса

    def collide(self, collObject): # проверка коллизии с другим объектом
        return collObject.y + collObject.h > self.y and collObject.x + collObject.w > self.x and collObject.x < self.x + collObject.w
    
    def getParams(self): # получение основных СВОЙСТВ объекта в виде кортежа ()
        return (self.x, self.y, self.w, self.h)
    
    def checkRight(self): # проверка с пересечением экрана справа
        return self.x < conf.scWidth - self.w

    def checkLeft(self):# проверка с пересечением экрана слева
        return self.x > 0
    
    def checkBott(self):# проверка с пересечением экрана снизу
        return self.y > conf.scHeight

3. Player.py | EggКласс Игрока

from CollObject import CollObject
from WEConf import WEConf as conf

class Player(CollObject):
    def __init__(self): # конструктор
        self.w = 50
        self.h = 50
        self.x = conf.scWidth/2 - self.w/2
        self.y = conf.scHeight - self.h
        self.playerSpeed = 5

    def moveLeft(self): # движение влево
        if self.checkLeft():
            self.x -= self.playerSpeed
            
    def moveRight(self): # движение вправо
        if self.checkRight():
            self.x += self.playerSpeed

4. Egg.py | Класс «Яйца»

from CollObject import CollObject
from WEConf import WEConf as conf
import random

class Egg(CollObject):
    def __init__(self):
        self.w = 30
        self.h = 30
        self.eggSpeed = 3

    def move(self):
        self.y += self.eggSpeed
    
    def spawn(self): # рождение/перерождение объекта
        self.x = random.randint(0,conf.scWidth-self.w)
        self.y = 0
        self.eggSpeed += 0.1

    def borderTouch(self):
        if self.checkBott():
            self.spawn()
            return True

5. Counters.py | Файл со счётом

class Counters: # просто класс, держащий одно поле(свойство) со счётом. 
    score = 0

6. WEGame.py | Самый большой файл — контроллер игры(сама игра), который отвечает за все события, которые происходят в Игре

import pygame
from WEConf import WEConf as conf
from Player import Player
from Egg import Egg
from Counters import Counters

class WEGame():
    def __init__(self):
        pygame.init()
        self.clock = pygame.time.Clock()
        self.screen = pygame.display.set_mode((conf.scWidth, conf.scHeight))
        pygame.display.set_caption("Волк и яйца")

        self.font = pygame.font.SysFont(None,30)
        self.counters = Counters()
        self.player = Player()
        self.egg = Egg()
        self.egg.spawn()
        self.isRunning = True

    def updateScene(self):
        self.screen.fill(conf.white)
        pygame.draw.rect(self.screen, conf.black, self.player.getParams())
        pygame.draw.ellipse(self.screen, conf.red, self.egg.getParams())
        scoreText = self.font.render("Счёт: " + str(self.counters.score), True, conf.black)
        self.screen.blit(scoreText, (10,10) )
        pygame.display.update()
        self.clock.tick(conf.clock)

    def run(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT or ( event.type == pygame.KEYDOWN and 
                                            event.key == pygame.K_ESCAPE ):
                self.isRunning = False

        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.player.moveLeft()

        if keys[pygame.K_RIGHT]:
            self.player.moveRight()
        
        self.egg.move()

        if self.player.collide(self.egg):
            self.egg.spawn()
            self.counters.score += 1
        
        if self.egg.borderTouch():
            self.egg.spawn()
            self.counters.score -= 1

    def startRun(self):
        while self.isRunning:
            self.updateScene()
            self.run()
        pygame.quit()    

7. main.py | Точка входа в Игру (запускаемый файл)

from WEGame import WEGame

if __name__ == "__main__":
    game = WEGame()
    game.startRun()

Архив со всем файлами: