#   项目分析:

- 构成:

  - 蛇  Snake

  - 食物 Food

  - 世界 World

-  蛇和食物属于整个世界

    

    class World:

      self.snake

      self.food

----------------------------------------

  -  上面代码不太友好

  - 我们用另外一个思路来分析

- 我们的分析思路

  - 食物是一个独立的事物

  - 蛇也可以认为是一个独立的事物

  - 世界也是,但世界负责显示

---------------------------------------------------

class Foold():
'''
功能:
1、出现在画面的某一个地方
2、一旦被吃,则增加蛇的分数
'''
def __init__(self, queue):
'''
自动产生一个食物
'''
self.queue = queue
self.new_food()
'''
功能:产生一个食物
产生一个食物的过程就是随机产生一个食物坐标的过程
'''
# 注意横纵坐标产生的范围
x = random.randrange(50, 480, 10)
# 同理产生y坐标
# 需要注意的是,我们的正给游戏屏幕一般不需要把他设置成正方形 self.positon = x,y # position存放食物的位置 # 队列,就是一个不能够随意访问内部元素,只能从头弹出一个元素并只能
# 从队尾追加元素的list
# 把一个事物产生的消息放入队列
# 消息的格式,自己定义
# 我的定义是,消息是一个dict,k代表消息类型,v代表此类型的数据
self.queue.put({"food": self.postion}) class Snake(threading.Thread):
'''
蛇的功能:
1、蛇能动,由我们的上下左右按键控制
2、蛇每次动,都需要重新计算蛇头的位置
3、检测是否游戏完事的功能
'''
def __init__(self, gui, queue):
threading.Thread.__init__(self) self.world = world
self.queue
self.points_earned = 0 # 游戏分数
self.food = Food(self.queue)
self.snake_points = [(495, 55), (485, 55), (465, 55), (455, 55)] self.start() def run(self):
'''
一旦启用多线程调用此函数
要求蛇一直都在跑
'''
if self.world.is_game_over:
self._delete() while not self.world.is_game_over:
self.queue.put({"move":self.snake_points})
time.sleep(0.5) #控制蛇的速度
self.move() def move(self):
'''
负责蛇的移动
1、重新计算蛇头的坐标
2、当蛇头跟食物相遇,则加分,重新生成食物,通知world,加分
3、否则,蛇需要动
'''
new_snake_point = self.cal_new_pos() #重新计算蛇头位置
# 蛇头位置跟食物位置相同
if self.food.postion == new_snake_point:
self.points_earned += 1 #得分加1
self.queue.put({"point_earned": self.points_earned})
self.food.new_food() # 就是食物被吃掉,产生新的食物
else:
# 需要注意蛇的信息的保存方式
# 每次移动是删除存放蛇的最前位置,并在后面追加
self.snake_points.pop(0)
# 判断程序是否退出,因为新的蛇可能撞墙
self.check_game_over(new_snake_point)
self.snake_points.append(new_snake_point)
def cal_new_position(self):
'''
计算新的 蛇头的位置
'''
last_x, last_y = self.snake_points[-1]
if self.direction == "Up": #direction 负责存储蛇移动的方向
new_snake_point = last_x, last_y - 10 # 每次移动的跨度是10像素
elif self.direction == 'Down':
# 需要总共判断上下左右四个方向 return new_snake_point def key_pressed(self, e):
# keysym是按键名称
self.direction = e.keysym2 def 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
self.queue.put({'game_over': True}) class World():
'''
用来模拟整个游戏画板
'''
def __init__(self):
Tk.__init__(self) self.queue
self.is_game_over =False # 定义画板
self.canvas = Canvas(self, width=500, height=300, bg='red')
self.pack() # 画出蛇和食物
self.snake = self.canvas.create_line((0, 0), (0, 0), fill="black", width = 0)
self.food = self.canvas.create_rectangle(0, 0, 0, 0, fill='#FFCC4C', width=0) self.points_earned = self.canvas.create_text(450, 20, fill='white', text = )
self.queue_handler() def queue_handler(self):
try:
# 需要不断从消息队列拿到消息,所以使用死循环
while True:
task = self.queue.get(block = False) 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) # 同样道理,还需要处理食物,得分
except queue.Empty: #爆出队列为空异常
if not self.is_game_over:
# after的含义是,在多少毫秒后调用后面的函数
self.canvas.after(100, self.queue_handler) def game_over(self):
'''
游戏结束,清理现场
'''
self.is_game_over = True
self.canvas.create_text("Game Over")
qb = Button(self, text="Quit", command=self.destroy)
rb = Button(self, text="Again", command=self.__init__) if __main__ == "__main__":
q = queue.Queue()
world = World(q) snake = Snake(world, q) world.bind('<Key-Left>', snake.key_pressed)
# 同样绑定右键,上下键
world.mainloop()

