(一)、python程序--模拟电脑鼠走迷宫

一、绪论

1、简介

电脑鼠走迷宫是一种比赛,制作实物电脑鼠小车在迷宫找目标点,用时最短者获胜。考验参赛选手软硬件结合的能力。

2、走迷宫模拟软件中已实现功能

1、点击迷宫墙壁可编辑迷宫,并且可保存和加载迷宫形状文件;

2、自动搜索迷宫,采用回溯算法搜索整个迷宫;

3、采用洪水算法查找迷宫的最短路径。

整体界面

二、软件截图

打开迷宫形状配置文件

点击迷宫墙壁编辑迷宫形状

搜索迷宫

搜索迷宫

搜索迷宫,并且回溯未到过的地方

搜索结束,找到最短距离的路径

三、代码分享

代码中一共4个.py文件,一个迷宫形状配置文件,如下:

1、main.py

import tkinter as tk
import maze as maze
import micromouse as micromouseroot = tk.Tk()
windows_w = 640*2+100
windows_h = 640
bd = 10
map_size = 32
win = [15, 15]
root.title("MicroMouse")
root.geometry("{}x{}".format(windows_w, windows_h))cv = tk.Canvas(root, width=windows_h*2, height=windows_h, bg='white')
cv.place(x=0, y=0)mz = maze.Maze(cv, windows_h, bd, win, map_size)
mz.draw_maze()
mz.draw_win_point()mouse = micromouse.MicroMouse(cv, mz.cell_len, bd, win, windows_h, map_size)
mouse.draw_mouse(0, 0)
mouse.draw_win_oval()
mouse.draw_search_maze()save = tk.Button(root, text='保存迷宫', command=mz.save_maze, height=1, width=8)
save.place(x=windows_h*2+20, y=10)open = tk.Button(root, text='加载迷宫', command=mz.load_maze, height=1, width=8)
open.place(x=windows_h*2+20, y=50)search = tk.Button(root, text='探索迷宫', command=lambda mz=mz: mouse.search_maze(mz), height=1, width=8)
search.place(x=windows_h*2+20, y=90)setmouse = tk.Button(root, text='重置电脑鼠', command=mouse.reset_mouse, height=1, width=8)
setmouse.place(x=windows_h*2+20, y=130)root.mainloop()

2、tree.py

class Tree(object):def __init__(self):self.last_tree = Noneself.next_tree = Noneself.h = Noneself.w = None

3、maze.py

import numpy as np
from tkinter import filedialogclass Maze(object):def __init__(self, cv, windows_h, bd, win, map_size=32):self.map_size = map_sizeself.cv = cvself.bd = bdself.win = winself.up = 0self.down = 1self.left = 2self.right = 3self.maze_map = np.ones((map_size, map_size, 4), dtype='int8')  # h/y, w/x, wall/up,down,left,rightself.cell_len = int((windows_h-2*self.bd)/map_size)self.line_hand = []self.win_point = Nonedef draw_win_point(self):# clear win pointif self.win_point is not None:self.cv.delete(self.win_point)# draw win pointw, h = self.winx, y = (w+0.5)*self.cell_len+self.bd, (h+0.5)*self.cell_len+self.bdrate = self.cell_len/3x0, y0 = x - rate, y - ratex1, y1 = x + rate, y + rateself.win_point = self.cv.create_oval(x0, y0, x1, y1, fill='red')def draw_maze(self):# clear mazefor tag in self.line_hand:self.cv.delete(tag)# draw mazefor h in range(self.map_size):for w in range(self.map_size):for index in range(4):# up and down for wallif index in [self.up, self.down]:x0, y0 = w*self.cell_len+self.bd, (h+index)*self.cell_len+self.bdx1, y1 = (w+1)*self.cell_len+self.bd, (h+index)*self.cell_len+self.bd# left and right for wallelse:x0, y0 = (w+index-2)*self.cell_len+self.bd, h*self.cell_len+self.bdx1, y1 = (w+index-2)*self.cell_len+self.bd, (h+1)*self.cell_len+self.bd# no line draw white lineif self.maze_map[h, w, index] == 1:color = 'black'else:color = 'Gainsboro'# draw lineself.line_hand.append(self.cv.create_line(x0, y0, x1, y1, width=2, fill=color))self.cv.tag_bind(self.line_hand[-1], '<Button-1>', lambda event, c=[h, w, index]: self.change_cell(c))def change_cell(self, c):# click to hide or show lineh, w, index = c# edge wallif h == 0 and index == self.up:returnif w == 0 and index == self.left:return# up wallif index == self.up:# deal clicked lineif self.maze_map[h, w, self.up] == 1:self.maze_map[h, w, self.up] = 0else:self.maze_map[h, w, self.up] = 1# deal adjoin lineif h-1 >= 0:if self.maze_map[h, w, self.up] == 0:self.maze_map[h - 1, w, self.down] = 0else:self.maze_map[h - 1, w, self.down] = 1# left wallif index == self.left:# deal clicked lineif self.maze_map[h, w, self.left] == 1:self.maze_map[h, w, self.left] = 0else:self.maze_map[h, w, self.left] = 1# deal adjoin lineif w-1 >= 0:if self.maze_map[h, w, self.left] == 0:self.maze_map[h, w - 1, self.right] = 0else:self.maze_map[h, w - 1, self.right] = 1self.draw_maze()def save_maze(self):fileSave = filedialog.asksaveasfilename(defaultextension='.txt', filetypes=[("txt files", ".txt")])np.savetxt(fileSave, self.maze_map.reshape((1, self.map_size*self.map_size*4)), fmt='%d')def load_maze(self):filePath = filedialog.askopenfilename()self.maze_map = np.loadtxt(filePath).reshape((self.map_size, self.map_size, 4))self.draw_maze()def get_maze_map(self):return self.maze_map.copy()

