πŸπŸ•ΉοΈπŸΈ Python + Pygame = Amazing Frogs: создаСм ΠΊΡ€ΡƒΡ‚ΡƒΡŽ Π³ΠΎΠ»ΠΎΠ²ΠΎΠ»ΠΎΠΌΠΊΡƒ

Π“ΠΎΡ‚ΠΎΠ² ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈΠ³Ρ€Ρƒ, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅ ΠΎΡ‚ΠΎΡ€Π²Π΅ΡˆΡŒΡΡ? Π”Π°Π²Π°ΠΉ вмСстС сдСлаСм Amazing Frogs – ΡƒΠ±ΠΈΠΉΡ†Ρƒ ВСтриса Π½Π° Python! Π’ΡƒΡ‚ Ρ‚Π΅Π±Π΅ ΠΈ ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈ, ΠΈ Π²Π·Ρ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Ρ†Π²Π΅Ρ‚Π°, ΠΈ хитрая ΠΌΠ΅Ρ…Π°Π½ΠΈΠΊΠ°. Запасайся ΠΊΠΎΡ„Π΅, ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΠΉ IDE, ΠΈ ΠΏΠΎΠ΅Ρ…Π°Π»ΠΈ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π² ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ΅ Π±Π΅Π·ΡƒΠΌΠΈΠ΅!

Π›ΠΎΠ³ΠΈΠΊΠ° ΠΈΠ³Ρ€Ρ‹

Amazing Frogs – ΠΊΠ»ΠΎΠ½ популярной Π²ΠΈΠ½Ρ‚Π°ΠΆΠ½ΠΎΠΉ ΠΈΠ³Ρ€Ρ‹ Amazing Blocks:

Amazing Blocks ΠΈ Amazing Frogs

Amazing Blocks – Π»ΡŽΠ±ΠΎΠΏΡ‹Ρ‚Π½Ρ‹ΠΉ кроссовСр ΠΌΠ΅ΠΆΠ΄Ρƒ Π»Π΅Π³Π΅Π½Π΄Π°Ρ€Π½Ρ‹ΠΌ ΠΏΡ€Π°Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΌ всСх Π±Π»ΠΎΡ‡Π½Ρ‹Ρ… Π³ΠΎΠ»ΠΎΠ²ΠΎΠ»ΠΎΠΌΠΎΠΊ ВСтрисом ΠΈ ΠΆΠ°Π½Ρ€ΠΎΠΌ Β«Π’Ρ€ΠΈ Π² ряд»:

  • Π€ΠΈΠ³ΡƒΡ€Ρ‹ состоят ΠΈΠ· Ρ‚Ρ€Π΅Ρ… элСмСнтов (Ρ‚Ρ€ΠΈΠΌΠΈΠ½ΠΎ) вмСсто Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… (Ρ‚Π΅Ρ‚Ρ€Π°ΠΌΠΈΠ½ΠΎ).
  • Π’Ρ€ΠΈΠΌΠΈΠ½ΠΎ Π½Π΅ ΠΏΠΎΠ²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π²ΠΎΠΊΡ€ΡƒΠ³ своСй оси – вмСсто этого ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ мСстами Ρ†Π²Π΅Ρ‚Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ΠΈ состоят. Π‘Ρ‹Π²Π°ΡŽΡ‚ ΠΈ ΠΎΠ΄Π½ΠΎΡ†Π²Π΅Ρ‚Π½Ρ‹Π΅ Ρ‚Ρ€ΠΈΠΌΠΈΠ½ΠΎ.
ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ клавиши ↑ Π±Π»ΠΎΠΊΠΈ ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ мСстами
  • Π‘Π»ΠΎΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚Π΄Π΅Π»ΡΡ‚ΡŒΡΡ ΠΎΡ‚ Ρ‚Ρ€ΠΈΠΌΠΈΠ½ΠΎ, Ссли ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ Π΄Π²Π° Π±Π»ΠΎΠΊΠ° ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ с прСпятствиСм. ΠžΡΡ‚Π°Π²ΡˆΠ°ΡΡΡ Ρ‡Π°ΡΡ‚ΡŒ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅.
  • ВмСсто сгорания Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Ρ… Π»ΠΈΠ½ΠΈΠΉ ΡΠ³ΠΎΡ€Π°ΡŽΡ‚ оказавшиСся ΠΏΠΎ сосСдству 3 ΠΈ Π±ΠΎΠ»Π΅Π΅ Π±Π»ΠΎΠΊΠΎΠ² ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π°. ΠŸΡ€ΠΈ этом сосСдство опрСдСляСтся ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ, Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ ΠΈ ΠΎΠ±Π΅ΠΈΠΌ диагоналям (справа Π½Π°Π»Π΅Π²ΠΎ ΠΈ слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ).
