python实现简单的贪吃蛇游戏

yizhihongxing

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自动化实现登录获取图片验证码功能

    下面是Python自动化实现登录获取图片验证码功能的完整攻略。 1.了解网站登录方式 首先,我们要了解一下要登录的网站的登录方式。通常情况下,网站的登录方式有两种: 表单方式:即用户需要通过网页表单提供用户名和密码,才能成功登录。 Cookie方式:即用户访问网站后,网站会在用户的浏览器中设置Cookie信息,当用户再次访问该网站时,可以通过Cookie信息…

    python 2023年5月18日
    00
  • 详解如何通过Python制作一个密码生成器

    详解如何通过Python制作一个密码生成器 本攻略将详细说明如何通过Python语言实现一个密码生成器。我们将使用Python内置的随机数库random来生成随机密码,并通过命令行参数来控制生成密码的规则。 步骤一:导入模块 无论我们想要做什么,首先要导入相关模块。在本例中,我们需要使用Python内置的random模块。 import random 步骤二…

    python 2023年6月3日
    00
  • python3+telnetlib实现简单自动测试示例详解

    “python3+telnetlib实现简单自动测试”是一种基于Python3编程语言和telnetlib模块实现简单自动测试的方法。在实际生产和运维环境中,这种方法能够实现一定的效果和帮助。 该方法的主要思路是: 通过Python3编写测试脚本; 使用telnetlib模块建立telnet会话,并执行相关命令; 对返回的结果进行分析和处理; 输出测试结果或…

    python 2023年5月19日
    00
  • python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用

    Python3字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用 在Python3中,字符串、列表和元组是常用的数据类型。它们之间可以相互转换,方便在不同的场景中使用。本文将详细讲解这些数据类型之间的相互转换方法及join()函数的使用。 字符串、列表、元组之间的相互转换 字符串转列表/元组 在Python3中,可以使用s…

    python 2023年5月13日
    00
  • Python字符串的一些操作方法总结

    下面就是Python字符串的一些操作方法总结的完整攻略: 字符串是什么 Python中的字符串(String)是一种不可变的序列,它由一系列Unicode字符组成,用来表示文本数据。它们通常被用在程序中表达一些信息,比如文件名、URL等。 在Python中,字符串可以使用单引号、双引号、三引号来表示,而三引号可以表示多行字符串。 以下是一个示例: str1 …

    python 2023年5月31日
    00
  • pycharm自动生成文件注释和函数注释

    当我们在PyCharm中编写Python代码时,编写规范的代码注释是非常有用的。它可以帮助其他程序员更容易地理解我们的代码,并且可以为后续修改和维护带来许多便利。在PyCharm中,我们可以通过自动添加代码注释的方式来提升编码效率。 下面是关于如何在PyCharm中自动生成文件注释和函数注释的完整攻略: 1. 自动生成文件注释 文件注释就是指在Python代…

    python 2023年6月6日
    00
  • Python自动化办公之Word文件内容的读取

    非常感谢您对 Python 自动化办公的关注!这里提供一份关于 Word 文件内容读取的 完整攻略,希望能对您有所帮助。 前置知识 在 Python 中读取 Word 文件,我们需要用到 python-docx 库进行处理。因此,您需要先安装该库(可以使用 pip 工具进行安装)。 !pip install python-docx 读取 Word 文件内容 …

    python 2023年6月2日
    00
  • Python用requests模块实现动态网页爬虫

    Python 中的 requests 模块是一个简单易用的 HTTP 库,它能够帮助我们完成各种HTTP请求,并获取服务端数据。在实现静态网页爬虫时,我们可以直接获取网页 HTML 代码,但是如果网页通过 Ajax 等技术动态加载数据,我们就需要使用 requests 模块来模拟浏览器向服务端发送请求并获取响应。 下面是实现动态网页爬虫的完整攻略: 1. 安…

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