Python写的贪吃蛇游戏例子
第一次用Python写这种比较实用且好玩的东西,权当练手吧
游戏说明:
*P键控制“暂停/开始”
*方向键控制贪吃蛇的方向
源代码如下:
fromTkinterimport* importtkMessageBox,sys fromrandomimportrandint
classGrid(object): def__init__(self,master=None,window_width=800,window_height=600,grid_width=50,offset=10): self.height=window_height self.width=window_width self.grid_width=grid_width self.offset=offset self.grid_x=self.width/self.grid_width self.grid_y=self.height/self.grid_width self.bg="#EBEBEB" self.canvas=Canvas(master,width=self.width+2*self.offset,height=self.height+2*self.offset,bg=self.bg) self.canvas.pack() self.grid_list() defdraw(self,pos,color,): x=pos[0]*self.grid_width+self.offset y=pos[1]*self.grid_width+self.offset self.canvas.create_rectangle(x,y,x+self.grid_width,y+self.grid_width,fill=color,outline=self.bg) defgrid_list(self): grid_list=[] foryinrange(0,self.grid_y): forxinrange(0,self.grid_x): grid_list.append((x,y)) self.grid_list=grid_list classFood(object): def__init__(self,Grid): self.grid=Grid self.color="#23D978" self.set_pos() defset_pos(self): x=randint(0,self.grid.grid_x-1) y=randint(0,self.grid.grid_y-1) self.pos= (x,y) defdisplay(self): self.grid.draw(self.pos,self.color) classSnake(object): def__init__(self,Grid): self.grid=Grid self.body=[(10,6),(10,7),(10,8)] self.direction="Up" self.status=['run','stop'] self.speed=300 self.color="#5FA8D9" self.food=Food(self.grid) self.display_food() self.gameover=False self.score=0 defavailable_grid(self): return[iforiinself.grid.grid_listifinotinself.body[2:]] defchange_direction(self,direction): self.direction=direction defdisplay(self): for(x,y)inself.body: self.grid.draw((x,y),self.color) defdisplay_food(self): while(self.food.posinself.body): self.food.set_pos() self.food.display() defmove(self): head=self.body[0] ifself.direction=='Up': new=(head[0],head[1]-1) elifself.direction=='Down': new=(head[0],head[1]+1) elifself.direction=='Left': new=(head[0]-1,head[1]) else: new=(head[0]+1,head[1]) ifnotself.food.pos==head: pop=self.body.pop() self.grid.draw(pop,self.grid.bg) else: self.display_food() self.score+=1 self.body.insert(0,new) ifnotnewinself.available_grid(): self.status.reverse() self.gameover=True else: self.grid.draw(new,color=self.color) classSnakeGame(Frame): def__init__(self,master=None,*args,**kwargs): Frame.__init__(self,master) self.master=master self.grid=Grid(master=master,*args,**kwargs) self.snake=Snake(self.grid) self.bind_all("",self.key_release) self.snake.display() defrun(self): ifnotself.snake.status[0]=='stop': self.snake.move() ifself.snake.gameover==True: message= tkMessageBox.showinfo("GameOver","yourscore:%d"%self.snake.score) ifmessage=='ok': sys.exit() self.after(self.snake.speed,self.run) 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.change_direction(key) self.snake.move() elifkey=='p': self.snake.status.reverse() if__name__=='__main__': root=Tk() snakegame=SnakeGame(root) snakegame.run() snakegame.mainloop()