【Python项目】贪吃蛇小游戏

零、序章

这是一个使用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), (-
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sprite.Nym

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值