(一)、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.xdnf.cn/news/1475012.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

聚观早报 | 蚁天鉴2.0发布;理想汽车推送无图NOA

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 7月8日消息 蚁天鉴2.0发布 理想汽车推送无图NOA 特斯拉推送FSD v12.4.3 iQOO Neo9s Pro配色公布 百川智能AI健康…

#数据结构 链表

单向链表 1. 概念 单向链表 单向循环链表 双向链表 双向循环链表 解决&#xff1a;长度固定的问题&#xff0c;插入和删除麻烦的问题 1、逻辑结构&#xff1a; 线性结构 2、存储结构&#xff1a; 链式存储 链表就是将 结点 用链串起来的线性表&#xff0c;链就是 结点 中的…

Banana Pi BPI-M5 Pro 低调 SBC 采用 Rockchip RK3576 八核 Cortex-A72/A53 AIoT SoC

Banana Pi BPI-M5 Pro&#xff0c;也称为 Armsom Sige5&#xff0c;是一款面向 AIoT 市场的低调单板计算机 (SBC)&#xff0c;由 Rockchip RK3576 八核 Cortex-A72/A53 SoC 驱动&#xff0c;提供Rockchip RK3588和RK3399 SoC 之间的中档产品。 该主板默认配备 16GB LPDDR4X 和…

力扣-双指针1

何为双指针 双指针指向同一数组&#xff0c;然后配合着进行搜索等活动。 滑动窗口的时候很好使用。 167.两数之和Ⅱ-输入有序数组 167. 两数之和 II - 输入有序数组 题目 给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从…

【力扣: 15题: 三数之和】

15题: 三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意: 答案中不可以包含重复的三元组。 …

AI集成工具平台一站式体验,零门槛使用国内外主流大模型

目录 0 写在前面1 AI艺术大师1.1 绘画制图1.2 智能作曲 2 AI科研助理2.1 学术搜索2.2 自动代码 3 AI智能对话3.1 聊天机器人3.2 模型竞技场 4 特别福利 0 写在前面 人工智能大模型浪潮滚滚&#xff0c;正推动着千行百业的数智化进程。随着技术演进&#xff0c;2024年被视为是大…

C++11中新特性介绍-之(二)

11.自动类型推导 (1) auto类型自动推导 auto自动推导变量的类型 auto并不代表某个实际的类型&#xff0c;只是一个类型声明的占位符 auto并不是万能的在任意场景下都能推导&#xff0c;使用auto声明的变量必须进行初始化&#xff0c;以让编译器推导出它的实际类型&#xff0c;…

深入探索 Python 中的数据维数:高维数据处理方法与应用

Python 数据维数 在数据科学和机器学习领域&#xff0c;理解数据的维度是至关重要的。Python作为一种强大而灵活的编程语言&#xff0c;提供了丰富的工具和库来处理各种维度的数据。本文将介绍Python中数据维数的概念&#xff0c;以及如何使用Python库来处理不同维度的数据。 什…

算法思想总结:优先级队列

一、最后一块石头的重量 . - 力扣&#xff08;LeetCode&#xff09; 我们每次都要快速找到前两个最大的石头进行抵消&#xff0c;这个时候用优先级队列&#xff08;建大堆&#xff09;,不断取堆顶元素是最好的&#xff01;每次删除堆顶元素后&#xff0c;可以自动调整&#xf…

爬虫怎么实现抓取的

1.4爬虫工程师常用的库通过图1-3我们了解到&#xff0c;爬虫程序的完整链条包括整理需求、分析目标、发出网络请求、文本解析、数据入库和数据出库。其中与代码紧密相关的有&#xff1a;发出网络请求、文本解析、数据入库和数据出库&#xff0c;接下来我们将学习不同阶段中爬虫…

SOAMANAGER 弹不出浏览器

