Loading

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

结束语

至此,程序的编写就结束了
运行一下,看看是不是出现贪吃蛇了?如果没有一定是你打错了或复制错了
最后,我想说:

做一个小游戏,看起来简单,实现起来却很难,但只要把它剖开,就成了一个个简单可爱的小程序。

另外,这些代码我曾经想都不敢想,直到我积累起了一定的代码量 目测不过千 才鼓起勇气挑战它。

所以,从现在开始,多写些代码吧!

posted @ 2022-06-06 22:09  整齐的艾萨克  阅读(261)  评论(0)    收藏  举报