(一)、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://xiahunao.cn/news/3227403.html

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

相关文章

【记录】LaTex|LaTex 代码片段 Listings 添加带圆圈数字标号的箭头(又名 LaTex Tikz 库画箭头的简要介绍)

文章目录 前言注意事项1 Tikz 的调用方法&#xff1a;newcommand2 标号圆圈数字的添加方式&#xff1a;\large{\textcircled{\small{1}}}\normalsize3 快速掌握 Tikz 箭头写法&#xff1a;插入点相对位移标号node3.1 第一张图&#xff1a;插入点相对位移3.2 第二张图&#xff1…

MySQL CONCAT函数的简单使用

CONCAT函数用于将mysql中查询多列的值拼成一列显示&#xff0c; 使用示例&#xff1a; SELECT CONCAT(attr_name,"&#xff1a;",attr_value) FROM pms_sku_sale_attr_value WHERE sku_id1; 上面SQL语句使用CONCAT函数将attr_name、attr_value两列的值拼成一列&am…

计算机组成原理:408考研|王道|学习笔记II

系列目录 计算机组成原理 学习笔记I 计算机组成原理 学习笔记II 目录 系列目录第四章 指令系统4.1 指令系统4.1.1 指令格式4.1.2 扩展操作码指令格式 4.2 指令的寻址方式4.2_1 指令寻址4.2_2 数据寻址 4.3 程序的机器级代码表示4.3.1 高级语言与机器级代码之间的对应4.3.2 常用…

非线性系列(三)—— 非线性求解器算法分类

1. 总体认知 CAE中的非线性方程组求解主要依赖牛顿法&#xff08;及牛顿法的变体&#xff09;&#xff0c;步骤如下 以线搜索方法为例&#xff0c;流程如下: 2. 方法分类 适用范围大类小类描述牛顿法雅可比矩阵难获取拟牛顿法 Broyden&#xff08;Secant method&#xff09;、…

Linux基础指令解析+项目部署环境

文章目录 前言基础指令部署项目环境总结 前言 Linux的魅力在于其强大的可定制性和灵活性&#xff0c;这使得它成为了众多开发者和运维人员的首选工具。然而&#xff0c;Linux的指令系统庞大而复杂&#xff0c;初学者往往容易迷失其中。因此&#xff0c;本文将带领大家走进Linu…

【第27章】MyBatis-Plus之Mybatis X 插件

文章目录 前言一、安装指南二、核心功能1.XML 映射跳转2.代码生成3. 重置模板 三、JPA 风格提示四、常见问题解答1. JPA 提示功能无法使用&#xff1f;2. 生成的表名与预期不符&#xff1f; 五、代码生成模板配置1. 默认模板2. 重置默认模板3. 自定义模板内容3.1 实体类信息3.2…

前端JS特效第28集:JQuery电影选座插件

JQuery电影选座插件&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下(全部代码在文章末尾)&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">&l…

2024-07抖音/快手/小红书/视频号/美团无人直播技术:最新不封号无人直播的操作方法详细介绍

2024年最新研究出来的无人直播技术&#xff0c;目前不封号&#xff0c;用途大大的&#xff0c;可带货&#xff0c;可引流&#xff0c;可获客。 手机自动直播源码通常涉及到实时流媒体技术和应用开发&#xff0c;它涉及以下几个关键部分&#xff1a; 摄像头接入&#xff1a;使用…

YOLOv8改进 | 注意力机制| 利用并行子网络构建深度较浅但性能卓越的网络【全网独家】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

[Spring] SpringBoot基本配置与快速上手

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

“LNMP环境搭建实战指南:从零开始配置CentOS 7下的Nginx、MySQL与PHP“

目录 1.前言 2.准备工作 2.1.环境信息 2.2.关闭SELinux和firewalld 3.安装Nginx 3.1.运行以下命令&#xff0c;安装Nginx 3.2.运行以下命令&#xff0c;查看Nginx版本 4.安装MySQL 4.1.更新秘钥 4.2.配置MySQL的YUM仓库 4.3.安装MySQL 4.4.查看MySQL版本 4.5.启动…