SOAMANAGER 弹不出浏览器 一、打开SOAMANAGER的其他方法 使用事务码SICF打开SOAMANAGER,执行路径default_host/sap/bc/webdynpro/sap/appl_soap_management 使用SE24对类CL_GUI_HTML_VIEWER中的方法DETACH_URL_IN_BROWSER 打断点 在前台创建一个URL的链接。

数组算法(二):交替子数组计数

1. 官方描述 给你一个二进制数组nums 。如果一个子数组中 不存在 两个 相邻 元素的值 相同 的情况&#xff0c;我们称这样的子数组为 交替子数组 。 返回数组 nums 中交替子数组的数量。 示例 1&#xff1a; 输入&#xff1a; nums [0,1,1,1] 输出&#xff1a; 5 解释&#…

Spring IOC基于XML和注解管理Bean

IoC 是 Inversion of Control 的简写&#xff0c;译为“ 控制反转 ”&#xff0c;它不是一门技术&#xff0c;而是一种设计思想&#xff0c;是一个重要的面向对象编程法则&#xff0c;能够指导我们如何设计出 松耦合、更优良的程序。 Spring 通过 IoC 容器来管理所有 Java 对象…

【Unity】在Unity中制作一个小车游戏

目录 第一步&#xff1a;设置Unity项目 第二步&#xff1a;设置场景 第三步&#xff1a;添加车辆控制脚本 第四步&#xff1a;将脚本附加到车辆上 第五步&#xff1a;运行和测试 第六步&#xff1a;添加更多功能&#xff08;可选&#xff09; 在Unity中制作一个小车游戏…

webGL可用的14种3D文件格式,但要具体问题具体分析。

hello&#xff0c;我威斯数据&#xff0c;你在网上看到的各种炫酷的3d交互效果&#xff0c;背后都必须有三维文件支撑&#xff0c;就好比你网页的时候&#xff0c;得有设计稿源文件一样。WebGL是一种基于OpenGL ES 2.0标准的3D图形库&#xff0c;可以在网页上实现硬件加速的3D图…

MySQL之备份与恢复和MySQL用户工具(一)

备份与恢复 备份脚本化 为备份写一些脚本是标准做法。展示一个示例程序&#xff0c;其中必定有很多辅助内容&#xff0c;这只会增加篇幅&#xff0c;在这里我们更愿意列举一些典型的备份脚本功能&#xff0c;展示一些Perl脚本的代码片段。你可以把这些当作可重用的代码块&…

算法012:将x减到0的最小操作数

将x减到0的最小操作数. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/minimum-operations-to-reduce-x-to-zero/ 这个题使用到的是滑动窗口。 乍一看&#xff0c…

web安全基础名词概念

本节内容根据小迪安全讲解制作 第一天 域名&#xff1a; 1.1什么是域名&#xff1f; 网域名称(英语&#xff1a;Domain Name&#xff0c;简称&#xff1a;Domain)&#xff0c;简称域名、网域&#xff0c;是由一串用点分隔的字符组成的互联网上某一台计算机或计算机组的名称&a…

【系统架构设计师】八、系统工程基础知识(系统工程|系统性能)

目录 一、系统工程 1.1 系统工程的方法 1.1.1 霍尔的三维结构 1.1.2 切克兰德方法 1.1.3 并行工程方法 1.1.4 综合集成法 1.1.5.WSR 系统方法。 二、系统工程生命周期 2.1 系统工程生命周期7阶段 2.2 生命周期方法 三、基于模型的系统工程(MBSE) 四、系统性能 4.1…

昇思大模型第19天打卡|SSD目标检测

模型简介 SSD&#xff0c;全称Single Shot MultiBox Detector&#xff0c;是Wei Liu在ECCV 2016上提出的一种目标检测算法。使用Nvidia Titan X在VOC 2007测试集上&#xff0c;SSD对于输入尺寸300x300的网络&#xff0c;达到74.3%mAP(mean Average Precision)以及59FPS&#xf…