说明:利用tkinter结合面向对象思想进行一个贪吃蛇小游戏开发。

# coding = gbk
# 学习方法:有不懂的函数可以按住CTRL后单击它,进入相应的源文件,一般都有注释
# 移动方法:不断的把蛇尾移动到下一步要走的位置
from tkinter import *
import random
class snake(Frame):#snake继承自Framedef __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可调整大小全部设为Falseself.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.gridcountid = 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("<KeyRelease>", self.keyrelease)# 将事件和函数进行绑定self.drawfood()self.drawsnake()def drawgrid(self):s = self.size/self.gridcountfor 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.gridcounthead = self.body[0]new = [head[0], head[1]]if self.di == 1:# 上new[1] = (head[1]-1) % self.gridcountelif self.di == 2:# 右new[0] = (head[0]+1) % self.gridcountelif self.di == 3:# 下new[1] = (head[1]+1) % self.gridcountelse:# 左new[0] = (head[0]-1) % self.gridcountnext = ( 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.gridcountx = 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] = xself.food[1] = yself.foodid = iddef keyrelease(self, event):if event.keysym == "Up" and self.di != 3:# 蛇不可以像自己的反方向走self.di = 1elif event.keysym == "Right" and self.di !=4:# 蛇不可以像自己的反方向走self.di = 2elif event.keysym == "Down" and self.di != 1:# 蛇不可以像自己的反方向走self.di = 3elif event.keysym == "Left" and self.di != 2:# 蛇不可以像自己的反方向走self.di = 4app = snake()
app.master.title("贪吃蛇")
app.mainloop()

运行结果(可以通过修改代码设置速度,可以通过键盘进行上下移动):

下面分享一个使用递归算法写的贪吃蛇:

from tkinter import *
import random
import threading  #导入线程库
import queue  #导入队列库
import time
import sys
sys.setrecursionlimit(20000) #例如这里设置为一百万
class GUI(Tk):  ##定义类GUI,它继承Tk类,用于完成界面创建def __init__(self,queue): #用于初始化Tk.queue = queueself.is_game_over = Falseself.canvas = Canvas(self,width = 495,height = 305,bg = '#000000')self.canvas.pack()self.snake = self.canvas.create_line((0,0),(0,0),fill = '#FFCC4C',width = 10)self.food = self.canvas.create_rectangle(0,0,0,0,fill = '#FFCC4C',outline = '#FFCC4C')self.points_earned = self.canvas.create_text(455,15,fill = 'white',text = 'score:0')self.queue_handler()def queue_handler():try:while True:task = self.queue.get(block = False)#print(task)if task.get('game_over'):self.game_over()if task.get('move'):points = [x for point in task['move'] for x in point]self.canvas.coords(self.snake,*points)if task.get('food'):self.canvas.coords(self.food,*task['food'])elif task.get('points_earned'):self.canvas.itemconfigure(self.points_earned,text = 'score:{}'.format(task['points_earned']))self.queue.task_done()except queue.Empty:if not self.is_game_over():self.canvas.after(100,self.queue_handler)def game_over(self):self.is_game_over = Trueself.canvas.create_text(200,150,fil = 'white',text = 'Game Over')quitbtn = Button(self,txet = 'Quit',command = self.destroy)rebtn = Button(self,text = 'Begin',command = self.__init__)self.canvas.create_window(200,180,anchor = 'nw',window = quitbtn)class Food():def __init__(self,queue):self.queue = queueself.generate_food()def generate_food(self):x = random.randrange(5,480,10)y = random.randrange(5,295,10)self.position = x,yself.exppos = x-5,y-5,x+5,y+5self.queue.put({'food':self.exppos})class Snake(threading.Thread):   def __init__(self,gui,queue):threading.Thread.__init__(self)self.gui = guiself.queue = queueself.daemon = Trueself.points_earned = 0self.snake_points = [(495,55),(485,55),(475,55),(465,55),(455,55)]self.food = Food(queue)self.direction = 'Left'self.start()def run():if self.gui.is_game_over:self._delete()while not self.gui.is_game_over:self.queue.put({'move':self.snake_points})time.sleep(0.5)self.move()def keypressed(self,e):self.direction = e.keysymdef move():new_snake_point = self.calculate_new_coordinates()if self.food.position == new_snake_point:self.points_earned += 1self.queue.put({'points_earned ':self.points_earned })self.food.generate_food()else:self.snake.points.pop(0)self.check_game_over(new_snake_point)self.snake_points.append(new_snake_point)def calculate_new_coordinates(self):last_x,last_y = self.snake_points[-1]if self.direction == 'Up':new_snake_point = last_x,(last_y-10)elif self.direction == 'Down':new_snake_point = last_x,(last_y+10)elif self.direction == 'Left':new_snake_point = last_x-10,last_yelif self.direction == 'Right':new_snake_point = last_x+10,last_yreturn new_snake_pointdef check_game_over(self,snake_point):x,y = snake_point[0],snake_point[1]if not -5 < x < 505 or not -5 < y < 315 or snake_point in self.snake_points:self.queue.put({'game_over':True})def main():global q,guiq = queue.Queue()gui = GUI(q)gui.title('贪吃蛇第一版')#global q,guisnake = Snake(gui,q)gui.bind('<Key-Left>',snake.key_pressed)gui.bind('<Key-Right>',snake.key_pressed)gui.bind('<Key-Up>',snake.key_pressed)gui.bind('<Key-Down>',snake.key_pressed)gui.mainloop()if __name__ =='__main__':main()

