使用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写一个贪吃蛇游戏实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!