4、micromouse.py

import numpy as np
from tkinter import filedialogclass Maze(object):def __init__(self, cv, windows_h, bd, win, map_size=32):self.map_size = map_sizeself.cv = cvself.bd = bdself.win = winself.up = 0self.down = 1self.left = 2self.right = 3self.maze_map = np.ones((map_size, map_size, 4), dtype='int8')  # h/y, w/x, wall/up,down,left,rightself.cell_len = int((windows_h-2*self.bd)/map_size)self.line_hand = []self.win_point = Nonedef draw_win_point(self):# clear win pointif self.win_point is not None:self.cv.delete(self.win_point)# draw win pointw, h = self.winx, y = (w+0.5)*self.cell_len+self.bd, (h+0.5)*self.cell_len+self.bdrate = self.cell_len/3x0, y0 = x - rate, y - ratex1, y1 = x + rate, y + rateself.win_point = self.cv.create_oval(x0, y0, x1, y1, fill='red')def draw_maze(self):# clear mazefor tag in self.line_hand:self.cv.delete(tag)# draw mazefor h in range(self.map_size):for w in range(self.map_size):for index in range(4):# up and down for wallif index in [self.up, self.down]:x0, y0 = w*self.cell_len+self.bd, (h+index)*self.cell_len+self.bdx1, y1 = (w+1)*self.cell_len+self.bd, (h+index)*self.cell_len+self.bd# left and right for wallelse:x0, y0 = (w+index-2)*self.cell_len+self.bd, h*self.cell_len+self.bdx1, y1 = (w+index-2)*self.cell_len+self.bd, (h+1)*self.cell_len+self.bd# no line draw white lineif self.maze_map[h, w, index] == 1:color = 'black'else:color = 'Gainsboro'# draw lineself.line_hand.append(self.cv.create_line(x0, y0, x1, y1, width=2, fill=color))self.cv.tag_bind(self.line_hand[-1], '<Button-1>', lambda event, c=[h, w, index]: self.change_cell(c))def change_cell(self, c):# click to hide or show lineh, w, index = c# edge wallif h == 0 and index == self.up:returnif w == 0 and index == self.left:return# up wallif index == self.up:# deal clicked lineif self.maze_map[h, w, self.up] == 1:self.maze_map[h, w, self.up] = 0else:self.maze_map[h, w, self.up] = 1# deal adjoin lineif h-1 >= 0:if self.maze_map[h, w, self.up] == 0:self.maze_map[h - 1, w, self.down] = 0else:self.maze_map[h - 1, w, self.down] = 1# left wallif index == self.left:# deal clicked lineif self.maze_map[h, w, self.left] == 1:self.maze_map[h, w, self.left] = 0else:self.maze_map[h, w, self.left] = 1# deal adjoin lineif w-1 >= 0:if self.maze_map[h, w, self.left] == 0:self.maze_map[h, w - 1, self.right] = 0else:self.maze_map[h, w - 1, self.right] = 1self.draw_maze()def save_maze(self):fileSave = filedialog.asksaveasfilename(defaultextension='.txt', filetypes=[("txt files", ".txt")])np.savetxt(fileSave, self.maze_map.reshape((1, self.map_size*self.map_size*4)), fmt='%d')def load_maze(self):filePath = filedialog.askopenfilename()self.maze_map = np.loadtxt(filePath).reshape((self.map_size, self.map_size, 4))self.draw_maze()def get_maze_map(self):return self.maze_map.copy()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/373742.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无线麦克风哪个牌子的好,麦克风哪个品牌音质最好,热门款式推荐

