目录
一、实验目的
1.实现基本的贪吃蛇的运动操作
2.实现AI蛇的自动运动
3.实现360°全方位运动
4.实现积分,死亡,加速等操作
二、实验内容
- 初始化蛇操作
- AI蛇路径选择
- 碰撞检测
- 蛇头方向转换
- AI蛇死亡检测,死亡后随机一个区域内生成等值的饼
- 超时检测
- 蛇运动操作
- 游戏封装发
三、实验过程展示
3.1 初始化蛇体操作
初始化操作主要分为游戏全局初始化和蛇体初始化。
本游戏设置1条玩家操作蛇和6条AI自动蛇。首先我们定义Snake类,其中包括游戏开发时需要的所有组件,蛇头、身体、方向、猎捕点集、是否存活等。代码如下:
接下来我们定义全局的饼位置初始化,以及蛇的长度,颜色初始化。这里主要是针对AI蛇的初始化,代码如下:
蛇体组件初始化,这里主要是将蛇头的坐标初始化,并使用append函数加入到body中,并且赋值大小为bodysize。同时定义第二个点,有两个用处,第一判断此时蛇头的方向角,第二填充body。
这里要注意,初始化生成蛇的位置不能太靠近游戏的边界,否则会出现刚刚生成就碰撞死亡的现象。其次,我们的蛇身体不是点,是一个圆,所以要考虑到半径的问题,所以在生成的时候要加上半径,否则会导致身体超出边界。
代码如下:
3.2 方向判断
AI蛇没有鼠标进行方向指引,所以需要给它一个方向才能进行接下来的路径规划和运动。我编写了JodjePoint()函数来进行方向的选择。
这里的返回值为true和false,主要是反馈当前的方向是否需要变化,false表示需要以及更新direction和rewardList,用新的路径行走,true表示不需要变化,函数主体代码如下:
贪吃蛇问题,涉及到饼位置随机变换,AI蛇相对位置不固定等问题,导致地图中没有相对固定的点集,所以无法实时的通过迪杰斯特拉算法求出蛇头和最多的饼之间的最短路径。
所以这里我们采取动态规划思路,简而言之就是“当前最优”。通过广度优先搜索rewardList表,找到蛇头目前和现有的所有的饼中哪一个最近,然后更新hunt猎杀标志位,同时反馈角度和距离到direction中。广度优先搜索的代码如下:
这里在编写是会遇到一个问题:如果此时两条蛇均定位到同一个点,遵循游戏规则,如何实现饼的分配和避让
针对这个问题,我们采取实时检测蛇列表snakelist的动态,如果发现不匹配,说明此位置蛇死亡,更新饼rewardPoint列表,重复广度优先搜索操作,
这里要时刻记住python中atan函数求出来的角度是当前坐标系下的角度,需要转换为四个象限,分别加90,180,360。设置标志位que和临时标志位q,que的作用就是,放入for循环中返回最短距离点的下标。
在这里我们要注意一个角度的问题,根据网络上贪吃蛇大作战的游戏规则,蛇是无法直接掉头的,也就是说我们要计算一个向左和向右的极限角度,如下如所示,极限旋转角度为20°和340°,所以我们在书写代码的时候要加上判断
3.3 路径规划
pathDecision()函数主要是通过调用JudgePoint()函数更新当前的rewardList表格和Snake类中的猎杀目标信息hunt,通过JudgePoint()函数反馈的是否需要更新当前路由,来调用addRecF()函数进行蛇体的前进。
所用到的代码如下,遍历饼列表的核心思想还是广度优先搜索。
3.4 死亡检测/碰撞检测
蛇死亡主要分为两种:碰到边界死亡和撞到别的蛇身体死亡,这里我们编写函数aiisDead()来检测蛇是否死亡。
函数体中我们会发现,需要分为两个个检测阶段:
第一:检测是否碰到边界(考虑蛇每个节点是圆形,因此需要减去半径)
第二:检测当蛇列表不匹配时,蛇和列表中所有的蛇的body列表中是否有距离小于10 (蛇节点半径),这里采用for循环直接暴力求解。
3.5 鼠标监听和动作转换
调用pygame中的event()组件中的get()函数,实时反馈当前界面的所有外设动态。
为实现项目特色:用鼠标指引蛇方向,我们调用了event组件中的pos函数,实时反馈鼠标的坐标,将其反馈给Snake类中的方向参数,实现全方位的移动。
同时调用键盘接口函数KEYDOWN实时监听键盘按键,并通过a,b键操纵目标移动的速度,return键复活。
最后调用diplay组件中的update()函数,实现对游戏的刷新。
具体代码如下:
3.6 绘画蛇体和饼
绘画蛇体,调用pygame内部的draw组件,参考网络游戏贪吃蛇大作战,我将蛇身体用圆点进行展示,调用组件中的circle()函数。
代码如下:
遍历蛇的身体,获取body列表中的坐标。
相似的操作,遍历rewardList中所有的饼,获取饼的坐标进行打印,调用pygame中的draw组件。
代码如下:
四、实验成果
4.1运行界面展示
点击运行,正常进入运行界面,如下图所示:
4.2 阵亡界面展示
触到边界或者碰到别的蛇的body,导致蛇死亡,界面如下:
4.3 封装展示
使用pyinstaller将代码封装成.exe文件,可以更好的方便用户使用,方便后期发布游戏等操作。
如下图:
五、实验代码
import random, pygame,sys,math,operator
from pygame.locals import *
pygame.init()
fps=10
Width = 1000
Height= 900
mystep=8
quit=True
clock=pygame.time.Clock()
window=pygame.display.set_mode((Width,Height))
pygame.display.set_caption('THT的贪吃蛇')
size=5
size1=10
size2=20
size3=30
bodysize=16
WHITE = (255, 255, 255)
BLACK = ( 0, 0, 0)
BLUE = ( 58, 95, 205)
RED = (178, 34, 34)
ORANGE = (255, 165, 0)
PURPLE = (180, 82, 205)
PINK = (235, 121, 159)
GREEN = (102, 205, 170)
DARKGREEN = ( 0, 155, 0)
DARKGRAY = ( 40, 40, 40)
color=[BLUE,ORANGE,PURPLE,PINK,GREEN,DARKGREEN]
class Snake():
length=0
direction=0
live=1
kill=0
hunt=0
huntx=0
hunty=0
flage=0
step=8
ai=False
foodtimeflage=0
color=RED
body=[]
food=[]
def init(self):
self.length=self.direction=self.kill=self.huntx=self.hunty=self.hunt=self.foodtimeflage=0
self.hunt=0
self.step=8
self.live=1
self.flage=0
self.body=[]
snake=Snake()
snake1=Snake()
snake2=Snake()
snake3=Snake()
snake4=Snake()
snake5=Snake()
snake6=Snake()
snakelist=[snake1,snake2,snake3,snake4,snake5,snake6]
rewardNode=[]
snakefood=[[],[],[],[],[],[]]
def init():
initsnake(snake)
for i in range(len(snakelist)):
initsnake(snakelist[i])
snakelist[i].ai = True
snakelist[i].hunt = i
snakelist[i].color=color[i]
snakelist[i].food.clear()
rewardNode.clear()
for food in snakefood:
food.clear()
for i in range(6):
rewardNode.append([random.randint(0,Width-size1),random.randint(0,Height-size1),size1,size1])
def initsnake(Snake):
Snake.init()
Snake.body.append([random.randint(10, Width - bodysize * 2), random.randint(10, Height - bodysize * 5), bodysize, bodysize])
Snake.body.append([Snake.body[0][0], Snake.body[0][1] + bodysize / 2, bodysize, bodysize])
Snake.body.append([Snake.body[1][0], Snake.body[1][1] + bodysize / 2, bodysize, bodysize])
if Snake.ai:
Snake.color = color[snakelist.index(Snake)]
Snake.hunt=snakelist.index(Snake)
def timeout(Snake):
Snake.flage=0
if not Snake.ai:
Snake.flage=1
for food in rewardNode:
dist=round(math.sqrt((Snake.body[0][0]+Snake.body[0][2]//2-food[0]-food[2]//2)*(Snake.body[0][0]+Snake.body[0][2]//2-food[0]-food[2]//2)+(Snake.body[0][1]+Snake.body[0][2]//2-food[1]-food[2]//2)*(Snake.body[0][1]+Snake.body[0][2]//2-food[1]-food[2]//2)))
if dist<=food[2]//2+Snake.body[0][2]//2:
if food[2]==size1:
Snake.flage+=2
elif food[2]==size2:
Snake.flage+=3
size=food[2]
i=rewardNode.index(food)
rewardNode[i]=[random.randint(0,Width-size1),random.randint(0,Height-size1),size,size]
for fo in snakefood:
for food in fo:
dist = round(math.sqrt((Snake.body[0][0] + Snake.body[0][2] // 2 - food[0] - food[2] // 2) * (Snake.body[0][0] + Snake.body[0][2] // 2 - food[0] - food[2] // 2) + (Snake.body[0][1] + Snake.body[0][2] // 2 - food[1] - food[2] // 2) * (Snake.body[0][1] + Snake.body[0][2] // 2 - food[1] - food[2] // 2)))
if dist<=food[2]//2+Snake.body[0][2]//2:
Snake.flage += 1
size = food[2]
fo.remove(food)
while Snake.flage:
addRectF(Snake)
Snake.flage-=1
if Snake.ai:
pathDecide(Snake)
else:
Snake.flage=1
Snake.body.pop()
snake.foodtimeflage+=1
if snake.foodtimeflage==180:
while len(rewardNode)>60:
del rewardNode[random.randint(0,len(rewardNode)-1)]
rewardNode.append([random.randint(0,Width-size1),random.randint(0,Height-size1),size1,size1])
if random.randint(0,5)==3:
rewardNode.append([random.randint(0, Width - size1), random.randint(0, Height - size1), size2, size2])
snake.foodtimeflage=0
def aitimeout():
for lsnake in snakelist:
aiisDead(lsnake)
if lsnake.live==0:
aiDeath(lsnake)
else:
timeout(lsnake)
def pathDecide(Snake):
dist=[]
direction=Snake.direction
hx=Snake.body[0][0]
hy=Snake.body[0][1]
if judgePoint(Snake):
for food in rewardNode:
xx = food[0]
yy = food[1]
dis = round(math.sqrt((hx - xx) * (hx - xx) + (hy - yy) * (hy - yy)))
dist.append(dis)
smalldist=10000
smalli=0
for i in range(len(dist)):
if dist[i]<smalldist:
smalldist=dist[i]
smalli=i
Snake.hunt=smalli
Snake.huntx=rewardNode[Snake.hunt][0]
Snake.hunty=rewardNode[Snake.hunt][1]
addRectF(Snake)
def judgePoint(Snake):
que=random.randint(0,len(rewardNode))
q=que
if (Snake.body[0][0]<=5 and (Snake.direction>180 or Snake.direction<360)):
Snake.hunt=random.randint(0,len(rewardNode))
return False
elif ((Snake.body[0][1]<=5) and ((Snake.direction>=0 and Snake.direction<90) or (Snake.direction>270 and Snake.direction<=360))):
Snake.hunt=random.randint(0,len(rewardNode))
return False
elif ((Snake.body[0][0]>=Width-5) and (Snake.direction>0 or Snake.direction<180)):
Snake.hunt=random.randint(0,len(rewardNode))
return False
elif ((Snake.body[0][1]>=Height-5) and (Snake.direction>90 or Snake.direction<270)):
Snake.hunt=random.randint(0,len(rewardNode))
return False
dir=[]
for food in rewardNode:
huntx=food[0]
hunty=food[1]
hx=Snake.body[0][0]
hy=Snake.body[0][1]
if huntx >= hx and hy > hunty:
direction = round(math.atan((huntx - hx) / (hy - hunty)) * 180 / math.pi)
elif huntx > hx and hunty >= hy:
direction = round(math.atan((hunty - hy) / (huntx - hx)) * 180 / math.pi) + 90
elif hx >= huntx and hunty > hy:
direction = round(math.atan((hx - huntx) / (hunty - hy)) * 180 / math.pi) + 180
elif hx > huntx and hy >= hunty:
direction = round(math.atan((hy - hunty) / (hx - huntx)) * 180 / math.pi) + 270
dist=round(math.sqrt((huntx-hx)*(huntx-hx)+(hunty-hy)*(hunty-hy)))
dir.append([direction,dist])
for i in range(len(dir)):
d=dir[0][1]
if Snake.direction>=135 and Snake.direction<=180:
if dir[i][0]>=round(180-Snake.direction+360-45)%360 or dir[i][0]<=round(180-Snake.direction+45+360)%360:
if d>dir[i][1]:
d=dir[i][1]
que=i
elif Snake.direction>=180 and Snake.direction<=225:
if dir[i][0]>=round(Snake.direction-180+45+360)%360 or dir[i][0]<=round(Snake.direction+45+360-180)%360:
if d>dir[i][1]:
d=dir[i][1]
que=i
else:
if dir[i][0]>=round(Snake.direction-45+360+180)%360 and dir[i][0]<=round(Snake.direction+45+360+180)%360:
if d>dir[i][1]:
d=dir[i][1]
que=i
x=Snake.body[0][0]-round(200*math.sin(Snake.direction/180*math.pi))
y=Snake.body[0][1]+round(200*math.cos(Snake.direction/180*math.pi))
if x<=0:
x=10
if y<=0:
y=10
if(x>=Width):
x=980
if(y>=Height):
y=780
for snake in snakelist:
if snakelist.index(snake)!=snakelist.index(Snake):
for body in snake.body:
hx = Snake.body[0][0]
hy = Snake.body[0][1]
huntx=body[0]+body[2]
hunty=body[1]+body[2]
if huntx >= hx and hy > hunty:
direction = round(math.atan((huntx - hx) / (hy - hunty)) * 180 / math.pi)
elif huntx > hx and hunty >= hy:
direction = round(math.atan((hunty - hy) / (huntx - hx)) * 180 / math.pi) + 90
elif hx >= huntx and hunty > hy:
direction = round(math.atan((hx - huntx) / (hunty - hy)) * 180 / math.pi) + 180
elif hx > huntx and hy >= hunty:
direction = round(math.atan((hy - hunty) / (hx - huntx)) * 180 / math.pi) + 270
if Snake.direction<=20 or Snake.direction>=340:
if direction>=round(Snake.direction-20+360)%360 or direction<=round(Snake.direction+20+360)%360:
dist=round(math.sqrt((huntx-hx)*(huntx-hx)+(hunty-hy)*(hunty-hy)))
if dist<=50:
if que==q:
if len(rewardNode)>=55:
se=random.randint(0,len(rewardNode)-1)
rewardNode[se]=[random.randint(0,Width-size1),random.randint(0,Height-size1),size1,size1]
que=se
else:
rewardNode.append([random.randint(0,Width-size1),random.randint(0,Height-size1),size1,size1])
que=len(rewardNode)-1
Snake.hunt=que
Snake.direction=round(Snake.direction+150)%360
# addRectF(Snake)
# del Snake.body[len(Snake.body)-1]
# addRectF(Snake)
# del Snake.body[len(Snake.body) - 1]
return False
else:
if direction>=round(Snake.direction-20+360)%360 and direction<=round(Snake.direction+20+360)%360:
dist = round(math.sqrt((huntx - hx) * (huntx - hx) + (hunty - hy) * (hunty - hy)))
if dist <= 50:
if que == q:
if len(rewardNode) >= 55:
se = random.randint(0, len(rewardNode) - 1)
rewardNode[se] = [random.randint(0, Width - size1), random.randint(0, Height - size1),size1, size1]
que = se
else:
rewardNode.append([random.randint(0, Width - size1), random.randint(0, Height - size1), size1, size1])
que = len(rewardNode) - 1
Snake.hunt = que
Snake.direction = round(Snake.direction + 150) % 360
# addRectF(Snake)
# del Snake.body[len(Snake.body) - 1]
# addRectF(Snake)
# del Snake.body[len(Snake.body) - 1]
return False
for body in snake.body:
hx = Snake.body[0][0]
hy = Snake.body[0][1]
huntx = body[0] + body[2]
hunty = body[1] + body[2]
if huntx >= hx and hy > hunty:
direction = round(math.atan((huntx - hx) / (hy - hunty)) * 180 / math.pi)
elif huntx > hx and hunty >= hy:
direction = round(math.atan((hunty - hy) / (huntx - hx)) * 180 / math.pi) + 90
elif hx >= huntx and hunty > hy:
direction = round(math.atan((hx - huntx) / (hunty - hy)) * 180 / math.pi) + 180
elif hx > huntx and hy >= hunty:
direction = round(math.atan((hy - hunty) / (hx - huntx)) * 180 / math.pi)
if Snake.direction <= 45 or Snake.direction >= 315:
if direction >= round(Snake.direction - 45 + 360) % 360 or direction <= round(Snake.direction + 45 + 360) % 360:
dist = round(math.sqrt((huntx - hx) * (huntx - hx) + (hunty - hy) * (hunty - hy)))
if dist <= 50:
if que == q:
if len(rewardNode) >= 55:
se = random.randint(0, len(rewardNode) - 1)
rewardNode[se] = [random.randint(0, Width - size1), random.randint(0, Height - size1), size1,size1]
que = se
else:
rewardNode.append([random.randint(0, Width - size1), random.randint(0, Height - size1), size1, size1])
que = len(rewardNode) - 1
Snake.hunt = que
Snake.direction = round(Snake.direction + 150) % 360
# addRectF(Snake)
# del Snake.body[len(Snake.body) - 1]
# addRectF(Snake)
# del Snake.body[len(Snake.body) - 1]
return False
else:
if direction >= round(Snake.direction - 45 + 360) % 360 and direction <= round(Snake.direction + 45 + 360) % 360:
dist = round(math.sqrt((huntx - hx) * (huntx - hx) + (hunty - hy) * (hunty - hy)))
if dist <= 50:
if que == q:
if len(rewardNode) >= 55:
se = random.randint(0, len(rewardNode) - 1)
rewardNode[se] = [random.randint(0, Width - size1), random.randint(0, Height - size1), size1,size1]
que = se
else:
rewardNode.append([random.randint(0, Width - size1), random.randint(0, Height - size1), size1, size1])
que = len(rewardNode) - 1
Snake.hunt = que
Snake.direction = round(Snake.direction + 150) % 360
# addRectF(Snake)
# del Snake.body[len(Snake.body) - 1]
# addRectF(Snake)
# del Snake.body[len(Snake.body) - 1]
return False
if rewardNode[Snake.hunt] ==[]:
Snake.hunt=random.randint(0,len(rewardNode))
return False
return True
def aiisDead(Snake):
if Snake.body[0][0]<=0 or Snake.body[0][1]<=0 or Snake.body[0][0]>=Width-Snake.body[0][2] or Snake.body[0][1]>=Height-Snake.body[0][2]:
Snake.live=0
return True
for lsnake in snakelist:
if snakelist.index(lsnake)!=snakelist.index(Snake):
for body in lsnake.body:
if math.sqrt(((Snake.body[0][0] + Snake.body[0][2] // 2) - (body[0] + body[2] // 2)) * (
(Snake.body[0][0] + Snake.body[0][2] // 2) - (body[0] + body[2] // 2)) + (
(Snake.body[0][1] + Snake.body[0][2] // 2) - (body[1] + body[2] // 2)) * (
(Snake.body[0][1] + Snake.body[0][2] // 2) - (body[1] + body[2] // 2))) <= 10:
Snake.live=0
return True
for body in snake.body:
if math.sqrt(((Snake.body[0][0]+Snake.body[0][2]//2)-(body[0]+body[2]//2))*((Snake.body[0][0]+Snake.body[0][2]//2)-(body[0]+body[2]//2))+((Snake.body[0][1]+Snake.body[0][2]//2)-(body[1]+body[2]//2))*((Snake.body[0][1]+Snake.body[0][2]//2)-(body[1]+body[2]//2)))<=10:
Snake.live = 0
snake.kill+=1
return True
return False
def isDead(Snake):
if Snake.body[0][0]<=0 or Snake.body[0][1]<=0 or Snake.body[0][0]>=Width-Snake.body[0][2] or Snake.body[0][1]>=Height-Snake.body[0][2]:
Snake.live=0
return True
for lsnake in snakelist:
for body in lsnake.body:
if math.sqrt(((Snake.body[0][0] + Snake.body[0][2] // 2) - (body[0] + body[2] // 2)) * (
(Snake.body[0][0] + Snake.body[0][2] // 2) - (body[0] + body[2] // 2)) + (
(Snake.body[0][1] + Snake.body[0][2] // 2) - (body[1] + body[2] // 2)) * (
(Snake.body[0][1] + Snake.body[0][2] // 2) - (body[1] + body[2] // 2))) <= 10:
Snake.live=0
return True
return False
def aiDeath(Snake):
if Snake.live==0:
for body in Snake.body:
x=body[0]
y=body[1]
s=body[2]
Snake.body.pop()
snakefood[snakelist.index(Snake)].append([x+random.randint(0,5)*10,y+random.randint(0,5)*10,s//2,s//2])
Snake.body.clear()
initsnake(Snake)
Snake.live=1
def addRectF(Snake):
hx=Snake.body[0][0]
hy=Snake.body[0][1]
if Snake.ai:
huntx=rewardNode[Snake.hunt][0]
hunty=rewardNode[Snake.hunt][1]
else:
huntx=Snake.huntx
hunty=Snake.hunty
direction=Snake.direction
if huntx>=hx and hy>hunty:
direction=round(math.atan((huntx-hx)/(hy-hunty))*180/math.pi)
elif huntx>hx and hunty>=hy:
direction=round(math.atan((hunty-hy)/(huntx-hx))*180/math.pi)+90
elif hx>=huntx and hunty>hy:
direction=round(math.atan((hx-huntx)/(hunty-hy))*180/math.pi)+180
elif hx>huntx and hy>=hunty :
direction=round(math.atan((hy-hunty)/(hx-huntx))*180/math.pi)+270
if (Snake.direction-direction+360)%360>=175 and (Snake.direction-direction+360)%360<=185:
direction+=30
Snake.direction=direction%360
Snake.body.insert(0,[Snake.body[0][0]+round(Snake.step*math.sin(Snake.direction/180*math.pi)),Snake.body[0][1]-round(Snake.step*math.cos(Snake.direction/180*math.pi)),Snake.body[0][2],Snake.body[0][2]])
def printsnake(Snake,col):
for fo in snakefood:
for food in fo:
foodsize = food[2]//3
foodx=int(food[0]+food[2]//2)
foody=int(food[1]+food[2]//2)
pos=foodx,foody
pygame.draw.circle(window, color[snakefood.index(fo)], pos, foodsize, 0)
for body in Snake.body:
bodysize=body[2]
hx=int(body[0]+bodysize//2)
hy=int(body[1]+bodysize//2)
pos=hx,hy
pygame.draw.circle(window, col, pos, bodysize//2,0 )
pygame.draw.circle(window, BLACK, pos, bodysize//2,1)
def printrewardNode():
for body in rewardNode:
bodysize = body[2]
hx = int(body[0] + bodysize // 2)
hy = int(body[1] + bodysize // 2)
pos = hx, hy
pygame.draw.circle(window, WHITE, pos, bodysize // 2, 0)
def printtext():
textFont = pygame.font.SysFont("simsunnsimsun", 20)
textSurface = textFont.render("得分: "+str(len(snake.body)), True, WHITE)
window.blit(textSurface, (20,30))
textSurface = textFont.render("击杀: " + str(snake.kill), True, WHITE)
window.blit(textSurface, (20,60))
textSurface = textFont.render("排行榜: " , True, WHITE)
window.blit(textSurface, (700, 5))
rect=[(720,30),(720,55),(720,80),(720,105),(720,130),(720,155),(720,180)]
seq=[]
seq.append([6,len(snake.body)])
for lsnake in snakelist:
seq.append([snakelist.index(lsnake),len(lsnake.body)])
seq.sort(key=operator.itemgetter(1),reverse=True)
name=['小蓝','小橙','小紫','小粉','小青','小绿','我的']
for paixu in seq:
textSurface = textFont.render(str(seq.index(paixu)+1)+'. '+name[paixu[0]]+' '+str(paixu[1]), True, WHITE)
window.blit(textSurface, rect[seq.index(paixu)])
init()
while quit:
if snake.live==1:
clock.tick(fps)
pygame.draw.rect(window, BLACK, (0, 0, Width, Height))
aitimeout()
timeout(snake)
for event in pygame.event.get():
if event.type == pygame.QUIT:
quit = False
if event.type == MOUSEMOTION:
snake.huntx, snake.hunty = event.pos
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_a:
snake.step = 12
if event.key == pygame.K_RETURN:
snake.live = 1
if event.key==pygame.K_b:
snake.step = 8
printrewardNode()
for i in range(len(snakelist)):
printsnake(snakelist[i], snakelist[i].color)
printsnake(snake, snake.color)
isDead(snake)
printtext()
else:
textFont = pygame.font.SysFont("simsunnsimsun", 100)
textSurface = textFont.render("GAME OVER!!!!", True, WHITE)
window.blit(textSurface, (200, 300))
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RETURN:
snake.live = 1
init()
if event.type == pygame.QUIT:
quit = False
pygame.display.update()