python实现简单的贪吃蛇游戏

Python实现简单的贪吃蛇游戏

整体思路

贪吃蛇游戏可以分为三个模块:蛇的移动、食物的出现、蛇和食物的碰撞检测。

蛇的移动

蛇的移动使用Python的turtle模块实现。我们需要创建一个蛇类,用来存储蛇的坐标、方向、身体长度等信息。当蛇向上、下、左、右移动的时候,我们只需要将蛇头的坐标变为前一个身体坐标的值即可。蛇尾的坐标也需要随着蛇头的移动而更新,保证蛇长度不变。

食物的出现

食物的出现是一个随机坐标,只需要在游戏区域内随机生成一个坐标即可。需要注意的是,食物不能出现在蛇的身体上,否则游戏结束。在检测到食物和蛇的碰撞后,需要将食物重新生成一个随机坐标。

蛇和食物的碰撞检测

每当蛇头的坐标和食物坐标重合时,代表蛇吃到了食物,此时需要更新蛇的身体长度,重新生成食物坐标。与此同时,还需要判断蛇是否碰到了边界或碰到了自己的身体,从而结束游戏。

示例代码

以下代码是一个简单的贪吃蛇游戏实现,它包括了上述三个模块的功能。可以通过Python的turtle库来运行该脚本。

import turtle
import random

class Snake:
    def __init__(self):
        self.snake = [(0, 0), (0, -20), (0, -40)]
        self.direction = "Up"
        self.body_size = 3

    def move(self):
        if self.direction == "Up":
            new_head = (self.snake[0][0], self.snake[0][1] + 20)
        elif self.direction == "Down":
            new_head = (self.snake[0][0], self.snake[0][1] - 20)
        elif self.direction == "Left":
            new_head = (self.snake[0][0] - 20, self.snake[0][1])
        elif self.direction == "Right":
            new_head = (self.snake[0][0] + 20, self.snake[0][1])
        self.snake.insert(0, new_head)
        if len(self.snake) > self.body_size:
            self.snake.pop()

    def eat_food(self):
        self.body_size += 1

    def change_direction(self, direction):
        if direction == "Up" and self.direction != "Down":
            self.direction = direction
        elif direction == "Down" and self.direction != "Up":
            self.direction = direction
        elif direction == "Left" and self.direction != "Right":
            self.direction = direction
        elif direction == "Right" and self.direction != "Left":
            self.direction = direction

class Game:
    def __init__(self):
        self.window = turtle.Screen()
        self.window.setup(600, 600)
        self.window.title("Snake Game")

        self.snake = Snake()
        self.food = self.create_food()
        self.create_border()

        self.is_game_over = False
        self.score = 0
        self.show_score()

        self.window.onkey(lambda: self.snake.change_direction("Up"), "Up")
        self.window.onkey(lambda: self.snake.change_direction("Down"), "Down")
        self.window.onkey(lambda: self.snake.change_direction("Left"), "Left")
        self.window.onkey(lambda: self.snake.change_direction("Right"), "Right")
        self.window.listen()

    def create_food(self):
        while True:
            food = (random.randint(-280, 280), random.randint(-280, 280))
            if food not in self.snake.snake:
                return food

    def create_border(self):
        border = turtle.Turtle()
        border.hideturtle()
        border.speed(0)
        border.penup()
        border.goto(-290, -290)
        border.pendown()
        border.goto(-290, 290)
        border.goto(290, 290)
        border.goto(290, -290)
        border.goto(-290, -290)

    def show_score(self):
        score = turtle.Turtle()
        score.hideturtle()
        score.speed(0)
        score.penup()
        score.goto(0, 260)
        score.write(f"Score: {self.score}", align="center", font=("Courier", 24, "normal"))

    def update_score(self):
        self.score += 10
        self.show_score()

    def game_over(self):
        self.is_game_over = True
        message = turtle.Turtle()
        message.hideturtle()
        message.speed(0)
        message.penup()
        message.goto(0, 0)
        message.write("Game Over", align="center", font=("Courier", 24, "normal"))

    def run(self):
        while not self.is_game_over:
            self.snake.move()

            if self.snake.snake[0] == self.food:
                self.snake.eat_food()
                self.food = self.create_food()
                self.update_score()

            if self.snake.snake[0][0] < -280 or self.snake.snake[0][0] > 280 or \
                self.snake.snake[0][1] < -280 or self.snake.snake[0][1] > 280:
                self.game_over()

            for i in range(1, len(self.snake.snake)):
                if self.snake.snake[0] == self.snake.snake[i]:
                    self.game_over()

            turtle.clear()

            self.create_border()

            turtle.penup()
            turtle.goto(self.food)
            turtle.color("red")
            turtle.dot(20)

            for body in self.snake.snake:
                turtle.penup()
                turtle.goto(body)
                turtle.color(0, 0, 0)
                turtle.pendown()
                turtle.dot(20)

            self.window.update()

        self.window.mainloop()

