123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- from tkinter import *
- import random
- GAME_WIDTH = 700
- GAME_HEIGHT = 700
- SPEED = 100
- SPACE_SIZE = 50
- BODY_PARTS = 3
- SNAKE_COLOR = "#00FF00"
- FOOD_COLOR = "#FF0000"
- BACKGROUND_COLOR = "#000000"
- class Snake:
- def __init__(self):
- self.body_size = BODY_PARTS
- self.coordinates = []
- self.squares = []
- for i in range(0, BODY_PARTS):
- self.coordinates.append([0, 0])
- for x, y in self.coordinates:
- square = canvas.create_rectangle(x, y, x + SPACE_SIZE, y + SPACE_SIZE, fill=SNAKE_COLOR, tag="snake")
- self.squares.append(square)
- class Food:
- def __init__(self):
- x = random.randint(0, (GAME_WIDTH / SPACE_SIZE)-1) * SPACE_SIZE
- y = random.randint(0, (GAME_HEIGHT / SPACE_SIZE) - 1) * SPACE_SIZE
- self.coordinates = [x, y]
- canvas.create_oval(x, y, x + SPACE_SIZE, y + SPACE_SIZE, fill=FOOD_COLOR, tag="food")
- def next_turn(snake, food):
- x, y = snake.coordinates[0]
- if direction == "up":
- y -= SPACE_SIZE
- elif direction == "down":
- y += SPACE_SIZE
- elif direction == "left":
- x -= SPACE_SIZE
- elif direction == "right":
- x += SPACE_SIZE
- snake.coordinates.insert(0, (x, y))
- square = canvas.create_rectangle(x, y, x + SPACE_SIZE, y + SPACE_SIZE, fill=SNAKE_COLOR)
- snake.squares.insert(0, square)
- if x == food.coordinates[0] and y == food.coordinates[1]:
- global score
- score += 1
- label.config(text="Score:{}".format(score))
- canvas.delete("food")
- food = Food()
- else:
- del snake.coordinates[-1]
- canvas.delete(snake.squares[-1])
- del snake.squares[-1]
- if check_collisions(snake):
- game_over()
- else:
- window.after(SPEED, next_turn, snake, food)
- def change_direction(new_direction):
- global direction
- if new_direction == 'left':
- if direction != 'right':
- direction = new_direction
- elif new_direction == 'right':
- if direction != 'left':
- direction = new_direction
- elif new_direction == 'up':
- if direction != 'down':
- direction = new_direction
- elif new_direction == 'down':
- if direction != 'up':
- direction = new_direction
- def check_collisions(snake):
- x, y = snake.coordinates[0]
- if x < 0 or x >= GAME_WIDTH:
- return True
- elif y < 0 or y >= GAME_HEIGHT:
- return True
- for body_part in snake.coordinates[1:]:
- if x == body_part[0] and y == body_part[1]:
- return True
- return False
- def game_over():
- canvas.delete(ALL)
- canvas.create_text(canvas.winfo_width()/2, canvas.winfo_height()/2,
- font=('consolas',70), text="GAME OVER", fill="red", tag="gameover")
- window = Tk()
- window.title("Snake game")
- window.resizable(False, False)
- score = 0
- direction = 'down'
- label = Label(window, text="Score:{}".format(score), font=('consolas', 40))
- label.pack()
- canvas = Canvas(window, bg=BACKGROUND_COLOR, height=GAME_HEIGHT, width=GAME_WIDTH)
- canvas.pack()
- window.update()
- window_width = window.winfo_width()
- window_height = window.winfo_height()
- screen_width = window.winfo_screenwidth()
- screen_height = window.winfo_screenheight()
- x = int((screen_width/2) - (window_width/2))
- y = int((screen_height/2) - (window_height/2))
- window.geometry(f"{window_width}x{window_height}+{x}+{y}")
- window.bind('<Left>', lambda event: change_direction('left'))
- window.bind('<Right>', lambda event: change_direction('right'))
- window.bind('<Up>', lambda event: change_direction('up'))
- window.bind('<Down>', lambda event: change_direction('down'))
- snake = Snake()
- food = Food()
- next_turn(snake, food)
- window.mainloop()
|