Amazing Frogs повторяСт всю Π±Π°Π·ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π°

ΠžΡΡ‚Π°Π»ΡŒΠ½Π°Ρ Π»ΠΎΠ³ΠΈΠΊΠ° Amazing Frogs стандартна:

  • ΠŸΡ€ΠΈ Π½Π°Π±ΠΎΡ€Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹Ρ… 20 ΠΎΡ‡ΠΊΠΎΠ² происходит ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ, ΠΈ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ падСния Ρ„ΠΈΠ³ΡƒΡ€ увСличиваСтся.
  • Π˜Π³Ρ€Π° заканчиваСтся, ΠΊΠΎΠ³Π΄Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ Ρ„ΠΈΠ³ΡƒΡ€Π΅ Π½Π΅ΠΊΡƒΠ΄Π° ΠΏΠ°Π΄Π°Ρ‚ΡŒ.
  • НаТатиС ↓ сбрасываСт Ρ‚Ρ€ΠΈΠΌΠΈΠ½ΠΎ Π²Π½ΠΈΠ·, ΠΏΡ€ΠΎΠ±Π΅Π» ставит ΠΈΠ³Ρ€Ρƒ Π½Π° ΠΏΠ°ΡƒΠ·Ρƒ, Π° Esc ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π²Ρ‹Ρ…ΠΎΠ΄Ρƒ.
🐍 Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° питониста
Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° питониста»
πŸπŸŽ“ Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Python для собСса
ΠŸΠΎΠ΄Ρ‚ΡΠ½ΡƒΡ‚ΡŒ свои знания ΠΏΠΎ Python Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Python для собСса»
🐍🧩 Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ Python
Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎ Python для ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ PythonΒ»

Π’Π½Π΅ΡˆΠ½ΠΈΠΉ Π²ΠΈΠ΄ ΠΈ основныС настройки ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°

Окно ΠΈΠΌΠ΅Π΅Ρ‚ фиксированный Ρ€Π°Π·ΠΌΠ΅Ρ€ 450x600, Π° ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ прСдставляСт собой сСтку 6x12 ΠΊΠ»Π΅Ρ‚ΠΎΠΊ. Π‘Π»ΠΎΠΊΠΈ Ρ‚Ρ€ΠΈΠΌΠΈΠ½ΠΎ состоят ΠΈΠ· Π΄Π²ΡƒΡ… ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… элСмСнтов 50Ρ…50, слСгка Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΡ…ΡΡ ΠΏΠΎ яркости (для создания 2,5-эффСкта), ΠΈ ΠΏΠΎΠ»ΡƒΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΠ³ΠΎ png-изобраТСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ Π΄ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° 20Ρ…20 с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ сглаТивания:

import pygame
import random

pygame.init()
WIDTH, HEIGHT = 450, 600 
CELL_SIZE = 50  
GRID_WIDTH = 6  
GRID_HEIGHT = 12  
COLORS = [(0, 0, 225), (0, 225, 0), (225, 0, 0), (225, 225, 0)]
LIGHT_COLORS = [(30, 30, 255), (50, 255, 50), (255, 30, 30), (255, 255, 30)]
png_image = pygame.image.load('frog.png')
png_image = pygame.transform.smoothscale(png_image, (20, 20))
png_image.set_alpha(128)
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Amazing Frogs")