​在当今这个数字化迅速发展的时代&#xff0c;无线领夹麦克风已经成为自媒体创作者、直播主播以及专业录音师不可或缺的工具。它们以其小巧便携、易于操作和出色的录音质量&#xff0c;极大地提升了音频录制的效率和质量。无论是户外探险的Vlog拍摄&#xff0c;还是室内直播的…

基于Android平台开发,天气预报APP

1.项目功能思维导图 2. 项目涉及到的技术点 数据来源&#xff1a;和风天气API使用okhttp网络请求框架获取api数据使用gson库解析json数据使用RecyclerViewadapter实现未来7天列表展示和天气指数使用PopupMenu 实现弹出选项框使用动画定时器实现欢迎页倒计时和logo动画使用Text…

解决IDEA每次新建项目都需要重新配置maven的问题

每次打开IDEA都要重新配置maven&#xff0c;这是因为在DEA中分为项目设置和全局设置&#xff0c;这个时候我们就需要去到全局中设置maven了。我用的是IntelliJ IDEA 2023.3.4 (Ultimate Edition)&#xff0c;以此为例。 第一步&#xff1a;打开一个空的IDEA&#xff0c;选择左…

传知代码-多行人姿态检测系统

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 概述 本项目创新在于采用多级网络串联工作来进行目标的行为分析&#xff0c;并使用在视频监控领域&#xff0c;可部署在任何有需要的人员流动密集场所(如医院&#xff0c;机场&#xff0c;养老院等)或者用于空巢…

springboot三层架构详细讲解

目录 springBoot三层架构0.简介1.各层架构1.1 Controller层1.2 Service层1.3 ServiceImpl1.4 Mapper1.5 Entity1.6 Mapper.xml 2.各层之间的联系2.1 Controller 与 Service2.2 Service 与 ServiceImpl2.3 Service 与 Mapper2.4 Mapper 与 Mapper.xml2.5 Service 与 Entity2.6 C…

Java语言程序设计——篇三(1)

选择结构 概述选择单分支if语句例题讲解 双分支if-else语句例题讲解 条件运算符多分支的if-else语句例题讲解 嵌套的if语句例题讲解 switch语句结构例题讲解代码演示运行结果 概述 Java中的控制结构&#xff0c;包括&#xff1a; 1、选择结构( if、if-else、switch ) 2、循环结…

最佳 iPhone 解锁软件工具,可免费下载用于电脑操作的

业内专业人士表示&#xff0c;如果您拥有 iPhone&#xff0c;您一定知道忘记锁屏密码会多么令人沮丧。由于 Apple 的安全功能强大&#xff0c;几乎不可能在没有密码或 Apple ID 的情况下访问锁定的 iPhone。 “当我忘记密码时&#xff0c;如何在没有密码的情况下解锁iPhone&am…

Docker 部署 ShardingSphere-Proxy 数据库中间件

文章目录 Github官网文档ShardingSphere-Proxymysql-connector-java 驱动下载conf 配置global.yamldatabase-sharding.yamldockerdocker-compose.yml Apache ShardingSphere 是一款分布式的数据库生态系统&#xff0c; 可以将任意数据库转换为分布式数据库&#xff0c;并通过数…

Python 轻松生成多种条形码、二维码 (Code 128、EAN-13、QR code等)

条形码和二维码是现代信息交换和数据存储的重要工具&#xff0c;它们将信息以图形的形式编码&#xff0c;便于机器识别和数据处理&#xff0c;被广泛应用于物流、零售、医疗、教育等各领域。 本文将介绍如何使用Python快速生成各种常见的条形码如Code 128、EAN-13&#xff0c;…

20240711 每日AI必读资讯