提示: sys.setrecursionlimit(20000) 代码中的这句话设置的过低的时候会报错的。

基于tkinter的界面应用小程序-贪吃蛇游戏相关推荐

  1. 基于WIN32 API界面编程实现的贪吃蛇游戏

    1 设计目的和任务 本次期末大作业采用课程设计的形式进行,作为<Windows编程>课程的期末考核.要求综合运用Windows编程的相关知识,完成大作业的相关内容,并撰写设计报告.其目的和 ...

  2. python小程序贪吃蛇_微信小程序实现的贪吃蛇游戏【附源码下载】

    本文实例讲述了微信小程序实现的贪吃蛇游戏.分享给大家供大家参考,具体如下: 先来看看运行效果: 具体代码如下: 界面布局 pages/snake/snake/snake.wxml: snake 得分 ...

  3. 微信小程序-贪吃蛇开发5 游戏界面设计,flex布局

    本系列是作者自学实践过程的记录 本文是贪吃蛇游戏界面的设计 有问题欢迎讨论 游戏界面设计 一.需求分析 二.得分界面详细设计 2.1 wxml标签类定义 2.2 wxss样式设计 三.游戏地图详细设计 ...

  4. 微信小程序-贪吃蛇开发12 Modal标签

    本系列是作者自学实践过程的记录 本文是关于贪吃蛇的弹窗控制 有问题欢迎讨论 一.Model标签介绍 通过Modal标签,可以实现弹窗功能,例如当游戏结束时应该让用户执行什么样的操作. 属性 作用 hi ...

  5. 基于51单片机和OLED屏幕的贪吃蛇游戏

    本文章在于利用51单片机和OLED屏幕实现一个简易的贪吃蛇游戏 所用的51单片机为普中51系列,OLED屏幕属中景园电子,具体实物均可以在某宝购买 OLED模块: 关于OLED模块的相关函数及其.h和 ...

  6. 贪吃蛇程序 php,微信小程序-贪吃蛇教程实例

    很久很久以前,差不多大半年前吧,笔者发布了一篇关于OC版贪食蛇开发的文章,时隔多月,微信小程序横空出世,于是闲来无事的我又写了一个小程序版 下面这段话请务必阅读 笔者是做iOS的,而小程序大部分都是前 ...

  7. java小程序贪吃蛇代码_微信小程序Demo之贪食蛇

    原标题:微信小程序Demo之贪食蛇 差不多大半年前,笔者发布了一篇关于OC版贪食蛇开发的文章,时隔多月,微信小程序横空出世,于是闲来无事的我又写了一个小程序版. 01页面布局 关于小程序笔者就不做介绍 ...

  8. 微信小程序-贪吃蛇开发9 滑动控制与碰撞检测

    本系列是作者自学实践过程的记录 本文是关于贪吃蛇的滑动控制 有问题欢迎讨论 目录 一.滑动控制 1.1 设计思想 1.2 代码实现 1.3 效果展示: 1.4 整体赋值 二.setInterval函数 ...

  9. 微信小程序-贪吃蛇开发4 wxml和wxss学习

    本系列是作者自学实践过程的记录 本文是微信的wxml和wxss学习使用 有问题欢迎讨论 目录 一.标签 1.1 view 1.2 modal 二.wxss 三.详细学习 一.标签 wxml和html类 ...

最新文章

  1. 华为机考HJ4字符串分隔C语言题解
  2. mysql lib_explode_这简直就是一个“定时炸弹”!记一次 MySQL 的奇葩故障
  3. 画面风格写实的飞鸽传书
  4. kubernetes 简介:kube-dns 和服务发现
  5. python开发个人博客_[Web开发] Flask+Python 开发个人博客(一)
  6. 为激励女工程师推出的编程盛宴
  7. 18Python标准库系列之logging模块
  8. django允许跨域请求配置
  9. pythonsubprocess执行多条shell命令_Python获取shell管道数据/输入的2种方法: subprocess子进程 ......
  10. python多久能上手_Python容易上手的爬虫项目,特别适合基础入门
  11. 【arm体系结构与编程】1.概述及其基本编程模型(一)
  12. 用户画像pdf_【金猿产品展】易观方舟:智能用户数据中台
  13. 有哪些电影一定要趁年轻看? - 风之影的回答 - 知乎
  14. oracle认证考试试题及答案,oracle考试试题_oracle认证考试模拟题_oracle试题及答案房地产估价师考试试题_房地产...
  15. python抢优惠券程序_python3 优惠券查询GUI程序
  16. 爱奇艺财报解读:连续两个季度盈利 会员同比增收7%
  17. 手把手带你撸一个校园APP(六):失物招领二手交易模块
  18. Vmware Workstation Pro 16
  19. web网站验证码自动识别
  20. 7-116 计算圆周率

热门文章

  1. 2.5 充电桩发送报文
  2. Eclipse安装教程 ——最详细安装java
  3. 使用ChatGPT练习英语口语,用AI帮你设计场景练习
  4. AttributeError: module transformers has no attribute LLaMATokenizer解决方案
  5. 连接数据孤岛,巨杉数据库与 Tapdata 联合共建开放数据生态
  6. vue 百度地图 + 定位
  7. linux 测试端口通不通
  8. Java详解WebService技术
  9. Mac技巧之苹果电脑Mac OS X系统自带的鼠标所在点颜色RGB值查看工具:数码测色计...
  10. VUE(template标签 事件绑定与监听)