from turtle import Turtle STARTING_POSITIONS = [(0, 0), (-20, 0), (-40, 0)] MOVE_DISTANCE = 20 UP = 90 DOWN = 270 LEFT = 180 RIGHT = 0 class Snake: def init(self): self.segments = [] self.create_snake() self.head = self.segments[0] def create_snake(self): for position in STARTING_POSITIONS: self.add_segment(position) def add_segment(self, position): new_segment = Turtle("square") new_segment.color("white") new_segment.penup() new_segment.goto(position) self.segments.append(new_segment) def extend(self): self.add_segment(self.segments[-1].position()) def move(self): for seg_num in range(len(self.segments) - 1, 0, -1): new_x = self.segments[seg_num - 1].xcor() new_y = self.segments[seg_num - 1].ycor() self.segments[seg_num].goto(new_x, new_y) self.head.forward(MOVE_DISTANCE) def up(self): if self.head.heading() != DOWN: self.head.setheading(UP) def down(self): if self.head.heading() != UP: self.head.setheading(DOWN) def left(self): if self.head.heading() != RIGHT: self.head.setheading(LEFT) def right(self): if self.head.heading() != LEFT: self.head.setheading(RIGHT)</code></pre><h2>food.py</h2><pre><code class="lang-python">from turtle import Turtle import random class Food(Turtle): def init(self): super().init() self.shape("circle") self.penup() self.shapesize(stretch_len=0.5, stretch_wid=0.5) self.color("blue") self.speed("fastest") self.refresh() def refresh(self): random_x = random.randint(-280, 280) random_y = random.randint(-280, 280) self.goto(random_x, random_y)</code></pre><h2>scoreboard.py</h2><pre><code class="lang-python">from turtle import Turtle ALIGNMENT = "center" FONT = ("Courier", 24, "normal") class Scoreboard(Turtle): def init(self): super().init() self.score = 0 with open("data.txt") as data: self.high_score = int(data.read()) self.color("white") self.penup() self.goto(0, 270) self.hideturtle() self.update_scoreboard() def update_scoreboard(self): self.clear() self.write(f"Score: {self.score} High Score: {self.high_score}", align=ALIGNMENT, font=FONT) def reset(self): if self.score > self.high_score: self.high_score = self.score with open("data.txt", mode="w") as data: data.write(f"{self.high_score}") self.score = 0 self.update_scoreboard() def increase_score(self): self.score += 1 self.update_scoreboard() def game_over(self): self.goto(0, 0) self.write("GAME OVER", align=ALIGNMENT, font=FONT) self.reset()</code></pre><h2>main.py</h2><pre><code class="lang-python">from turtle import Screen from snake import Snake from food import Food from scoreboard import Scoreboard import time screen = Screen() screen.setup(width=600, height=600) screen.bgcolor("black") screen.title("My Snake Game") screen.tracer(0) snake = Snake() food = Food() scoreboard = Scoreboard() screen.listen() screen.onkey(snake.up, "Up") screen.onkey(snake.down, "Down") screen.onkey(snake.left, "Left") screen.onkey(snake.right, "Right") game_is_on = True while game_is_on: screen.update() time.sleep(0.1) snake.move() # Detect collision with food. if snake.head.distance(food) < 15: food.refresh() snake.extend() scoreboard.increase_score() # Detect collision with wall. if snake.head.xcor() > 280 or snake.head.xcor() < -280 or snake.head.ycor() > 280 or snake.head.ycor() < -280: game_is_on = False scoreboard.game_over() # Detect collision with tail. for segment in snake.segments: if segment == snake.head: pass elif snake.head.distance(segment) < 10: game_is_on = False scoreboard.game_over() screen.exitonclick()
0
本文作者:a
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!