我在程序中加入了分数显示,三种特殊食物,将贪吃蛇的游戏逻辑写到了SnakeGame的类中,而不是在Snake类中。
特殊食物:
1.绿色:普通,吃了增加体型
2.红色:吃了减少体型
3.金色:吃了回到最初体型
4.变色食物:吃了会根据食物颜色改变蛇的颜色
#Coding=UTF-8from Tkinter import *from random import randintimport tkMessageBoxclass GrID(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) def draw(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)class Food(object): def __init__(self,grID,color = "#23D978"): self.grID = grID self.color = color self.set_pos() self.type = 1 def set_pos(self): x = randint(0,self.grID.wIDth - 1) y = randint(0,self.grID.height - 1) self.pos = (x,y) def display(self): self.grID.draw(self.pos,self.color)class Snake(object): def __init__(self,color = "#000000"): self.grID = grID self.color = color self.body = [(8,11),(8,12),13)] self.direction = "Up" for i in self.body: self.grID.draw(i,self.color) #这个方法用于游戏重新开始时初始化贪吃蛇的位置 def initial(self): while not len(self.body) == 0: pop = self.body.pop() self.grID.draw(pop,self.grID.bg) self.body = [(8,13)] self.direction = "Up" self.color = "#000000" for i in self.body: self.grID.draw(i,self.color) #蛇像一个指定点移动 def move(self,new): self.body.insert(0,new) pop = self.body.pop() self.grID.draw(pop,self.grID.bg) self.grID.draw(new,self.color) #蛇像一个指定点移动,并增加长度 def add(self,new) self.grID.draw(new,self.color) #蛇吃到了特殊食物1,剪短自身的长度 def cut_down(self,self.color) for i in range(0,3): pop = self.body.pop() self.grID.draw(pop,self.grID.bg) #蛇吃到了特殊食物2,回到最初长度 def init(self,self.color) while len(self.body) > 3: pop = self.body.pop() self.grID.draw(pop,self.grID.bg) #蛇吃到了特殊食物3,改变了自身的颜色,纯属好玩 def change(self,new,color): self.color = color self.body.insert(0,new) for item in self.body: self.grID.draw(item,self.color)class SnakeGame(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("<keyrelease>",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)) #这个方法用于游戏重新开始时初始化游戏 def initial(self): self.gameover = False self.score = 0 self.m.set("score:"+str(self.score)) self.snake.initial() #type1:普通食物 type2:减少2 type3:大乐透,回到最初状态 type4:吃了会变色 def display_food(self): self.food.color = "#23D978" self.food.type = 1 if randint(0,40) == 5: self.food.color = "#FFD700" self.food.type = 3 while (self.food.pos in self.snake.body): self.food.set_pos() self.food.display() elif randint(0,4) == 2: self.food.color = "#EE82EE" self.food.type = 4 while (self.food.pos in self.snake.body): self.food.set_pos() self.food.display() elif len(self.snake.body) > 10 and randint(0,16) == 5: self.food.color = "#BC8F8F" self.food.type = 2 while (self.food.pos in self.snake.body): self.food.set_pos() self.food.display() else: while (self.food.pos in self.snake.body): self.food.set_pos() self.food.display() def key_release(self,event): key = event.keysym key_dict = {"Up": "Down","Down": "Up","left": "Right","Right": "left"} #蛇不可以像自己的反方向走 if key_dict.has_key(key) and not key == key_dict[self.snake.direction]: self.snake.direction = key self.move() elif key == 'p': self.status.reverse() def run(self): #首先判断游戏是否暂停 if not self.status[0] == 'stop': #判断游戏是否结束 if self.gameover == True: message = tkMessageBox.showinfo("Game Over","your score: %d" % self.score) if message == 'ok': self.initial() if self.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) def move(self,color="#EE82EE"): # 计算蛇下一次移动的点 head = self.snake.body[0] if self.snake.direction == 'Up': if head[1] - 1 < 0: new = (head[0],16) else: new = (head[0],head[1] - 1) elif self.snake.direction == 'Down': new = (head[0],(head[1] + 1) % 16) elif self.snake.direction == 'left': if head[0] - 1 < 0: new = (24,head[1]) else: new = (head[0] - 1,head[1]) else: new = ((head[0] + 1) % 24,head[1]) #撞到自己,设置游戏结束的标志位,等待下一循环 if new in self.snake.body: self.gameover=True #吃到食物 elif new == self.food.pos: if self.food.type == 1: self.snake.add(new) elif self.food.type == 2: self.snake.cut_down(new) elif self.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写一个贪吃蛇游戏实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持!
总结以上是内存溢出为你收集整理的使用Python写一个贪吃蛇游戏实例代码全部内容,希望文章能够帮你解决使用Python写一个贪吃蛇游戏实例代码所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)