game = Game()
game.run()

这是一个基本的从上至下的贪吃蛇,窗口大小为600x600。在首次运行游戏时,它将首先创建蛇和食物,并设置监听键盘方向输入。当蛇碰到边界或碰到自己的身体时,游戏结束。每当蛇吃到食物时,身体长度增加,并重新生成一个食物。执行时,需要下载turtle库。例如,使用pip install turtle命令安装它。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现简单的贪吃蛇游戏 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 如何使用Python获取MySQL中表中最大值和最小值?

    以下是如何使用Python获取MySQL中表中最大值和最小值的完整使用攻略,包括导入模块、连接数据库、执行查询操作等步骤。同时,提供两个示例以便更好理解如何使用Python获取MySQL中表中最大值和最小值。 步骤1:导入模块 在Python中,我们需要导入相应的模块来获取MySQL中表中最大值和最小值。以下是导入pymysql模块的基本语法: import…

    python 2023年5月12日
    00
  • 用NumPy在Python中用浮点阵列生成Legendre多项式的Vandermonde矩阵

    生成Legendre多项式的Vandermonde矩阵是一种通用的线性代数计算需求,NumPy可以方便地实现。以下是详细的操作步骤: 导入NumPy库 import numpy as np 创建x坐标点 x = np.array([-1, -0.5, 0, 0.5, 1]) 将x坐标点转化为Vandermonde矩阵 V = np.vander(x, inc…

    python-answer 2023年3月25日
    00
  • Python assert断言关键字的作用与用法

    assert是Python中的一个断言语句,用于检查某个特性条件是否为真。 它一般用于调试程序,当程序中有错误时可以快速地检测到。当条件不为真时,assert语句将抛出一个AssertionError异常。 assert语句的语法格式如下: assert condition, message 其中,condition是要检查的条件,如果为假则抛出异常;mes…

    2023年2月16日
    00
  • 如何通过python检查文件是否被占用

    以下是关于如何通过 Python 检查文件是否被占用的完整攻略: 问题描述 在 Python 中,有时候我们需要检查文件是否被占用。本文详细介绍如何通过 Python 检查文件是否被占用。 解决方法 以下步骤解决 Python 检查文件是否被占用问题: 使用 os 模块检查文件是否存在。 可以使用 os 模块的 path.exists() 方法检文件是否存在…

    python 2023年5月13日
    00
  • django模型中的字段和model名显示为中文小技巧分享

    以下是“Django模型中的字段和model名显示为中文小技巧分享”的完整攻略: step 1:安装django-modeltranslation 要实现将Django模型中的字段和model名显示为中文,我们需要借助django-modeltranslation这个第三方库。在安装之前,确保你的Django版本为1.8以上,且已经安装好了pip工具。 在终…

    python 2023年5月18日
    00
  • python 获取list 长度

    在Python中,可以使用内置函数len()来获取列表的长度。len()函数返回列表中元素的个数,例如: my_list = [1, 2, 3, 4, 5] length = len(my_list) # 获取列表的长度 print(length) # 输出列表的长度 上述代码创建了一个包含5个元素的列表,并使用len()函数获取了该列表的长度。 除了使用l…

    python 2023年5月13日
    00
  • Python HTML解析器BeautifulSoup用法实例详解【爬虫解析器】

    下面是关于Python HTML解析器BeautifulSoup用法实例详解的攻略: 简介 解析HTML是Python爬虫中非常重要的一步,因为HTML文本中包含着我们需要的数据。而Python HTML解析器BeautifulSoup就是一个实现HTML文本解析的工具库,在爬虫中被广泛使用。 BeautifulSoup可以从多个维度去解析HTML文本,比如…

    python 2023年5月13日
    00
  • Python实现的弹球小游戏示例

    下面是详细讲解“Python实现的弹球小游戏示例”的完整攻略。 简介 这是一个使用Python编写的小游戏示例,玩家可以通过控制球拍反弹小球,使小球不落下来,从而获得分数。 游戏规则 游戏开始时,小球在屏幕随机位置弹出,并向随机方向移动。 玩家通过控制球拍左右移动来接住小球,防止小球落到屏幕底部。 如果小球与球拍接触,球会反弹,并根据接触点的位置改变运动方向…

    python 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部