2024-03-29
欢乐时光
00
请注意,本文编写于 256 天前,最后修改于 216 天前,其中某些信息可能已经过时。

目录

简介
成功运行的源码
贪食蛇源码优化过程
User
ChatGPT
User
ChatGPT
User
ChatGPT
赞助请求V3

简介

学习 Python 的时候,相信大家都接触过写一个贪食蛇类似的小练习。

下面是一个使用 Pyhton 实现的贪食蛇程序(使用freegames):

rungame over
game1game2

其中黑色是蛇,绿色是食物。

PS:代码由 ChatGPT 优化并生成。

成功运行的源码

python
from random import randrange from freegames import vector, square import turtle food = vector(0, 0) snake = [vector(10, 0)] position = vector(0, -10) def change(x, y): position.x = x position.y = y def is_inside(head): return -200 < head.x < 190 and -200 < head.y < 190 def generate_food(): while True: food.x = randrange(-15, 15) * 10 food.y = randrange(-15, 15) * 10 if food not in snake: break def move(): head = snake[-1].copy() head.move(position) if not is_inside(head) or head in snake: turtle.update() turtle.color('red') turtle.goto(0, 0) turtle.write("Game Over!", align="center", font=("Arial", 24, "normal")) return snake.append(head) # 将新的蛇头添加到蛇的列表中 if head == food: print('Snake:', len(snake)) generate_food() else: snake.pop(0) # 移除蛇的尾部,以实现蛇的移动 turtle.clear() # 清除之前的绘制 for body in snake: square(body.x, body.y, 9, 'black') square(food.x, food.y, 9, 'green') turtle.update() turtle.ontimer(move, 100) def main(): turtle.setup(420, 420, 370, 0) turtle.hideturtle() turtle.tracer(False) move() turtle.listen() turtle.onkey(lambda: change(10, 0), 'Right') turtle.onkey(lambda: change(-10, 0), 'Left') turtle.onkey(lambda: change(0, 10), 'Up') turtle.onkey(lambda: change(0, -10), 'Down') turtle.done() if __name__ == '__main__': main()

贪食蛇源码优化过程

原本是使用国内AI 小艺 生成的代码,但是有问题,所以使用 ChatGPT 优化了一下,最终正确运行了贪食蛇程序,下面是与 ChatGPT 的对话记录:

User

找出以下代码问题并优化:

python
from random import randrange #导入随机函数 from freegames import vector, square #导入向量函数与绘图函数 import turtle #导入绘图海龟模块 food = vector(0, 0) #食物 snake = [vector(10, 0)] #蛇 position = vector(0, -10) #移动位置,一步的距离为10 def change(x, y): #改变蛇的移动方向 position.x = x position.y = y def is_inside(head): #判断蛇头是否在窗体内 return -200 < head.x < 190 and -200 < head.y < 190 def move(): #可以让蛇移动的方法 head = snake[-1].copy() #确定蛇头的位置 head.move(position) #移动一步 if not is_inside(head) or head in snake: #如果蛇的头部位于边界外或者蛇头在蛇的身体中 square(head.x, head.y, 9, 'red') #绘制红色蛇头,说明游戏结束 turtle.update() #更新 return snake.append(head) #更新蛇的位置 if head == food: #如果蛇吃到食物 print('Snake:', len(snake)) #根据蛇的长度进行加分 food.x = randrange(-15, 15) * 10 #随机生成食物x坐标 food.y = randrange(-15, 15) * 10 #随机生成食物y坐标 else: snake.pop(0) #移除蛇走过的坐标 turtle.clear() #清空蛇走过的位置 for body in snake: #循环遍历蛇的坐标 square(body.x, body.y, 9, 'black') #绘制黑色蛇 square(food.x, food.y, 9, 'green') #绘制绿色食物 turtle.update() turtle.ontimer(move, 100) #定时执行move函数 if name == 'main': #程序入口 turtle.setup(420, 420, 370, 0) #创建窗体大小 turtle.hideturtle() #隐藏箭头显示 turtle.tracer(False) #关闭绘画效果 move() #调用让蛇移动的方法 turtle.listen() #事件监听器 turtle.onkey(lambda: change(10, 0), 'Right') #按键盘右键,蛇向右走 turtle.onkey(lambda: change(-10, 0), 'Left') #按键盘左键,蛇向左走 turtle.onkey(lambda: change(0, 10), 'Up') #按键盘上键,蛇向上走 turtle.onkey(lambda: change(0, -10), 'Down') #按键盘下键,蛇向下走 turtle.done() #停止画笔绘制,但绘图窗体不关闭