ΠšΠ»Π°ΡΡΡ‹ Block ΠΈ Trimino

Π­Ρ‚ΠΈ классы – ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ элСмСнты ΠΈΠ³Ρ€Ρ‹: Block управляСт ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Π±Π»ΠΎΠΊΠΎΠ², Π° Trimino опрСдСляСт ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ состоящих ΠΈΠ· Π±Π»ΠΎΠΊΠΎΠ² Ρ„ΠΈΠ³ΡƒΡ€ – Ρ‚Ρ€ΠΈΠΌΠΈΠ½ΠΎ.

Block обСспСчиваСт отрисовку Π±Π»ΠΎΠΊΠΎΠ², Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ (Π²ΠΏΡ€Π°Π²ΠΎ/Π²Π»Π΅Π²ΠΎ) ΠΈ ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΎΠ² (ΠΊΠ°ΠΊ ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, Π±Π»ΠΎΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ послС раздСлСния Ρ‚Ρ€ΠΈΠΌΠΈΠ½ΠΎ):

class Block:
    def __init__(self, x, y, color):
        self.x = x
        self.y = y
        self.color = color
        self.stopped = False  
    
    def fall(self):
        if not self.stopped:
            self.y += 1
    
    def move_left(self, grid):
        if not self.stopped and self.x > 0 and not grid[self.y][self.x - 1]:
            self.x -= 1
    
    def move_right(self, grid):
        if not self.stopped and self.x < GRID_WIDTH - 1 and not grid[self.y][self.x + 1]:
            self.x += 1

    def draw(self, screen):
        color_index = COLORS.index(self.color)
        light_color = LIGHT_COLORS[color_index]      
        pygame.draw.rect(screen, self.color, (self.x * CELL_SIZE + 1, self.y * CELL_SIZE + 1, CELL_SIZE - 1, CELL_SIZE - 1), 0, 3)     
        pygame.draw.rect(screen, light_color, (self.x * CELL_SIZE + 3, self.y * CELL_SIZE + 3, CELL_SIZE - 6, CELL_SIZE - 6), 0, 3)       
        png_pos = (self.x * CELL_SIZE + (CELL_SIZE // 2 - 10), self.y * CELL_SIZE + (CELL_SIZE // 2 - 10))  
        screen.blit(png_image, png_pos)

Trimino обСспСчиваСт Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Ρ€ΠΈΠΌΠΈΠ½ΠΎ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Ρ†Π²Π΅Ρ‚Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ², управляСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ΠΌ всСх Π±Π»ΠΎΠΊΠΎΠ² сразу (ΠΊΠ°ΠΊ Ρ†Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹), ΠΈ измСняСт окраску элСмСнтов, которая внСшнС выглядит, ΠΊΠ°ΠΊ пСрСстановка Π±Π»ΠΎΠΊΠΎΠ² Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹:

class Trimino:
    def __init__(self):
        self.blocks = [
            Block(GRID_WIDTH // 2 - 1, 0, random.choice(COLORS)),
            Block(GRID_WIDTH // 2, 0, random.choice(COLORS)),
            Block(GRID_WIDTH // 2 + 1, 0, random.choice(COLORS)),
        ]
    
    def rotate_colors(self):        
        colors = [block.color for block in self.blocks]
        colors = [colors[-1]] + colors[:-1]
        for i in range(3):
            self.blocks[i].color = colors[i]
    
    def fall(self):
        for block in self.blocks:
            block.fall()

    def move_left(self, grid):
        if all(block.x > 0 and not grid[block.y][block.x - 1] for block in self.blocks):
            for block in self.blocks:
                block.move_left(grid)

    def move_right(self, grid):
        if all(block.x < GRID_WIDTH - 1 and not grid[block.y][block.x + 1] for block in self.blocks):
            for block in self.blocks:
                block.move_right(grid)

    def drop_down(self, grid):        
        while all(not block.stopped and not self.check_collision(block, grid) for block in self.blocks):
            self.fall()

    def check_collision(self, block, grid):
        if block.y >= GRID_HEIGHT - 1:
            return True
        if grid[block.y + 1][block.x]:
            return True
        return False

    def draw(self, screen):
        for block in self.blocks:
            block.draw(screen)

Оба класса Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ с сСткой (grid), которая прСдставляСт собой Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив, ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΎΠ² Π½Π° ΠΏΠΎΠ»Π΅. Π­Ρ‚ΠΎ позволяСт Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ столкновСний (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для остановки падСния) ΠΈ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΎΠ² Π²Π»Π΅Π²ΠΎ ΠΈΠ»ΠΈ Π²ΠΏΡ€Π°Π²ΠΎ.

Окно Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΈΠ³Ρ€Ρ‹

Если ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ заполняСтся Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ Ρ„ΠΈΠ³ΡƒΡ€Π΅ Π½Π΅ΠΊΡƒΠ΄Π° ΠΏΠ°Π΄Π°Ρ‚ΡŒ, ΠΈΠ³Ρ€Π° заканчиваСтся: Π½Π° экранС ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄Π²Π΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ – «Новая ΠΈΠ³Ρ€Π°Β» ΠΈ Β«Π’Ρ‹ΠΉΡ‚ΠΈΒ». Π—Π° Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΈ ΠΊΠ»ΠΈΠΊΠΈ ΠΏΠΎ Π½ΠΈΠΌ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ класс Button:

class Button:
    def __init__(self, x, y, width, height, text, color, text_color):
        self.rect = pygame.Rect(x, y, width, height)
        self.text = text
        self.color = color
        self.text_color = text_color
        self.font = pygame.font.Font('MOSCOW2024.otf', 16)

    def draw(self, screen):
        pygame.draw.rect(screen, self.color, self.rect)
        text_surface = self.font.render(self.text, True, self.text_color)
        text_rect = text_surface.get_rect(center=self.rect.center)
        screen.blit(text_surface, text_rect)

    def is_clicked(self, pos):
        return self.rect.collidepoint(pos)

Класс Game

Π­Ρ‚ΠΎΡ‚ класс Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ всю ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΈΠ³Ρ€Ρ‹, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ‚Ρ€ΠΈΠΌΠΈΠ½ΠΎ, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ состояния ΠΈΠ³Ρ€Ρ‹, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ столкновСний ΠΈ отрисовку. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Game:

  • reset_game – сбрасываСт ΠΈΠ³Ρ€Ρƒ Π΄ΠΎ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ состояния. Π‘ΠΎΠ·Π΄Π°Π΅Ρ‚ Π½ΠΎΠ²ΡƒΡŽ сСтку, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚Ρ€ΠΈΠΌΠΈΠ½ΠΎ, обнуляСт статистику ΠΈ настройки.
  • check_collision – провСряСт, столкнулся Π»ΠΈ Π±Π»ΠΎΠΊ с Π½ΠΈΠΆΠ½Π΅ΠΉ Π³Ρ€Π°Π½ΠΈΡ†Π΅ΠΉ сСтки ΠΈΠ»ΠΈ с Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π±Π»ΠΎΠΊΠΎΠΌ. Если Π±Π»ΠΎΠΊ достиг Π½ΠΈΠ·Π° ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ Π½ΠΈΠΌ Π΅ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π±Π»ΠΎΠΊ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ True.
  • lock_trimino – ΠΊΠΎΠ³Π΄Π° Ρ‚Ρ€ΠΈΠΌΠΈΠ½ΠΎ пСрСстаСт Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ, Π΅Π³ΠΎ Π±Π»ΠΎΠΊΠΈ Ρ„ΠΈΠΊΡΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² сСткС, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ†Π²Π΅Ρ‚ Π±Π»ΠΎΠΊΠΎΠ² сохраняСтся Π² массивС grid. Π—Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ΡΡ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Π΅ Π»ΠΈΠ½ΠΈΠΈ (ΠΌΠ΅Ρ‚ΠΎΠ΄ check_lines), ΠΈ Ссли Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ряду ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈ, ΠΈΠ³Ρ€Π° заканчиваСтся.
  • draw_next_trimino – ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΠΈΠ³ΡƒΡ€Ρƒ Π² ΠΏΠ°Π½Π΅Π»ΠΈ статистики справа.
  • find_matches – ΠΈΡ‰Π΅Ρ‚ совпадСния Ρ†Π²Π΅Ρ‚ΠΎΠ² Π±Π»ΠΎΠΊΠΎΠ² Π² сСткС ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ, Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ ΠΈ диагоналям (Ссли Ρ‚Ρ€ΠΈ ΠΈ Π±ΠΎΠ»Π΅Π΅ Π±Π»ΠΎΠΊΠΎΠ² ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π° стоят рядом).
  • remove_matches – удаляСт Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Π΅ совпадСния ΠΈΠ· сСтки ΠΈ сдвигаСт Π±Π»ΠΎΠΊΠΈ Π²Ρ‹ΡˆΠ΅ Π²Π½ΠΈΠ·, заполняя пустыС мСста, послС Ρ‡Π΅Π³ΠΎ обновляСтся статистика.
  • level_up – ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΈΠ³Ρ€Ρ‹, Ссли Π±Ρ‹Π»ΠΎ ΡƒΠ΄Π°Π»Π΅Π½ΠΎ достаточно Π±Π»ΠΎΠΊΠΎΠ², послС Ρ‡Π΅Π³ΠΎ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ΡΡ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ падСния Π±Π»ΠΎΠΊΠΎΠ².
  • update – обновляСт состояниС ΠΈΠ³Ρ€Ρ‹, заставляя Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Ρ‚Ρ€ΠΈΠΌΠΈΠ½ΠΎ ΠΏΠ°Π΄Π°Ρ‚ΡŒ ΠΈ провСряя столкновСния. Если всС Π±Π»ΠΎΠΊΠΈ Ρ‚Ρ€ΠΈΠΌΠΈΠ½ΠΎ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»ΠΈΡΡŒ, ΠΎΠ½ΠΈ Ρ„ΠΈΠΊΡΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½Π° ΠΏΠΎΠ»Π΅, послС Ρ‡Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ΡΡ Π»ΠΈΠ½ΠΈΠΈ (check_lines) Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ 3 ΠΈ Π±ΠΎΠ»Π΅Π΅ Π±Π»ΠΎΠΊΠΎΠ² ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π°, располоТСнных рядом.
  • draw – отрисовываСт Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Ρ‚Ρ€ΠΈΠΌΠΈΠ½ΠΎ ΠΈ всС Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ Π½Π° сСткС. Π’Π°ΠΊΠΆΠ΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ статистику (счСт, ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ) ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚Ρ€ΠΈΠΌΠΈΠ½ΠΎ, Π° Ссли ΠΈΠ³Ρ€Π° ΠΎΠΊΠΎΠ½Ρ‡Π΅Π½Π°, Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΎΠΊΠ½ΠΎ с ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ «Новая ΠΈΠ³Ρ€Π°Β» ΠΈ Β«Π’Ρ‹ΠΉΡ‚ΠΈΒ».
class Game:
    def __init__(self):
        self.reset_game()
        self.font = pygame.font.Font('MOSCOW2024.otf', 15)  
        self.font_color = (255, 255, 255)
        self.restart_button = Button(WIDTH // 2 - 105, HEIGHT // 2 + 50, 130, 40, "Новая ΠΈΠ³Ρ€Π°", (0, 255, 0), (0, 0, 0))
        self.exit_button = Button(WIDTH // 2 + 45, HEIGHT // 2 + 50, 80, 40, "Π’Ρ‹ΠΉΡ‚ΠΈ", (255, 0, 0), (255, 255, 255))

    def reset_game(self):
        self.grid = [[None for _ in range(GRID_WIDTH)] for _ in range(GRID_HEIGHT)]
        self.current_trimino = Trimino()
        self.next_trimino = Trimino()  
        self.game_over = False
        self.fall_time = 0
        self.fall_speed = 500
        self.score = 0
        self.level = 1
        self.blocks_burned = 0

    def check_collision(self, block):
        if block.y >= GRID_HEIGHT - 1:
            return True
        if self.grid[block.y + 1][block.x]:
            return True
        return False

    def lock_trimino(self):
        for block in self.current_trimino.blocks:
            self.grid[block.y][block.x] = block.color
        self.check_lines()

        if any(self.grid[0][x] is not None for x in range(GRID_WIDTH)):
            self.game_over = True
        else:
            self.current_trimino = self.next_trimino
            self.next_trimino = Trimino()  

    def draw_next_trimino(self, screen):
        next_area_x = WIDTH - 140
        next_area_y = 280

        for i, block in enumerate(self.next_trimino.blocks):
            original_x, original_y = block.x, block.y
            block.x = (next_area_x // CELL_SIZE) + i 
            block.y = next_area_y // CELL_SIZE + 1    
            block.draw(screen) 
            block.x, block.y = original_x, original_y

    def find_matches(self):
        to_remove = set()

        for y in range(GRID_HEIGHT):
            for x in range(GRID_WIDTH - 2):
                if self.grid[y][x] and self.grid[y][x] == self.grid[y][x + 1] == self.grid[y][x + 2]:
                    to_remove.update([(y, x), (y, x + 1), (y, x + 2)])

        for x in range(GRID_WIDTH):
            for y in range(GRID_HEIGHT - 2):
                if self.grid[y][x] and self.grid[y][x] == self.grid[y + 1][x] == self.grid[y + 2][x]:
                    to_remove.update([(y, x), (y + 1, x), (y + 2, x)])

        for y in range(GRID_HEIGHT - 2):
            for x in range(GRID_WIDTH - 2):
                if self.grid[y][x] and self.grid[y][x] == self.grid[y + 1][x + 1] == self.grid[y + 2][x + 2]:
                    to_remove.update([(y, x), (y + 1, x + 1), (y + 2, x + 2)])
                if self.grid[y][x + 2] and self.grid[y][x + 2] == self.grid[y + 1][x + 1] == self.grid[y + 2][x]:
                    to_remove.update([(y, x + 2), (y + 1, x + 1), (y + 2, x)])

        return to_remove

    def remove_matches(self, to_remove):
        for x in range(GRID_WIDTH):
            col_blocks = [(y, x) for y, cx in to_remove if cx == x]
            col_blocks.sort(reverse=True)  

            for y, _ in col_blocks:
                for row in range(y, 0, -1):
                    self.grid[row][x] = self.grid[row - 1][x]
                self.grid[0][x] = None  

        burned_blocks = len(to_remove)
        self.blocks_burned += burned_blocks
        self.score += burned_blocks
        if self.blocks_burned >= 20:
            self.level_up()

    def level_up(self):
        self.level += 1
        self.blocks_burned = 0
        self.fall_speed = max(100, self.fall_speed - 50)  

    def check_lines(self):
        to_remove = self.find_matches()
        while to_remove:
            self.remove_matches(to_remove)
            to_remove = self.find_matches()  

    def update(self):
        if self.game_over:
            return  
        
        current_time = pygame.time.get_ticks()
        if current_time - self.fall_time > self.fall_speed:
            self.fall_time = current_time
            for block in self.current_trimino.blocks:
                if not block.stopped and self.check_collision(block):
                    block.stopped = True

            if all(block.stopped for block in self.current_trimino.blocks):
                self.lock_trimino()  
                self.check_lines()  
            else:
                self.current_trimino.fall()

    def draw(self, screen):
        if not self.game_over:
            self.current_trimino.draw(screen)

            for y in range(GRID_HEIGHT):
                for x in range(GRID_WIDTH):
                    if self.grid[y][x]:
                        block = Block(x, y, self.grid[y][x])
                        block.draw(screen)

            stats_background_color = (50, 50, 50)  
            stats_rect = pygame.Rect(WIDTH - 150, 0, 150, HEIGHT)  
            pygame.draw.rect(screen, stats_background_color, stats_rect)  
            score_text = self.font.render(f"Π‘Ρ‡Π΅Ρ‚: {self.score}", True, self.font_color)
            level_text = self.font.render(f"Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ: {self.level}", True, self.font_color)
            next_text = self.font.render("Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ:", True, self.font_color)
            pause_text = self.font.render("ΠŸΠ°ΡƒΠ·Π°: ΠΏΡ€ΠΎΠ±Π΅Π»", True, self.font_color)
            esc_text = self.font.render("Π’Ρ‹Ρ…ΠΎΠ΄: Esc", True, self.font_color)
            screen.blit(score_text, (WIDTH - 140, 20))
            screen.blit(level_text, (WIDTH - 140, 60))
            screen.blit(next_text, (WIDTH - 140, 250))
            screen.blit(pause_text, (WIDTH - 140, 400))
            screen.blit(esc_text, (WIDTH - 140, 450))
            self.draw_next_trimino(screen)
        else:
            screen.fill((0, 0, 0))
            text = self.font.render("Π˜Π³Ρ€Π° Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π°", True, (255, 0, 0))
            text_rect = text.get_rect(center=(WIDTH // 2, HEIGHT // 2))
            screen.blit(text, text_rect)
            self.restart_button.draw(screen)
            self.exit_button.draw(screen)     

Основной ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ Ρ†ΠΈΠΊΠ» ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° событий

Π—Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π° ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° основной ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ Ρ†ΠΈΠΊΠ», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ происходят ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° событий, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ состояния ΠΈΠ³Ρ€Ρ‹, отрисовка ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° экранС ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΡƒΠ·Π°ΠΌΠΈ:

  • clock = pygame.time.Clock() – ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для контроля частоты обновлСния ΠΈΠ³Ρ€Ρ‹ (FPS).
  • running = True – пСрСмСнная-Ρ„Π»Π°Π³ для основного Ρ†ΠΈΠΊΠ»Π° ΠΈΠ³Ρ€Ρ‹, ΠΏΠΎΠΊΠ° ΠΎΠ½Π° True, Ρ†ΠΈΠΊΠ» продолТаСтся. Π’Π½ΡƒΡ‚Ρ€ΠΈ этого Ρ†ΠΈΠΊΠ»Π° происходит всС взаимодСйствиС с ΠΈΠ³Ρ€ΠΎΠΊΠΎΠΌ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ³Ρ€Ρ‹.
  • paused = False – пСрСмСнная для отслСТивания, поставлСна Π»ΠΈ ΠΈΠ³Ρ€Π° Π½Π° ΠΏΠ°ΡƒΠ·Ρƒ.
  • ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° событий for event in pygame.event.get(). Π—Π΄Π΅ΡΡŒ происходит ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ события (Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ клавиш ΠΈΠ»ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΎΠΊΠ½Π°).
game = Game()
clock = pygame.time.Clock()
running = True
paused = False

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                running = False
            elif event.key == pygame.K_SPACE and not game.game_over:
                paused = not paused
            elif not paused and not game.game_over:
                if event.key == pygame.K_LEFT:
                    game.current_trimino.move_left(game.grid)
                elif event.key == pygame.K_RIGHT:
                    game.current_trimino.move_right(game.grid)
                elif event.key == pygame.K_UP:
                    game.current_trimino.rotate_colors()
                elif event.key == pygame.K_DOWN:
                    game.current_trimino.drop_down(game.grid)
        elif event.type == pygame.MOUSEBUTTONDOWN and game.game_over:
            if game.restart_button.is_clicked(event.pos):
                game.reset_game()
            elif game.exit_button.is_clicked(event.pos):
                running = False

    screen.fill((0, 0, 0))
    if not paused and not game.game_over:
        game.update()
    game.draw(screen)
    if paused:
        font = pygame.font.Font('MOSCOW2024.otf', 20)
        text = font.render("НаТмитС ΠΏΡ€ΠΎΠ±Π΅Π» для продолТСния", True, (255, 255, 255))
        text_rect = text.get_rect(center=(WIDTH // 2, HEIGHT // 2))
        screen.blit(text, text_rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

ΠŸΠΎΠ»Π½Ρ‹ΠΉ исходный ΠΊΠΎΠ΄ ΠΈΠ³Ρ€Ρ‹ находится Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Amazing Frogs.

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Pygame ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ простых логичСских ΠΈΠ³Ρ€: ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΌΠ½ΠΎΠ³ΠΈΡ… событий Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π±Π΅Ρ€Π΅Ρ‚ Π½Π° сСбя. Однако Ссли Π²Ρ‹ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ созданиС слоТной ΠΈΠ³Ρ€Ρ‹ с Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹ΠΌ интСрфСйсом, Π΅ΡΡ‚ΡŒ смысл ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Arcade ΠΈΠ»ΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ Flet, основанный Π½Π° Flutter.

***

Python: ΠΎΡ‚ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ° Π΄ΠΎ junior-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°

Π₯ΠΎΡ‡Π΅ΡˆΡŒ ΠΎΡΠ²ΠΎΠΈΡ‚ΡŒ Python ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ свой ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚? Наш курс ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ пошаговоС ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚ основ Π΄ΠΎ создания Π±ΠΎΡ‚ΠΎΠ² ΠΈ парсСров, с ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ связью ΠΎΡ‚ экспСртов.

  • 90+ часов обучСния
  • 4 ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° для ΠΏΠΎΡ€Ρ‚Ρ„ΠΎΠ»ΠΈΠΎ
  • Π Π°Π±ΠΎΡ‚Π° с PyCharm ΠΈ Jupyter Notebook
  • ΠžΡΠ½ΠΎΠ²Ρ‹ ООП ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ²
  • Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π±ΠΎΡ‚ΠΎΠ² для Telegram ΠΈ Instagram
  • ΠŸΠ°Ρ€ΡΠΈΠ½Π³ Π²Π΅Π±-страниц

ΠšΡƒΡ€Ρ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊΠ°ΠΊ для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…, Ρ‚Π°ΠΊ ΠΈ для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ ΡƒΠ³Π»ΡƒΠ±ΠΈΡ‚ΡŒ свои знания. Π£Ρ‡ΠΈΡ‚Π΅ΡΡŒ Π² своСм Ρ‚Π΅ΠΌΠΏΠ΅ с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ ΠΎΠΏΡ‹Ρ‚Π½Ρ‹Ρ… ΠΏΡ€Π΅ΠΏΠΎΠ΄Π°Π²Π°Ρ‚Π΅Π»Π΅ΠΉ.

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста
16 ноября 2019

DeepFake-Ρ‚ΡƒΡ‚ΠΎΡ€ΠΈΠ°Π»: создаСм собствСнный Π΄ΠΈΠΏΡ„Π΅ΠΉΠΊ Π² DeepFaceLab

РассказываСм ΠΎ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ DeepFake ΠΈ шаг Π·Π° шагом учимся Π΄Π΅Π»Π°Ρ‚ΡŒ Π΄ΠΈΠΏΡ„Π΅ΠΉΠΊΠΈ Π² ...
admin
11 дСкабря 2018

ООП Π½Π° Python: ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python допускаСт Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΠΈ, Π½ΠΎ Π² Π΅Π³ΠΎ основС...
admin
13 фСвраля 2017

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python: ΠΎΡ‚ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ° Π΄ΠΎ профСссионала

Пошаговая инструкция для всСх, ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒΒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python...