diff --git a/020/food.py b/020/food.py new file mode 100644 index 0000000..1d3494f --- /dev/null +++ b/020/food.py @@ -0,0 +1,22 @@ +from turtle import Turtle +import random + +class Food: + def __init__(self, screen_x_size, screen_y_size): + self.turtle = Turtle(shape="square") + self.turtle.color("cyan") + self.turtle.pu() + + x_limit = int((screen_x_size-20)/40) + y_limit = int((screen_y_size-20)/40) + + x_pos = random.randint(-x_limit, x_limit)*20 + y_pos = random.randint(-y_limit, y_limit)*20 + self.turtle.teleport(x=x_pos, y=y_pos) + + + def get_position(self): + return self.turtle.xcor(), self.turtle.ycor() + + def hide(self): + self.turtle.hideturtle() \ No newline at end of file diff --git a/020/game.py b/020/game.py new file mode 100644 index 0000000..136e65d --- /dev/null +++ b/020/game.py @@ -0,0 +1,71 @@ +from turtle import Screen, Turtle +from snake import Snake +from food import Food +import time + +class GameManager: + + BOARD_WIDTH=600 + BOARD_HEIGHT=600 + + def __init__(self): + self.screen = Screen() + + self.screen.setup(width=self.BOARD_WIDTH, height=self.BOARD_HEIGHT) + self.screen.bgcolor("black") + self.screen.title("Snake game") + self.screen.tracer(0) + self.snake = Snake() + self.screen.update() + + self.food_on_screen = False + + self.game_on = True + + def control_snake(self): + self.screen.listen() + self.screen.onkey(self.snake.up, "Up") + self.screen.onkey(self.snake.right, "Right") + self.screen.onkey(self.snake.down, "Down") + self.screen.onkey(self.snake.left, "Left") + self.snake.move() + self.screen.update() + + def check_collision(self): + x, y = self.snake.get_head_position() + wall_collision = x >= self.BOARD_WIDTH/2 or x <= -self.BOARD_WIDTH/2 or y >= self.BOARD_HEIGHT/2 or y <= -self.BOARD_HEIGHT/2 + snake_collision = self.snake.tailbite() + + return wall_collision or snake_collision + + def is_food_eaten(self): + snake_x, snake_y = self.snake.get_head_position() + food_x, food_y = self.food.get_position() + + if int(snake_x) == int(food_x) and int(snake_y) == int(food_y): + print("Yihaa") + self.food.hide() + self.snake.extend() + self.food_on_screen = False + + def game_round(self): + if not self.food_on_screen: + self.food = Food(self.BOARD_WIDTH, self.BOARD_HEIGHT) + self.food_on_screen = True + + self.control_snake() + if self.check_collision(): + self.game_on = False + self.game_over() + + self.is_food_eaten() + time.sleep(0.1) + + def get_screen(self): + return self.screen + + def game_over(self): + turtle = Turtle() + turtle.color("yellow") + turtle.write("Game over!", move=False, align='center', font=('Arial', 32, 'normal')) + diff --git a/020/main.py b/020/main.py new file mode 100644 index 0000000..b7b7d11 --- /dev/null +++ b/020/main.py @@ -0,0 +1,9 @@ +from game import GameManager +import time + +game = GameManager() + +while game.game_on == True: + game.game_round() + +game.get_screen().exitonclick() \ No newline at end of file diff --git a/020/snake.py b/020/snake.py new file mode 100644 index 0000000..3af29a5 --- /dev/null +++ b/020/snake.py @@ -0,0 +1,61 @@ +from turtle import Turtle + +class Snake: + def __init__(self): + self.segments = [] + self.length = 3 + self.extend_snake = False + for i in range(self.length): + turtle = Turtle(shape="square") + turtle.color("white") + turtle.pu() + x_pos = -i *20 + turtle.teleport(x=x_pos) + self.segments.append(turtle) + + def move(self): + tail_position = self.segments[-1].position() + + for i in range(len(self.segments) - 1, 0, -1): + self.segments[i].goto(self.segments[i-1].position()) + self.segments[0].forward(20) + + if self.extend_snake == True: + turtle = Turtle(shape="square") + turtle.color("white") + turtle.pu() + turtle.goto(tail_position) + self.segments.append(turtle) + self.extend_snake = False + + def up(self): + if self.segments[0].heading() != 270: + for segment in self.segments: + segment.setheading(90) + + def right(self): + if self.segments[0].heading() != 180: + for segment in self.segments: + segment.setheading(0) + + def down(self): + if self.segments[0].heading() != 90: + for segment in self.segments: + segment.setheading(270) + + def left(self): + if self.segments[0].heading() != 0: + for segment in self.segments: + segment.setheading(180) + + def get_head_position(self): + return self.segments[0].xcor(), self.segments[0].ycor() + + def tailbite(self): + for i in range(len(self.segments) - 1, 0, -1): + if self.segments[0].position() == self.segments[i].position(): + return True + return False + + def extend(self): + self.extend_snake = True \ No newline at end of file