diff --git a/classes/__init__.py b/classes/__init__.py new file mode 100644 index 0000000..8e5e3b9 --- /dev/null +++ b/classes/__init__.py @@ -0,0 +1,2 @@ +from .field import Field +from .snake import Snake \ No newline at end of file diff --git a/classes/__pycache__/__init__.cpython-38.pyc b/classes/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..60c3fc1 Binary files /dev/null and b/classes/__pycache__/__init__.cpython-38.pyc differ diff --git a/classes/__pycache__/field.cpython-38.pyc b/classes/__pycache__/field.cpython-38.pyc new file mode 100644 index 0000000..53ba864 Binary files /dev/null and b/classes/__pycache__/field.cpython-38.pyc differ diff --git a/classes/__pycache__/snake.cpython-38.pyc b/classes/__pycache__/snake.cpython-38.pyc new file mode 100644 index 0000000..d58131b Binary files /dev/null and b/classes/__pycache__/snake.cpython-38.pyc differ diff --git a/classes/field.py b/classes/field.py new file mode 100644 index 0000000..e5dd0c0 --- /dev/null +++ b/classes/field.py @@ -0,0 +1,70 @@ +import curses +import time +import sys +from random import randint + +class Field: + def __init__(self, size): + self.size = size + self.icons = { + 0: ' . ', # empty baord + 1: ' ▢ ', # snake tail + 2: ' ⏺ ', # snake head + 3: ' △ ', # food + } + self.snake_coords = [] + self._generate_field() + self.add_entity() + + def add_entity(self): + + while(True): + i = randint(0, self.size-1) + j = randint(0, self.size-1) + entity = [i, j] + + if entity not in self.snake_coords: + self.field[i][j] = 3 + break + + def _generate_field(self): + self.field = [[0 for j in range(self.size)] for i in range(self.size)] + + def _clear_field(self): + self.field = [[j if j!= 1 and j!= 2 else 0 for j in i] for i in self.field] + + + def render(self, screen): + size = self.size + self._clear_field() + + + # Render snake on the field + for i, j in self.snake_coords: + self.field[i][j] = 1 + + # Mark head + head = self.snake_coords[-1] + self.field[head[0]][head[1]] = 2 + + for i in range(size): + row = '' + for j in range(size): + row += self.icons[ self.field[i][j] ] + + screen.addstr(i, 0, row) + + def get_entity_pos(self): + for i in range(self.size): + for j in range(self.size): + if self.field[i][j] == 3: + return [i, j] + + return [-1, -1] + + + def is_snake_eat_entity(self): + entity = self.get_entity_pos() + head = self.snake_coords[-1] + return entity == head + diff --git a/snake.py b/classes/snake.py similarity index 53% rename from snake.py rename to classes/snake.py index edb2c79..4dbd62c 100644 --- a/snake.py +++ b/classes/snake.py @@ -3,72 +3,6 @@ import sys from random import randint -class Field: - def __init__(self, size): - self.size = size - self.icons = { - 0: ' . ', - 1: ' * ', - 2: ' # ', - 3: ' & ', - } - self.snake_coords = [] - self._generate_field() - self.add_entity() - - def add_entity(self): - - while(True): - i = randint(0, self.size-1) - j = randint(0, self.size-1) - entity = [i, j] - - if entity not in self.snake_coords: - self.field[i][j] = 3 - break - - def _generate_field(self): - self.field = [[0 for j in range(self.size)] for i in range(self.size)] - - def _clear_field(self): - self.field = [[j if j!= 1 and j!= 2 else 0 for j in i] for i in self.field] - - - def render(self, screen): - size = self.size - self._clear_field() - - - # Render snake on the field - for i, j in self.snake_coords: - self.field[i][j] = 1 - - # Mark head - head = self.snake_coords[-1] - self.field[head[0]][head[1]] = 2 - - for i in range(size): - row = '' - for j in range(size): - row += self.icons[ self.field[i][j] ] - - screen.addstr(i, 0, row) - - def get_entity_pos(self): - for i in range(self.size): - for j in range(self.size): - if self.field[i][j] == 3: - return [i, j] - - return [-1, -1] - - - def is_snake_eat_entity(self): - entity = self.get_entity_pos() - head = self.snake_coords[-1] - return entity == head - - class Snake: def __init__(self, name): self.name = name @@ -158,6 +92,7 @@ def move(self): curses.beep() self.level_up() self.field.add_entity() + return 1 @@ -166,30 +101,3 @@ def set_field(self, field): self.field = field -def main(screen): - # Configure screen - screen.timeout(0) - - # Init snake & field - field = Field(10) - snake = Snake("Joe") - snake.set_field(field) - - while(True): - # Get last pressed key - ch = screen.getch() - if ch != -1: - # If some arrows did pressed - change direction - snake.set_direction(ch) - - # Move snake - snake.move() - - # Render field - field.render(screen) - screen.refresh() - - time.sleep(.4) - -if __name__=='__main__': - curses.wrapper(main) diff --git a/game.py b/game.py new file mode 100644 index 0000000..ddfbe06 --- /dev/null +++ b/game.py @@ -0,0 +1,41 @@ +import curses +import time +import sys +from random import randint +from classes import Field +from classes import Snake + + +def main(screen): + # Configure screen + screen.timeout(0) + + # Init snake & field + field = Field(10) + snake = Snake("Joe") + snake.set_field(field) + speed = 0.4 + + while(True): + # Get last pressed key + ch = screen.getch() + if ch != -1: + # If some arrows did pressed - change direction + snake.set_direction(ch) + + # Move snake + hit = snake.move() + if hit == 1: + # we ate a food + if randint(1,10) > 6: + # incrase speed every now and then... + speed -= 0.05 + + # Render field + field.render(screen) + screen.refresh() + + time.sleep(speed) + +if __name__=='__main__': + curses.wrapper(main)