Кликбейтить я не умею, ровно как и придумывать названия к своим проектам. Cложив пайтон и арканоид, получил pycanoid. Я выполнил свой челлендж, уложившись с изучением пайтона в 2 дня, написав простой арканоид с элементарными коллизиями. Каюсь, что не растянул это на 10 дней, но заниматься рефакторинтом пуканоида у меня не было особого желания.
application.py
import pygame as pg
#import sys;
from player import Player
from missile import Missile
from brick import Brick
class Application:
displaysize = (400,400)
@staticmethod
def update_graphics(level, missile, player, screen):
screen.fill([0,0,0])
missile.update(screen)
player.update(screen)
for brick in level:
brick.update(screen)
pg.display.update()
pg.display.flip()
@staticmethod
def update_colliders(level, missile, player, dt):
missile.position(int(missile.x + missile.speedX * dt), int(missile.y + missile.speedY * dt))
for brick in level:
if (brick.collides(missile)):
level.remove(brick)
elif(player.collides(missile)):
pass
def main(self):
player = None
screen = None
pg.init()
screen = pg.display.set_mode(Application.displaysize)
player = Player(200)
missile = Missile(200, 50)
missile.speedX = missile.speedY = 1
level = []
import random
for x in range(0, 400, 10):
for y in range(200, 400, 10):
if (random.choice([1,2]) == 1):
level.append(Brick(x,y))
while True:
dt = pg.time.Clock().tick(120)/5
for event in pg.event.get():
if event.type == pg.QUIT:
pg.quit()
return
elif event.type == pg.MOUSEMOTION:
string = str(event.pos[0])
player.position(event.pos[0],0)
Application.update_colliders(level, missile, player, dt)
Application.update_graphics(level, missile, player, screen)
Application().main();
player.py
class Player:
import pygame as pg
collider = pg.Rect(0, 0, 0, 0)
def __init__(self, x):
Player.position(self,x)
def update(self,screen):
import pygame as pg
pg.draw.rect(screen, [100,255,170], self.collider, 2)
def position(self,x,y = 0):
self.x = x
self.y = y
self.collider = [self.x, self.y, 50, 25]
def collides(self, missile):
import pygame as pg
flag = False
if (pg.Rect(self.collider).colliderect(missile.collider)):
flag = True
if (missile.y > self.collider[1]):
missile.speedY = 1
elif (missile.y > self.collider[1]):
missile.speedY = -1
return flag
brick.py
class Brick:
rgb = []
def __init__(self, x, y):
import random
Brick.position(self,x,y)
self.rgb =[random.randrange(100,255),random.randrange(100,255),random.randrange(100,255)]
pass
def update(self,screen):
import pygame as pg
pg.draw.rect(screen, self.rgb, self.collider, 1)
def position(self,x,y):
self.x = x
self.y = y
self.collider = [self.x, self.y, 10, 10]
def collides(self, missile):
import pygame as pg
flag = False
if (pg.Rect(self.collider).colliderect(missile.collider)):
flag = True
if (missile.x < self.collider[0]):
missile.speedX = -1
elif (missile.x > self.collider[0]):
missile.speedX = 1
if (missile.y > self.collider[1]):
missile.speedY = -1
elif (missile.y < self.collider[1]):
missile.speedY = 1
return flag
missile.py
class Missile:
speedX = 0
speedY = 0
import pygame as pg
collider = pg.Rect(0, 0, 0, 0)
def __init__(self, x, y):
Missile.position(self,x,y)
pass
def update(self,screen):
import pygame as pg
pg.draw.rect(screen, [255,0,0], self.collider, 2)
def check_bounds(self, x, y):
if (x >= 400 or x <= 0) :
self.speedX*=-1
if (y >= 400 or y <= 0) :
self.speedY*=-1
def position(self,x,y):
self.x = x
self.y = y
self.collider = [self.x,self.y, 2,2]
self.check_bounds(x, y)
Подведу итог: если не сидеть сложа руки и заниматься поставленными задачами, то вы добьетесь всего. Даже пуканоида за два дня.