ChatGPT

以下是对代码中存在的问题的诊断和优化建议:

  1. 事件处理位置问题: 在当前代码中,事件处理函数 move() 中被递归调用,这会导致事件处理被阻塞,因为每次调用 move() 都会等待递归调用结束。这意味着蛇只会在一个移动周期后才响应新的按键事件。
    解决方案: 将 turtle.ontimer(move, 100) 移动到主程序中的键盘事件处理函数中。这样,每次按下键盘时都会重置定时器,从而实现即时响应。

  2. 食物生成位置问题: 食物生成的位置不应该与蛇的位置重叠。当前代码中,食物生成位置是随机的,可能会与蛇的身体位置重叠,这样会导致游戏不公平。
    解决方案: 添加一个函数来确保食物不会生成在蛇的身体上。可以在食物生成时检查其位置,并在需要时重新生成。

  3. 游戏结束条件: 当蛇撞到边界或者撞到自己时,游戏应该结束并给出相应的提示。当前的代码只是在蛇头超出边界或撞到自己时绘制一个红色的方块,但并没有给出任何提示。
    解决方案: 在游戏结束时,可以在界面上显示一个提示信息,例如 "Game Over!",并停止游戏进行。

  4. 代码结构问题: 目前的代码结构不够清晰,逻辑上存在一些混乱。例如,键盘事件处理函数中既有对移动的处理,又有食物生成的逻辑。这种混合可能会导致代码更难维护和理解。
    解决方案: 将代码模块化,将不同的逻辑功能分别放入不同的函数中,使代码更易读和维护。

基于以上问题和解决方案,以下是对代码的优化和改进后的版本:

python
from random import randrange from freegames import vector, square import turtle food = vector(0, 0) snake = [vector(10, 0)] position = vector(0, -10) def change(x, y): position.x = x position.y = y def is_inside(head): return -200 < head.x < 190 and -200 < head.y < 190 def generate_food(): while True: food.x = randrange(-15, 15) * 10 food.y = randrange(-15, 15) * 10 if food not in snake: break def move(): head = snake[-1].copy() head.move(position) if not is_inside(head) or head in snake: turtle.update() turtle.color('red') turtle.goto(0, 0) turtle.write("Game Over!", align="center", font=("Arial", 24, "normal")) return if head == food: print('Snake:', len(snake)) generate_food() else: snake.pop(0) for body in snake: square(body.x, body.y, 9, 'black') square(food.x, food.y, 9, 'green') turtle.update() turtle.ontimer(move, 100) def main(): turtle.setup(420, 420, 370, 0) turtle.hideturtle() turtle.tracer(False) move() turtle.listen() turtle.onkey(lambda: change(10, 0), 'Right') turtle.onkey(lambda: change(-10, 0), 'Left') turtle.onkey(lambda: change(0, 10), 'Up') turtle.onkey(lambda: change(0, -10), 'Down') turtle.done() if __name__ == '__main__': main()

在优化后的代码中,主要改进了事件处理、食物生成、游戏结束逻辑以及代码结构,使代码更清晰易懂,游戏逻辑更合理。

User

报错ModuleNotFoundError: No module named 'freegames'

ChatGPT

看起来代码中引用的模块 freegames 无法被找到,导致了 ModuleNotFoundError 错误。这可能是因为在您的环境中缺少了这个模块,或者这个模块没有被正确安装。

解决这个问题有几种方法:

  1. 安装 freegames 模块:您可以尝试通过 pip 命令安装 freegames 模块。在命令行中运行以下命令:

    bash
    pip install freegames

    这将会从 PyPI(Python Package Index)安装 freegames 模块到您的 Python 环境中。

  2. 检查 freegames 模块位置:如果您已经安装了 freegames 模块,但是代码仍然报错,可能是因为 Python 解释器无法找到该模块。您可以检查 Python 的模块搜索路径,确保模块被正确安装并位于 Python 解释器可以找到的路径中。

  3. 修改代码使用本地模块:如果您没有找到 freegames 模块或者无法安装它,您可以尝试修改代码,以使用您本地环境中已有的模块替代 freegames。或者您也可以尝试寻找替代的模块来完成相同的功能。