Let‘s Encrypt性价比最高的申请SSL证书

SSL/TLS证书作为确保网站数据传输安全性的重要手段&#xff0c;受到了广大网站运营者的青睐。然而&#xff0c;高昂的证书费用往往成为许多小型网站和个人博客的负担。 申请Lets Encrypt免费泛域名SSL证书步骤 1. 登录来此加密网站&#xff0c;输入域名&#xff0c;可以勾选泛…

二分查找算法【折半查找算法】

二分查找算法 二分查找算法&#xff0c;也称为折半查找&#xff0c;是一种在有序数组中查找特定元素的高效算法。它的工作原理是通过不断地将搜索区间减半来缩小目标值可能存在的范围&#xff0c;直至找到目标值或确定目标值不存在于数组中。二分查找的关键在于每次比较都能排…

节点流与处理流:深入解析Java中的IO流

节点流与处理流&#xff1a;深入解析Java中的IO流 1、节点流&#xff08;Node Stream&#xff09;1.1 定义1.2 好处1.3 示例 2、处理流&#xff08;Processing Stream&#xff09;2.1 定义2.2 好处2.3 创建特征2.4 示例 3、总结 &#x1f496;The Begin&#x1f496;点点关注&…

国产大模型第一梯队玩家,为什么pick了CPU?

AI一天&#xff0c;人间一年。 现在不论是大模型本身&#xff0c;亦或是AI应用的更新速度简直令人直呼跟不上—— Sora、Suno、Udio、Luma……重磅应用一个接一个问世。 也正如来自InfoQ的调查数据显示的那般&#xff0c;虽然AIGC目前还处于起步阶段&#xff0c;但市场规模已…

Java方法入门(006)

♦️方法的概念 什么是方法&#xff1f; 方法是将一组完成特定功能的代码整合在一起&#xff0c;以达到简化开发&#xff0c;减少代码耦合&#xff0c;提高代码复用性的结构&#xff0c;类似与C语言中的函数。方法是程序中最小的执行单元&#xff0c;可降低代码的重复性。 如用…

前后端如何实现非对称加解密-使用RSA为例讲解!

写在最前面&#xff0c;RSA是一种非对称加密算法&#xff0c;使用不同的公钥和私钥进行加密和解密。 下面是使用RSA进行加密和解密的代码示例&#xff1a; 前端&#xff1a;使用CryptoJS进行RSA加密 在前端JavaScript中&#xff0c;使用jsencrypt库来进行RSA加密&#xff1a…

MT3046 愤怒的象棚

思路&#xff1a; a[]存愤怒值&#xff1b;b[i]存以i结尾的&#xff0c;窗口里的最大值&#xff1b;c[i]存以i结尾的&#xff0c;窗口里面包含✳的最大值。 &#xff08;✳为新大象的位置&#xff09; 例&#xff1a;1 2 3 4 ✳ 5 6 7 8 9 则ans的计算公式b3b4c4c5c6b7b8b9…

从0开始的STM32HAL库学习1

基础外设初始化配置步骤 本学习以stm32f103c8t6为主控芯片学习。配合DMK-Keil使用&#xff0c;因为cubeide我还没找到很好的教程&#xff0c;而且用了几次发现不会用&#xff0c;所以还是先学习hal库&#xff0c;等hal库学习完之后再用学习使用cubeide&#xff0c;两者使用应该…

16. Revit API: Family、FamilySymbol、FamilyInstance

前言 前面写着一直絮絮叨叨&#xff0c;感觉不好。想找些表情包来&#xff0c;写得好玩点&#xff0c;但找不到合适的&#xff0c;或者说耗时费力又不满意&#xff0c;而自个儿又做不来表情包&#xff0c;就算了。 其次呢&#xff0c;之前会把部分类成员给抄表列出来&#xf…