零、序章
这是一个使用Python写的贪吃蛇游戏。
可以练习一些面向对象的知识。
实现的功能有:
- 🐍的移动、生长、死亡
- 食物的刷新、碰撞检测
- 计分板的刷新、最高分的本地读写
可以改进的地方有:
- 暂停功能
- 生长部分代码也许可以继续优化
- 即使🐍只有3块,理论上绝不可能撞到自己,但方向键按太快仍然会死,估计是碰撞检测的原因
一、游戏主程序
import time
from turtle import Screen
from snake import Snake
from food import Food
from scoreboard import ScoreBoard
def quit_game():
"""
这是一个负责退出游戏的函数
:return: 无
"""
global game_is_on
game_is_on = False
# 实例化屏幕对象
screen = Screen()
# 设置宽、高
screen.setup(width=600, height=600)
# 设置背景色
screen.bgcolor('Black')
# 设置标题
screen.title('A Snake Game')
# 关闭屏幕实时刷新
screen.tracer(0)
# 实例化计分板对象
scoreboard = ScoreBoard(screen)
# 实例化🐍对象
snake = Snake()
# 计算边界(emmm这个计算边界的函数我不是很确定放哪儿。。。。)
limits = snake.cal_limits(screen)
# 实例化食物对象
dot = Food()
dot.refresh_pos(limits)
# 监听用户键盘行为,上下左右分别控制🐍的上下左右移动
screen.listen()
screen.onkey(key='Up', fun=snake.up)
screen.onkey(key='Down', fun=snake.down)
screen.onkey(key='Left', fun=snake.left)
screen.onkey(key='Right', fun=snake.right)
screen.onkey(key='q', fun=quit_game)
# 使用game_is_on参数控制循环
game_is_on = True
while game_is_on:
# 每次循环刷新一次屏幕,这是为了保证所有物体(Turtle)移动完了才刷新,防止🐍分裂
screen.update()
# 循环间隔设置成1秒
time.sleep(0.1)
# 🐍必须保持移动
snake.move()
# 碰撞检测,使用turtle自带的distance方法
if snake.segments[0].distance(dot) <= 10:
# 撞到了就刷新分数
scoreboard.refresh_score()
# 🐍生长
snake.grow()
# 食物刷新位置
dot.refresh_pos(limits)
# 检测🐍是否死亡
if snake.is_dead(limits):
# 刷新🐍
snake.refresh()
# 刷新分数板
scoreboard.score = -1
scoreboard.refresh_score()
# 把最高分写入本地存储
scoreboard.write_highest_score('highest_score.txt')
print('Gameover!')
二、🐍类
import time
from turtle import Turtle, Screen
# 蛇的初始位置
STARTING_POSITION = [(0, 0), (-