Add code
parent
8509c37e6c
commit
9454eb3b24
|
@ -0,0 +1,13 @@
|
||||||
|
from point import Point
|
||||||
|
from random import randint
|
||||||
|
from settings import *
|
||||||
|
|
||||||
|
|
||||||
|
class Food(Point):
|
||||||
|
def __init__(self, x, y, pl):
|
||||||
|
Point.__init__(self, x, y)
|
||||||
|
self.pl = pl
|
||||||
|
|
||||||
|
def generate_new(self) -> None:
|
||||||
|
self.x = randint(0, WIDTH - 1)
|
||||||
|
self.y = randint(0, HEIGHT - 1)
|
|
@ -0,0 +1,54 @@
|
||||||
|
from settings import *
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
class Frame:
|
||||||
|
def __init__(self, width: int, height: int) -> None:
|
||||||
|
self.width = width
|
||||||
|
self.height = height
|
||||||
|
self.matrix = [[SPACE] * width for line in range(height)]
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
|
out_string = f"Width:\n {self.width}\n"
|
||||||
|
out_string += f"Height:\n {self.height}\n"
|
||||||
|
return out_string
|
||||||
|
|
||||||
|
def draw(
|
||||||
|
self, x: int, y: int,
|
||||||
|
value: int = WALL,
|
||||||
|
width: int = 1, height: int = 1
|
||||||
|
) -> None:
|
||||||
|
if not isinstance(value, int):
|
||||||
|
raise TypeError("Value must be int")
|
||||||
|
|
||||||
|
for line in range(height):
|
||||||
|
for column in range(width):
|
||||||
|
self.matrix[y + line][x + column] = value
|
||||||
|
|
||||||
|
def show(self) -> None:
|
||||||
|
os.system("clear||cls")
|
||||||
|
|
||||||
|
out_string = f"┍{'━' * (self.width * 2)}┑\n"
|
||||||
|
|
||||||
|
for line in self.matrix:
|
||||||
|
to_str = ''
|
||||||
|
|
||||||
|
to_str += '│'
|
||||||
|
for elem in line:
|
||||||
|
if elem == SPACE:
|
||||||
|
to_str += " "
|
||||||
|
elif elem == WALL:
|
||||||
|
to_str += "██"
|
||||||
|
elif elem == FOOD:
|
||||||
|
to_str += "@@"
|
||||||
|
elif elem == WALL_FOOD:
|
||||||
|
to_str += "@█"
|
||||||
|
to_str += '│\n'
|
||||||
|
|
||||||
|
out_string += to_str
|
||||||
|
out_string += f"┕{'━' * (self.width * 2)}┙"
|
||||||
|
|
||||||
|
print(out_string)
|
||||||
|
|
||||||
|
def see(self, x, y) -> str:
|
||||||
|
return self.matrix[y][x]
|
|
@ -0,0 +1,45 @@
|
||||||
|
# from frame import Frame
|
||||||
|
from settings import *
|
||||||
|
from player import Player
|
||||||
|
import keyboard as kb
|
||||||
|
from out import Out
|
||||||
|
|
||||||
|
|
||||||
|
class Game:
|
||||||
|
def __init__(self) -> None:
|
||||||
|
self.running = True
|
||||||
|
self.pl = Player()
|
||||||
|
self.out = Out()
|
||||||
|
|
||||||
|
kb.add_hotkey(QUIT_BUTTON, self.stop_game)
|
||||||
|
kb.add_hotkey(LEFT_BUTTON, self.pl.left)
|
||||||
|
kb.add_hotkey(RIGHT_BUTTON, self.pl.right)
|
||||||
|
kb.add_hotkey(UP_BUTTON, self.pl.up)
|
||||||
|
kb.add_hotkey(DOWN_BUTTON, self.pl.down)
|
||||||
|
|
||||||
|
def stop_game(self) -> None:
|
||||||
|
self.running = False
|
||||||
|
|
||||||
|
def update(self) -> None:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def output(self) -> None:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def play(self) -> None:
|
||||||
|
|
||||||
|
while self.running:
|
||||||
|
try:
|
||||||
|
self.pl.update()
|
||||||
|
self.out.draw(self.pl)
|
||||||
|
except IndexError as e:
|
||||||
|
self.running = False
|
||||||
|
print(e)
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> None:
|
||||||
|
Game().play()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
|
@ -0,0 +1,38 @@
|
||||||
|
from settings import *
|
||||||
|
from player import Player
|
||||||
|
from frame import Frame
|
||||||
|
|
||||||
|
|
||||||
|
class Out:
|
||||||
|
def __init__(self) -> None:
|
||||||
|
self.width = WIDTH
|
||||||
|
self.height = HEIGHT
|
||||||
|
self.fps = FPS
|
||||||
|
|
||||||
|
def draw(self, pl: Player) -> None:
|
||||||
|
frame = Frame(self.width, self.height)
|
||||||
|
|
||||||
|
for point in pl.body:
|
||||||
|
if point.x < 0 or point.y < 0:
|
||||||
|
raise IndexError("Snake has collision with walls")
|
||||||
|
elif point.x >= WIDTH or point.y >= HEIGHT:
|
||||||
|
raise IndexError("Snake has collision with walls")
|
||||||
|
|
||||||
|
frame.draw(
|
||||||
|
x=point.x, y=point.y,
|
||||||
|
value=WALL,
|
||||||
|
width=1, height=1
|
||||||
|
)
|
||||||
|
|
||||||
|
if frame.see(pl.food.x, pl.food.y) == WALL:
|
||||||
|
frame.draw(
|
||||||
|
x=pl.food.x, y=pl.food.y,
|
||||||
|
value=WALL_FOOD
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
frame.draw(
|
||||||
|
x=pl.food.x, y=pl.food.y,
|
||||||
|
value=FOOD
|
||||||
|
)
|
||||||
|
|
||||||
|
frame.show()
|
|
@ -0,0 +1,50 @@
|
||||||
|
from settings import *
|
||||||
|
from point import Point
|
||||||
|
from food import Food
|
||||||
|
from time import sleep
|
||||||
|
from itertools import permutations
|
||||||
|
|
||||||
|
|
||||||
|
class Player:
|
||||||
|
def __init__(self) -> None:
|
||||||
|
self.direction = MAIN_DIRECTION
|
||||||
|
self.body = [Point(MAIN_X, MAIN_Y)]
|
||||||
|
|
||||||
|
self.food = Food(0, 0, self)
|
||||||
|
self.food.generate_new()
|
||||||
|
|
||||||
|
def update(self) -> None:
|
||||||
|
sleep(1 / FPS)
|
||||||
|
|
||||||
|
if self.direction == D_UP:
|
||||||
|
# self.body[0].y -= 1
|
||||||
|
self.body.append(Point(self.body[-1].x, self.body[-1].y - 1))
|
||||||
|
elif self.direction == D_DOWN:
|
||||||
|
# self.body[0].y += 1
|
||||||
|
self.body.append(Point(self.body[-1].x, self.body[-1].y + 1))
|
||||||
|
elif self.direction == D_LEFT:
|
||||||
|
# self.body[0].x -= 1
|
||||||
|
self.body.append(Point(self.body[-1].x - 1, self.body[-1].y))
|
||||||
|
elif self.direction == D_RIGHT:
|
||||||
|
# self.body[0].x += 1
|
||||||
|
self.body.append(Point(self.body[-1].x + 1, self.body[-1].y))
|
||||||
|
|
||||||
|
if self.body[-1] == self.food:
|
||||||
|
self.food.generate_new()
|
||||||
|
else:
|
||||||
|
self.body.pop(0)
|
||||||
|
|
||||||
|
if len(set(self.body)) != len(self.body):
|
||||||
|
raise IndexError("Player has collision with self")
|
||||||
|
|
||||||
|
def left(self) -> None:
|
||||||
|
self.direction = D_LEFT
|
||||||
|
|
||||||
|
def right(self) -> None:
|
||||||
|
self.direction = D_RIGHT
|
||||||
|
|
||||||
|
def up(self) -> None:
|
||||||
|
self.direction = D_UP
|
||||||
|
|
||||||
|
def down(self) -> None:
|
||||||
|
self.direction = D_DOWN
|
|
@ -0,0 +1,19 @@
|
||||||
|
class Point:
|
||||||
|
def __init__(self, x, y):
|
||||||
|
self.x = x
|
||||||
|
self.y = y
|
||||||
|
|
||||||
|
def __eq__(self, other) -> bool:
|
||||||
|
if isinstance(other, Point):
|
||||||
|
if self.x == other.x and self.y == other.y:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
raise TypeError("You can compare only Point with Point")
|
||||||
|
|
||||||
|
def __hash__(self) -> None:
|
||||||
|
return int(f"{self.x}000{self.y}")
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
|
return f"{self.x = } | {self.y = }"
|
|
@ -0,0 +1,26 @@
|
||||||
|
# Main settings
|
||||||
|
WIDTH = 20
|
||||||
|
HEIGHT = 20
|
||||||
|
FPS = 5
|
||||||
|
|
||||||
|
# Buttons
|
||||||
|
QUIT_BUTTON = 'q'
|
||||||
|
LEFT_BUTTON = 'a'
|
||||||
|
RIGHT_BUTTON = 'd'
|
||||||
|
UP_BUTTON = 'w'
|
||||||
|
DOWN_BUTTON = 's'
|
||||||
|
|
||||||
|
# Player settings
|
||||||
|
D_LEFT = "LEFT"
|
||||||
|
D_RIGHT = "RIGHT"
|
||||||
|
D_UP = "UP"
|
||||||
|
D_DOWN = "DOWN"
|
||||||
|
MAIN_DIRECTION = D_DOWN
|
||||||
|
MAIN_X = 0
|
||||||
|
MAIN_Y = 0
|
||||||
|
|
||||||
|
# Out types
|
||||||
|
SPACE = 0
|
||||||
|
WALL = 1
|
||||||
|
FOOD = 2
|
||||||
|
WALL_FOOD = 3
|
Loading…
Reference in New Issue