Python下最简单的贪吃蛇
Python下最简单的贪吃蛇
基础知识
Python下最简单的贪吃蛇
准备
前言
这个贪吃蛇使用Python自带的 用于衔接scratch的儿童编程 游戏引擎 绘画库Turtle库编写,无需pip install turtle,是不是很方便?
基本原理
简单来讲就是三行代码:
移动
图章
删除最后一个图章
turtle.fd(20)
turtle.stamp()
turtle.clearstamps(1)
工具
- python 一个
- 文本编辑器 一个(IDLE除外)
- 手 一双
注意事项
本程序使用函数而非对象进行编程
基础知识 需要一定Scratch基础
| 动作 | 代码 |
|---|---|
| 前进 | forward(x),fd(x) |
| 左转 | left(x),lt(x) |
| 右转 | right(x),rt(x) |
| 图章 | stamp() |
| 删除图章 | clearstamp(x) |
| 落笔 | pendown(),pd() |
| 抬笔 | penup(),pu() |
| 速度 | speed(x) |
官方文档在这,不再多讲
代码
开始
导入
首先,打开你的文本编辑器,键入以下代码导入所需库:
from turtle import * #import turtle as t也可以
from random import randint
函数
工具函数
咳咳,其实是按键绑定函数:
def leftx(): #叫leftx是为了避免重名,下同
speed(0) #在旋转时改变速度,否则......自己试试看
lt(90)
speed(1)
def rightx():
speed(0)
rt(90)
食物函数
这里遇到点小问题,所以把这部分代码放进函数里 不然全是你刚学python时的样子
def setfood():
global food
x = randint(-400,400)
y = randint(-300,300)
food = Turtle()
food.hideturtle()
food.penup()
food.shape('turtle') #为什么是turtle看下面代码
food.color('green')
while x in listx or y in listy:
x = randint(-400, 400)
y = randint(-300, 300)
food.goto(x, y)
food.showturtle()
移动函数
def go():
fd(20)
stamp()
listx.append(round(xcor()))
listy.append(round(ycor()))
设置
设置变量和背景
setup(800,600) #禁止擅自修改(大佬的话当我啥没说)
title('贪吃蛇')
bgcolor('cyan')
listx = []
listy = []
food = 0 #随便设个值就行
onkey(leftx,'a')
onkey(rightx,'d')
这里不用listen(),如果用的话…自己试试看
别忘了在测试时按一按a键和d键哦
设置蛇
shape('turtle')
pu() #默认是pendown状态
color('green') #......乌龟当然是绿的!
speed(1)
for i in range(9):
go()
setfood()
流程
当然要放到一个while 1:循环里啦
常规情况
go()
listen()
本来这段程序长达七行将移动部分单独放入一个函数,代码只有两行
出界
if xcor() >= 400 or xcor() <= -400 or ycor() >= 300 or ycor() <= -300:
break
第一行有点长,缩短一下:
if xcor() >= 400:
break
elif xcor() <= -400:
break
elif ycor() >= 300:
break
elif ycor() <= -300:
break
似乎…还是原来更好一些…
吃食物
python turtle中没有scratch的碰撞判断所以通过坐标来判断食物碰撞:
if abs(xcor() - food.xcor()) < 20 and abs(ycor() - food.ycor()) < 20: #因为蛇头不可能和食物完全重合
n = 0
food.hideturtle()
food = 0
setfood()
else:
clearstamps(1)
del (listx[-1])
del (listy[-1])
游戏结束
当break语句执行时游戏结束
hideturtle()
clearstamps()
goto(-250,0)
food.hideturtle()
color('black')
write('游戏结束 最终长度:' + str(len(x)),font = ('黑体',50))
done() #tk中的mainloop
完整代码
from turtle import * #import turtle as t也可以
from random import randint
def leftx(): #叫leftx是为了避免重名,下同
speed(0) #在旋转时改变速度,否则......自己试试看
lt(90)
speed(1)
def rightx():
speed(0)
rt(90)
def setfood():
global food
x = randint(-400,400)
y = randint(-300,300)
food = Turtle()
food.hideturtle()
food.penup()
food.shape('turtle') #为什么是turtle看下面代码
food.color('green')
while x in listx or y in listy:
x = randint(-400, 400)
y = randint(-300, 300)
food.goto(x, y)
food.showturtle()
def go():
fd(20)
stamp()
listx.append(round(xcor()))
listy.append(round(ycor()))
setup(800,600) #禁止擅自修改(大佬的话当我啥没说)
title('贪吃蛇')
bgcolor('cyan')
listx = []
listy = []
food = 0 #随便设个值就行
onkey(leftx,'a')
onkey(rightx,'d')
shape('turtle')
pu() #默认是pendown状态
color('green') #......乌龟当然是绿的!
speed(1)
for i in range(9):
go()
setfood()
while 1:
go()
listen()
if xcor() >= 400 or xcor() <= -400 or ycor() >= 300 or ycor() <= -300:
break
if abs(xcor() - food.xcor()) < 20 and abs(ycor() - food.ycor()) < 20: #因为蛇头不可能和食物完全重合
n = 0
food.hideturtle()
food = 0
setfood()
else:
clearstamps(1)
del (listx[-1])
del (listy[-1])
hideturtle()
clearstamps()
goto(-250,0)
food.hideturtle()
color('black')
write('游戏结束 最终长度:' + str(len(x)),font = ('黑体',50))
done() #tk中的mainloop
结束语
至此,程序的编写就结束了
运行一下,看看是不是出现贪吃蛇了?如果没有一定是你打错了或复制错了
最后,我想说:
做一个小游戏,看起来简单,实现起来却很难,但只要把它剖开,就成了一个个简单
可爱的小程序。
另外,这些代码我曾经想都不敢想,直到我积累起了一定的代码量 目测不过千 才鼓起勇气挑战它。
所以,从现在开始,多写些代码吧!

浙公网安备 33010602011771号