lesson6 refactoring in oop style, add food

This commit is contained in:
2023-12-10 01:10:49 +03:00
parent e11835e6de
commit 1e8cc3a193
19 changed files with 154 additions and 64 deletions

View File

View File

@@ -0,0 +1,7 @@
class GameConfig:
pass
class SnakeConfig:
pass

View File

@@ -0,0 +1,25 @@
import os
import random
import pygame as pg
class Food:
FOOD = (
pg.image.load(os.path.join(os.curdir, 'snake', 'img', 'mouse1.png')),
pg.image.load(os.path.join(os.curdir, 'snake', 'img', 'mouse2.png'))
)
def __init__(self) -> None:
self.x = random.randint(0, 26) * 30
self.y = random.randint(0, 20) * 30
self.type = random.choice(self.FOOD)
def draw(self, screen):
screen.blit(self.type, (self.x, self.y))
def get_coords(self):
return self.x, self.y

View File

@@ -0,0 +1,89 @@
import os
import time
from random import choice
import pygame as pg
from .snake import Snake
from .food import Food
class Game:
def __init__(self) -> None:
self.screen_widht = 780
self.screen_hight = 600
self.clock = pg.time.Clock()
pg.font.init()
self.font = pg.font.SysFont(choice(pg.font.get_fonts()), 72)
self.score = 0
self.title = 'Snakessss'
self.done = False
self.bg = pg.image.load(os.path.join(os.curdir, 'snake', 'img', 'bg.png'))
self.screen = pg.display.set_mode((self.screen_widht, self.screen_hight))
self.fps = 60
def game_init(self):
pg.init()
def set_title(self):
pg.display.set_caption(self.title)
def set_bg(self):
self.screen.blit(self.bg, (0, 0))
def gameover(self):
self.done = True
surf = self.font.render('Game over', True, (20, 20, 20))
rect = surf.get_rect()
rect.midtop = (390, 250)
self.screen.blit(surf, rect)
pg.display.flip()
time.sleep(5)
pg.quit()
def mainloop():
game = Game()
snake =Snake(90, 300)
foods_array = []
def update_game_window():
while len(foods_array) < 2:
food = Food()
if food.get_coords() not in snake.get_coords():
foods_array.append(food)
for f in foods_array:
if snake.get_head_coords() == f.get_coords():
foods_array.remove(f)
snake.length += 1
game.set_bg()
snake.draw(game.screen)
for f in foods_array:
f.draw(game.screen)
pg.display.update()
if snake.impacted:
game.gameover()
while not game.done:
for event in pg.event.get():
if event.type == pg.QUIT:
game.done = True
pressed = pg.key.get_pressed()
if pressed[pg.K_UP]:
if snake.direction != 'down':
snake.direction = 'up'
if pressed[pg.K_DOWN]:
if snake.direction != 'up':
snake.direction = 'down'
if pressed[pg.K_LEFT]:
if snake.direction != 'right':
snake.direction = 'left'
if pressed[pg.K_RIGHT]:
if snake.direction != 'left':
snake.direction = 'right'
update_game_window()
game.clock.tick(game.fps)

Binary file not shown.

After

Width:  |  Height:  |  Size: 1013 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -0,0 +1,93 @@
import os
import pygame as pg
class Snake:
def __init__(self, x, y) -> None:
self.x = x
self.y = y
self.snake_head = {
'left': pg.image.load(os.path.join(os.curdir, 'snake', 'img', 'snake_left.png')),
'right': pg.image.load(os.path.join(os.curdir, 'snake', 'img', 'snake_right.png')),
'up': pg.image.load(os.path.join(os.curdir, 'snake', 'img', 'snake_up.png')),
'down': pg.image.load(os.path.join(os.curdir, 'snake', 'img', 'snake_down.png')),
}
self.snake_body = {
'h': pg.image.load(os.path.join(os.curdir, 'snake', 'img', 'body_h.png')),
'v': pg.image.load(os.path.join(os.curdir, 'snake', 'img', 'body_v.png')),
'ru_dl': pg.image.load(os.path.join(os.curdir, 'snake', 'img', 'body_ru_dl.png')),
'rd_ul': pg.image.load(os.path.join(os.curdir, 'snake', 'img', 'body_rd_ul.png')),
'lu_dr': pg.image.load(os.path.join(os.curdir, 'snake', 'img', 'body_lu_dr.png')),
'ld_ur': pg.image.load(os.path.join(os.curdir, 'snake', 'img', 'body_ld_ur.png')),
}
self.direction = 'right'
self.direction_prev = 'right'
self.length = 2
self.speed = 10 # скорость движения змейки чем меньше, тем быстрее
self.counter = 0 # Просто счетчик, для регулировки скорости нужен
self.body = [('h', 60, 300), ('h', 30, 300)]
self.impacted = False
def get_head_coords(self):
return self.x, self.y
def get_coords(self):
return [(self.x, self.y)] + [(el[1], el[2]) for el in self.body]
def draw(self, screen):
if len(self.body) > self.length:
self.body.pop()
if self.counter >= self.speed:
if self.direction == self.direction_prev:
if self.direction in ('right', 'left'):
self.body.insert(0, ('h', self.x, self.y))
else:
self.body.insert(0, ('v', self.x, self.y))
elif (self.direction_prev, self.direction) in [('right', 'up'), ('down', 'left')]:
self.body.insert(0, ('ru_dl', self.x, self.y))
elif (self.direction_prev, self.direction) in [('right', 'down'), ('up', 'left')]:
self.body.insert(0, ('rd_ul', self.x, self.y))
elif (self.direction_prev, self.direction) in [('left', 'up'), ('down', 'right')]:
self.body.insert(0, ('lu_dr', self.x, self.y))
elif (self.direction_prev, self.direction) in [('left', 'down'), ('up', 'right')]:
self.body.insert(0, ('ld_ur', self.x, self.y))
match self.direction:
case 'left':
self.x -= 30
if self.x < 0:
self.x = 750
self.direction_prev = 'left'
case 'right':
self.x += 30
if self.x > 750:
self.x = 0
self.direction_prev = 'right'
case 'up':
self.y -= 30
if self.y < 0:
self.y = 570
self.direction_prev = 'up'
case 'down':
self.y += 30
if self.y > 570:
self.y = 0
self.direction_prev = 'down'
if (self.x, self.y) in [(x[1], x[2]) for x in self.body]:
self.impacted = True
self.counter = 0
self.counter += 1
screen.blit(self.snake_head[self.direction], (self.x, self.y))
for el in self.body:
screen.blit(self.snake_body[el[0]], (el[1], el[2]))