tkinter 13 贪吃蛇

  •  
  • # coding = gbk
    # 学习方法:有不懂的函数可以按住CTRL后单击它,进入相应的源文件,一般都有注释
    # 移动方法:不断的把蛇尾移动到下一步要走的位置
    from tkinter import *
    import random
    class snake(Frame):#snake继承自Frame
            def __init__(self, master=None):
                    Frame.__init__(self, master)#Frame容器默认没有父窗口
                    self.body = [(0,0)]# 蛇的身体组成
                    self.bodyid = []# 每一个元素都是随机生成的食物的标识号
                    self.food = [ -1, -1 ]# 食物的坐标
                    self.foodid = -1# create_rectangle()创建的食物的唯一标识号,可以代表食物
                    self.gridcount = 10# 10*10的网格
                    self.size = 500# 整个窗口的大小
                    self.di = 3# 表示蛇的当前走向,1234分别表示上、右、下、左
                    self.speed = 100
    
                    # 使顶层窗口不可调整大小
                    self.top = self.winfo_toplevel()#""Return the toplevel widget of this widget."""
                    self.top.resizable(False, False)#resizable可调整大小全部设为False
    
                    self.grid()# pack grid place 放置位置,显示出来
                    self.canvas = Canvas(self)# 画布的父窗口为snake对象
                    self.canvas.grid()# pack grid place 放置位置,显示出来
                    self.canvas.config(width=self.size, height=self.size,relief=RIDGE)# relief不知道干什么,不加也可以
    
                    self.drawgrid()#画布上画网格
                    s = self.size/self.gridcount
                    id = self.canvas.create_rectangle(self.body[0][0]*s,self.body[0][1]*s,# 绘制蛇头
                            (self.body[0][0]+1)*s, (self.body[0][1]+1)*s, fill="yellow")
                    self.bodyid.insert(0, id)
                    self.bind_all("", self.keyrelease)# 将事件和函数进行绑定
                    self.drawfood()
                    self.drawsnake()
            def drawgrid(self):
                    s = self.size/self.gridcount
                    for i in range(0, self.gridcount+1):
                            self.canvas.create_line(i*s, 0, i*s, self.size)
                            self.canvas.create_line(0, i*s, self.size, i*s)
            def drawsnake(self):
                    s = self.size/self.gridcount
                    head = self.body[0]
                    new = [head[0], head[1]]
                    if self.di == 1:#
                            new[1] = (head[1]-1) % self.gridcount
                    elif self.di == 2:#
                            new[0] = (head[0]+1) % self.gridcount
                    elif self.di == 3:#
                            new[1] = (head[1]+1) % self.gridcount
                    else:#
                            new[0] = (head[0]-1) % self.gridcount
                    next = ( new[0], new[1] )
                    if next in self.body:
                            pass
                           # exit()# 下一步撞到了身体,死了
                    elif next == (self.food[0], self.food[1]):# 下一步撞到食物
                            self.body.insert(0, next)# 食物变蛇头
                            self.bodyid.insert(0, self.foodid)
                            self.drawfood()
                    else:
                            tail = self.body.pop()# 去蛇尾
                            id = self.bodyid.pop()# 去蛇尾
                            self.canvas.move(id, (next[0]-tail[0])*s, (next[1]-tail[1])*s)# 把蛇尾移动到下一步要走的位置
                            self.body.insert(0, next)# 加蛇头
                            self.bodyid.insert(0, id)# 加蛇头
    
                    self.after(self.speed, self.drawsnake)# 在给定时间(ms)后再次调用函数
            def drawfood(self):
                    s = self.size/self.gridcount
                    x = random.randrange(0, self.gridcount)
                    y = random.randrange(0, self.gridcount)
                    while (x, y) in self.body:# 当食物在身体里面时重新生成食物
                            x = random.randrange(0, self.gridcount)
                            y = random.randrange(0, self.gridcount)
                    id = self.canvas.create_rectangle(x*s,y*s, (x+1)*s, (y+1)*s, fill="yellow")# create_rectangle()的返回值是所创建的矩形的标识号
                    print(id)
                    self.food[0] = x
                    self.food[1] = y
                    self.foodid = id
            def keyrelease(self, event):
                    if event.keysym == "Up" and self.di != 3:# 蛇不可以像自己的反方向走
                            self.di = 1
                    elif event.keysym == "Right" and self.di !=4:# 蛇不可以像自己的反方向走
                            self.di = 2
                    elif event.keysym == "Down" and self.di != 1:# 蛇不可以像自己的反方向走
                            self.di = 3
                    elif event.keysym == "Left" and self.di != 2:# 蛇不可以像自己的反方向走
                            self.di = 4
    
    app = snake()
    app.master.title("Greedy Snake")
    app.mainloop()

     

转载于:https://www.cnblogs.com/jkn1234/p/8859244.html

你可能感兴趣的:(tkinter 13 贪吃蛇)