根据您的选择,选择其中一种方法来解决 ModuleNotFoundError 错误。

User

python
from random import randrange from freegames import vector, square import turtle food = vector(0, 0) snake = [vector(10, 0)] position = vector(0, -10) def change(x, y): position.x = x position.y = y def is_inside(head): return -200 < head.x < 190 and -200 < head.y < 190 def generate_food(): while True: food.x = randrange(-15, 15) * 10 food.y = randrange(-15, 15) * 10 if food not in snake: break def move(): head = snake[-1].copy() head.move(position) if not is_inside(head) or head in snake: turtle.update() turtle.color('red') turtle.goto(0, 0) turtle.write("Game Over!", align="center", font=("Arial", 24, "normal")) return if head == food: print('Snake:', len(snake)) generate_food() else: snake.pop(0) for body in snake: square(body.x, body.y, 9, 'black') square(food.x, food.y, 9, 'green') turtle.update() turtle.ontimer(move, 100) def main(): turtle.setup(420, 420, 370, 0) turtle.hideturtle() turtle.tracer(False) move() turtle.listen() turtle.onkey(lambda: change(10, 0), 'Right') turtle.onkey(lambda: change(-10, 0), 'Left') turtle.onkey(lambda: change(0, 10), 'Up') turtle.onkey(lambda: change(0, -10), 'Down') turtle.done() if __name__ == '__main__': main()

以上贪食蛇代码运行时,只有食物,没有蛇,请修复

ChatGPT

在您提供的代码中,蛇的移动逻辑似乎存在一些问题,导致蛇没有正确显示在游戏窗口中。主要的问题可能在于蛇的移动和绘制逻辑。让我们来仔细检查并修复这些问题。

我将重点关注蛇的移动和绘制部分的逻辑。以下是更新后的代码:

python
from random import randrange from freegames import vector, square import turtle food = vector(0, 0) snake = [vector(10, 0)] position = vector(0, -10) def change(x, y): position.x = x position.y = y def is_inside(head): return -200 < head.x < 190 and -200 < head.y < 190 def generate_food(): while True: food.x = randrange(-15, 15) * 10 food.y = randrange(-15, 15) * 10 if food not in snake: break def move(): head = snake[-1].copy() head.move(position) if not is_inside(head) or head in snake: turtle.update() turtle.color('red') turtle.goto(0, 0) turtle.write("Game Over!", align="center", font=("Arial", 24, "normal")) return snake.append(head) # 将新的蛇头添加到蛇的列表中 if head == food: print('Snake:', len(snake)) generate_food() else: snake.pop(0) # 移除蛇的尾部,以实现蛇的移动 turtle.clear() # 清除之前的绘制 for body in snake: square(body.x, body.y, 9, 'black') square(food.x, food.y, 9, 'green') turtle.update() turtle.ontimer(move, 100) def main(): turtle.setup(420, 420, 370, 0) turtle.hideturtle() turtle.tracer(False) move() turtle.listen() turtle.onkey(lambda: change(10, 0), 'Right') turtle.onkey(lambda: change(-10, 0), 'Left') turtle.onkey(lambda: change(0, 10), 'Up') turtle.onkey(lambda: change(0, -10), 'Down') turtle.done() if __name__ == '__main__': main()

在这个修复后的版本中,我确保了蛇的移动逻辑正确,即将新的蛇头添加到蛇的列表中,并在每次移动时移除蛇的尾部,以实现蛇的移动。同时,我也更新了绘制逻辑,确保在每次移动后清除之前的绘制,以避免出现蛇重叠的情况。希望这次修复能够解决您遇到的问题。

赞助请求V3

建站因为热爱,生活需要Money,请屏幕前的大佬动动您发财的小手,点击一次以示鼓励,祝您生活愉快!

PS:就目前的访问量,即便每个访客都点一次广告,收入也不足以支付运营成本。如果看不到广告,可能是网络原因或被拦截了,那就算了吧。再次祝您生活愉快~~

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:DingDangDog

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!