&#x1f3a8;Runway Gen-3 Alpha 详细使用教程以及提示词指南大全 - 7月9日&#xff0c;著名生成式AI平台Runway在官网公布了&#xff0c;最新发布的文生视频模型Gen-3 Alpha的文本提示教程。 - 从技术层面来说&#xff0c;输入的文本提示会被转换成“向量”&#xff0c;这些…

滑动变阻器在实际应用中需要注意哪些安全事项?

滑动变阻器在实际应用中&#xff0c;为了确保其正常运作及保护电路安全&#xff0c;需要注意以下安全事项&#xff1a; 一、了解并遵守规格参数 最大电阻值和允许通过的最大电流值&#xff1a;使用前&#xff0c;必须清楚滑动变阻器的最大电阻值和允许通过的最大电流值&#x…

基于SAM的零样本相似性评价方法

文章目录 介绍方法SAM编码器相似性指标代码复现介绍 图像转换具有广泛的应用,如风格转换和模态转换,通常是生成具有高度真实和忠实的图像。这些问题仍然很困难,特别是在保存语义结构很重要的时候。传统的图像级相似性度量的用途有限,因为图像的语义是高级的,并且不受对原…

什么样的开放式耳机好用舒服?南卡、倍思、Oladance高人气质量绝佳产品力荐!

​开放式耳机在如今社会中已经迅速成为大家购买耳机的新趋势&#xff0c;深受喜欢听歌和热爱运动的人群欢迎。当大家谈到佩戴的稳固性时&#xff0c;开放式耳机都会收到一致好评。对于热爱运动的人士而言&#xff0c;高品质的开放式耳机无疑是理想之选。特别是在近年来的一些骑…

jitsi 使用JWT验证用户身份

前言 Jitsi Meet是一个很棒的会议系统,但是默认他运行所有人创建会议,这样在某种程度上,我们会觉得他不安全,下面我们就来介绍下使用JWT来验证用户身份 方案 卸载旧的lua依赖性sudo apt-get purge lua5.1 liblua5.1-0 liblua5.1-dev luarocks添加ubuntu的依赖源,有则不需…

内容协商源码解析与自定义 MessageConverter

目录 内容协商 1、引入xml依赖 2、postman分别测试返回json和xml 3、开启浏览器参数方式内容协商功能 4、内容协商原理 5、自定义 MessageConverter 综上 内容协商 根据客户端接收能力不同&#xff0c;返回不同媒体类型的数据。 若客户端无法解析服务端返回的内容&#…

Vatee万腾平台:创新科技,驱动未来

在科技日新月异的今天&#xff0c;每一个创新的火花都可能成为推动社会进步的重要力量。Vatee万腾平台&#xff0c;作为科技创新领域的佼佼者&#xff0c;正以其卓越的技术实力、前瞻性的战略眼光和不懈的探索精神&#xff0c;驱动着未来的车轮滚滚向前。 Vatee万腾平台深知&am…

剖析自闭症孩子玩手的独特之处

自闭症孩子玩手的行为常常具有一些较为独特的特点。 重复性是一个显著的特征。他们可能会以一种几乎相同的方式、节奏和频率反复地摆弄自己的手&#xff0c;例如不停地握拳、张开&#xff0c;或者持续地旋转手腕。 动作的单调性也是常见的。玩手的方式可能较为单一&#xff0c;…

【正点原子i.MX93开发板试用连载体验】简单的音频分类

本文最早发表于电子发烧友论坛&#xff1a; 今天测试的内容是进行简单的音频分类。我们要想进行语音控制&#xff0c;就需要构建和训练一个基本的自动语音识别 (ASR) 模型来识别不同的单词。如果想了解这方面的知识可以参考TensorFlow的官方文档&#xff1a;简单的音频识别&…

矢量绘图设计Sketch中文 Sketch直装安装包

Sketch是一款专为UI设计师和UX专家打造的矢量图形设计软件&#xff0c;以其简洁的界面、强大的功能和高效的协作能力而闻名。Sketch支持快速创建高质量的UI界面、图标、图形和插画&#xff0c;其矢量绘图工具让设计细节更加精准。同时&#xff0c;Sketch内置丰富的插件和组件库…

1-认识网络爬虫

1.什么是网络爬虫 ​ 网络爬虫&#xff08;Web Crawler&#xff09;又称网络蜘蛛、网络机器人&#xff0c;它是一种按照一定规则&#xff0c;自动浏览万维网的程序或脚本。通俗地讲&#xff0c;网络爬虫就是一个模拟真人浏览万维网行为的程序&#xff0c;这个程序可以代替真人…