博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
tkinter 13 贪吃蛇
阅读量:6038 次
发布时间:2019-06-20

本文共 4303 字,大约阅读时间需要 14 分钟。

  •  
  • # coding = gbk# 学习方法:有不懂的函数可以按住CTRL后单击它,进入相应的源文件,一般都有注释# 移动方法:不断的把蛇尾移动到下一步要走的位置from tkinter import *import randomclass 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 = 4app = snake()app.master.title("Greedy Snake")app.mainloop()

     

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

你可能感兴趣的文章
Ext.Msg.prompt的高级应用
查看>>
Postgres 中 to_char 格式化记录
查看>>
关于联合索引
查看>>
开源 java CMS - FreeCMS2.7 登录移动端管理中心
查看>>
Android FM模块学习之三 FM手动调频
查看>>
Python 设置系统默认编码以及其他编码问题大全
查看>>
Vbs脚本编程简明教程之十四
查看>>
如何UDP/TCP端口是否通了
查看>>
pxe实现系统的自动化安装
查看>>
Redis高可用技术解决方案总结
查看>>
Scale Out Owncloud 高可用(2)
查看>>
何为敏捷
查看>>
HA集群之四:Corosync+Pacemaker+DRBD实现HA Mysql
查看>>
服务器定义
查看>>
我的友情链接
查看>>
Javascript覆盖率(jstd)数据解析Maven插件
查看>>
MYSQL-实现ORACLE- row_number() over(partition by ) 分组排序功能
查看>>
c# 入门 例子
查看>>
HP Designjet 800PS 日常维护
查看>>
rhel7使用fdisk分区时无法使用全部分区的解决办法
查看>>