使用Python写一个贪吃蛇游戏实例代码
我在程序中加入了分数显示,三种特殊食物,将贪吃蛇的游戏逻辑写到了SnakeGame的类中,而不是在Snake类中。
特殊食物:
1.绿色:普通,吃了增加体型
2.红色:吃了减少体型
3.金色:吃了回到最初体型
4.变色食物:吃了会根据食物颜色改变蛇的颜色
#coding=UTF-8
fromTkinterimport*
fromrandomimportrandint
importtkMessageBox
classGrid(object):
def__init__(self,master=None,height=16,width=24,offset=10,grid_width=50,bg="#808080"):
self.height=height
self.width=width
self.offset=offset
self.grid_width=grid_width
self.bg=bg
self.canvas=Canvas(master,width=self.width*self.grid_width+2*self.offset,height=self.height*self.grid_width+
2*self.offset,bg=self.bg)
self.canvas.pack(side=RIGHT,fill=Y)
defdraw(self,pos,color,):
x=pos[0]*self.grid_width+self.offset
y=pos[1]*self.grid_width+self.offset
#outline属性要与网格的背景色(self.bg)相同,要不然会很丑
self.canvas.create_rectangle(x,y,x+self.grid_width,y+self.grid_width,fill=color,outline=self.bg)
classFood(object):
def__init__(self,grid,color="#23D978"):
self.grid=grid
self.color=color
self.set_pos()
self.type=1
defset_pos(self):
x=randint(0,self.grid.width-1)
y=randint(0,self.grid.height-1)
self.pos=(x,y)
defdisplay(self):
self.grid.draw(self.pos,self.color)
classSnake(object):
def__init__(self,grid,color="#000000"):
self.grid=grid
self.color=color
self.body=[(8,11),(8,12),(8,13)]
self.direction="Up"
foriinself.body:
self.grid.draw(i,self.color)
#这个方法用于游戏重新开始时初始化贪吃蛇的位置
definitial(self):
whilenotlen(self.body)==0:
pop=self.body.pop()
self.grid.draw(pop,self.grid.bg)
self.body=[(8,11),(8,12),(8,13)]
self.direction="Up"
self.color="#000000"
foriinself.body:
self.grid.draw(i,self.color)
#蛇像一个指定点移动
defmove(self,new):
self.body.insert(0,new)
pop=self.body.pop()
self.grid.draw(pop,self.grid.bg)
self.grid.draw(new,self.color)
#蛇像一个指定点移动,并增加长度
defadd(self,new):
self.body.insert(0,new)
self.grid.draw(new,self.color)
#蛇吃到了特殊食物1,剪短自身的长度
defcut_down(self,new):
self.body.insert(0,new)
self.grid.draw(new,self.color)
foriinrange(0,3):
pop=self.body.pop()
self.grid.draw(pop,self.grid.bg)
#蛇吃到了特殊食物2,回到最初长度
definit(self,new):
self.body.insert(0,new)
self.grid.draw(new,self.color)
whilelen(self.body)>3:
pop=self.body.pop()
self.grid.draw(pop,self.grid.bg)
#蛇吃到了特殊食物3,改变了自身的颜色,纯属好玩
defchange(self,new,color):
self.color=color
self.body.insert(0,new)
foriteminself.body:
self.grid.draw(item,self.color)
classSnakeGame(Frame):
def__init__(self,master):
Frame.__init__(self,master)
self.grid=Grid(master)
self.snake=Snake(self.grid)
self.food=Food(self.grid)
self.gameover=False
self.score=0
self.status=['run','stop']
self.speed=300
self.grid.canvas.bind_all("",self.key_release)
self.display_food()
#用于设置变色食物
self.color_c=("#FFB6C1","#6A5ACD","#0000FF","#F0FFF0","#FFFFE0","#F0F8FF","#EE82EE","#000000","#5FA8D9","#32CD32")
self.i=0
#界面左侧显示分数
self.m=StringVar()
self.ft1=('Fixdsys',40,"bold")
self.m1=Message(master,textvariable=self.m,aspect=5000,font=self.ft1,bg="#696969")
self.m1.pack(side=LEFT,fill=Y)
self.m.set("Score:"+str(self.score))
#这个方法用于游戏重新开始时初始化游戏
definitial(self):
self.gameover=False
self.score=0
self.m.set("Score:"+str(self.score))
self.snake.initial()
#type1:普通食物type2:减少2type3:大乐透,回到最初状态type4:吃了会变色
defdisplay_food(self):
self.food.color="#23D978"
self.food.type=1
ifrandint(0,40)==5:
self.food.color="#FFD700"
self.food.type=3
while(self.food.posinself.snake.body):
self.food.set_pos()
self.food.display()
elifrandint(0,4)==2:
self.food.color="#EE82EE"
self.food.type=4
while(self.food.posinself.snake.body):
self.food.set_pos()
self.food.display()
eliflen(self.snake.body)>10andrandint(0,16)==5:
self.food.color="#BC8F8F"
self.food.type=2
while(self.food.posinself.snake.body):
self.food.set_pos()
self.food.display()
else:
while(self.food.posinself.snake.body):
self.food.set_pos()
self.food.display()
defkey_release(self,event):
key=event.keysym
key_dict={"Up":"Down","Down":"Up","Left":"Right","Right":"Left"}
#蛇不可以像自己的反方向走
ifkey_dict.has_key(key)andnotkey==key_dict[self.snake.direction]:
self.snake.direction=key
self.move()
elifkey=='p':
self.status.reverse()
defrun(self):
#首先判断游戏是否暂停
ifnotself.status[0]=='stop':
#判断游戏是否结束
ifself.gameover==True:
message=tkMessageBox.showinfo("GameOver","yourscore:%d"%self.score)
ifmessage=='ok':
self.initial()
ifself.food.type==4:
color=self.color_c[self.i]
self.i=(self.i+1)%10
self.food.color=color
self.food.display()
self.move(color)
else:
self.move()
self.after(self.speed,self.run)
defmove(self,color="#EE82EE"):
#计算蛇下一次移动的点
head=self.snake.body[0]
ifself.snake.direction=='Up':
ifhead[1]-1<0:
new=(head[0],16)
else:
new=(head[0],head[1]-1)
elifself.snake.direction=='Down':
new=(head[0],(head[1]+1)%16)
elifself.snake.direction=='Left':
ifhead[0]-1<0:
new=(24,head[1])
else:
new=(head[0]-1,head[1])
else:
new=((head[0]+1)%24,head[1])
#撞到自己,设置游戏结束的标志位,等待下一循环
ifnewinself.snake.body:
self.gameover=True
#吃到食物
elifnew==self.food.pos:
ifself.food.type==1:
self.snake.add(new)
elifself.food.type==2:
self.snake.cut_down(new)
elifself.food.type==4:
self.snake.change(new,color)
else:
self.snake.init(new)
self.display_food()
self.score=self.score+1
self.m.set("Score:"+str(self.score))
#什么都没撞到,继续前进
else:
self.snake.move(new)
if__name__=='__main__':
root=Tk()
snakegame=SnakeGame(root)
snakegame.run()
snakegame.mainloop()
总结
以上所述是小编给大家介绍的使用Python写一个贪吃蛇游戏实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!