Python---Tkinter---贪吃蛇的更多相关文章

  1. 【python】10分钟教你用python打造贪吃蛇超详细教程

    10分钟教你用python打造贪吃蛇超详细教程 在家闲着没妹子约, 刚好最近又学了一下python,听说pygame挺好玩的.今天就在家研究一下, 弄了个贪吃蛇出来.希望大家喜欢. 先看程序效果: 0 ...

  2. 多线程的Python 教程--“贪吃蛇”

    本指南的里代码可以在这里下载:  threadworms.py ,或者从  GitHub.代码需要  Python 3 或 Python 2 ,同时也需要安装  Pygame . 点击查看大版本图片 ...

  3. 一步步教你怎么用python写贪吃蛇游戏

    目录 0 引言 1 环境 2 需求分析 3 代码实现 4 后记 0 引言 前几天,星球有人提到贪吃蛇,一下子就勾起了我的兴趣,毕竟在那个Nokia称霸的年代,这款游戏可是经典中的经典啊!而用Pytho ...

  4. 如何用python制作贪吃蛇以及AI版贪吃蛇

    用python制作普通贪吃蛇 哈喽,大家不知道是上午好还是中午好还是下午好还是晚上好! 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很 ...

  5. python实现贪吃蛇

    贪吃蛇的算法还是比较简单的,蛇的移动我是通过不停添加一个head方块,然后判断应该加到蛇头的哪个方向,加完后删掉蛇尾就行了,如果吃到食物就不删蛇尾. 只是一个贪吃蛇只需要70行代码左右就可以了,后来又 ...

  6. Python实例:贪吃蛇(简单贪吃蛇编写)🐍

    d=====( ̄▽ ̄*)b 叮~ Python -- 简易贪吃蛇实现 目录: 1.基本原理 2.需要学习的库 3.代码实现 1.基本原理 基本贪吃蛇所需要的东西其实很少,只需要有一块让蛇动的屏幕, 在 ...

  7. 【C/C++】10分钟教你用C++写一个贪吃蛇附带AI功能(附源代码详解和下载)

    C++编写贪吃蛇小游戏快速入门 刚学完C++.一时兴起,就花几天时间手动做了个贪吃蛇,后来觉得不过瘾,于是又加入了AI功能.希望大家Enjoy It. 效果图示 AI模式演示 imageimage 整 ...

  8. Python写的贪吃蛇游戏例子

    第一次用Python写这种比较实用且好玩的东西,权当练手吧 游戏说明: * P键控制“暂停/开始”* 方向键控制贪吃蛇的方向 源代码如下: 复制代码代码如下: from Tkinter import ...

  9. 使用Python写一个贪吃蛇

    参考代码http://blog.csdn.net/leepwang/article/details/7640880 我在程序中加入了分数显示,三种特殊食物,将贪吃蛇的游戏逻辑写到了SnakeGame的 ...

  10. 用Python写一个贪吃蛇

    最近在学Python,想做点什么来练练手,命令行的贪吃蛇一般是C的练手项目,但是一时之间找不到别的,就先做个贪吃蛇来练练简单的语法. 由于Python监听键盘很麻烦,没有C语言的kbhit(),所以这 ...

随机推荐

  1. object Object {} any unknown

    object: 除了primitive(boolean null number string undefined bigint symbol)的类型 Object: Object和any很像 ,Obj ...

  2. SAP简介

    1. 什么是SAP SAP的英文全名为System Application and Products in Data Processing.SAP既是公司名称,又是其产品的软件名称. 2. SAP的诞 ...

  3. 中国MOOC_零基础学Java语言_期末考试的编程题_1二进制的前导的零

    期末考试的编程题 返回   这是期末考试的编程题,在60分钟内,你可以多次提交,直到正确为止. 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止 ...

  4. zabbix+grafana使用

    参照文档 https://blog.csdn.net/xiegh2014/article/details/54928883

  5. (转载)深入解析String#intern

    本文转载自:深入解析String#intern 引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念. ...

  6. docker--docker 网络管理

    9 docker 网络管理 9.1 默认网络 1.查看docker网络: docker network ls Docker中默认的三种网络分别为bridge.host和none,其中名为bridge的 ...

  7. Java基础语法—数据输入

    我们可以通过 Scanner 类来获取用户的输入.使用步骤如下: 1.导包.Scanner 类在java.util包下,所以需要将该类导入.导包的语句需要定义在类的上面. import java.ut ...

  8. MyEclipse img显示问题

    MyEclipse第一个例子,通过HTML的img显示图片,费两天的功夫,故作简单整理,图片2不显示根本原因还是src的路径不对. 选中project中的sr.jpg文件,运行查看浏览器显示的地址,此 ...

  9. Codeforces 1255E Send Boxes to Alice(前缀和+枚举+数论)

    我们考虑前缀和sum[i],如果将a[i+1]中的一个塞入a[i]中,则不影响sum[i+1],但是sum[i]++,如果将a[i]中的一个塞入a[i+1],则不影响sum[i+1],但是sum[i] ...

  10. 关于css清除浮动

    1.overflow:hidden 较简单,兼容于市面浏览器.负面效果不详.暂不推荐使用.2.定义clear类,并把clear类赋给浮动元素的父级元素. .clear{display:block;ov ...