day 20
This commit is contained in:
22
020/food.py
Normal file
22
020/food.py
Normal file
@ -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()
|
||||||
71
020/game.py
Normal file
71
020/game.py
Normal file
@ -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'))
|
||||||
|
|
||||||
9
020/main.py
Normal file
9
020/main.py
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
from game import GameManager
|
||||||
|
import time
|
||||||
|
|
||||||
|
game = GameManager()
|
||||||
|
|
||||||
|
while game.game_on == True:
|
||||||
|
game.game_round()
|
||||||
|
|
||||||
|
game.get_screen().exitonclick()
|
||||||
61
020/snake.py
Normal file
61
020/snake.py
Normal file
@ -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
|
||||||
Reference in New Issue
Block a user