private static int[,] mazeMap = new int[ + ,  + ];//0<=x<=12 0<=y<=24
private static Random Rd = new Random();

首先声明mazeMap存储数据,声明了一个15*27的迷宫,其中最外面的一圈是用来做墙的。

         public void GenerateMap() {             //初始化
for (int i = ; i <= + ; i++) {
for (int j = ; j <= + ; j++) {
if (i == || i == + || j == || j == + ) //初始化迷宫
mazeMap[i, j] = ;
else
mazeMap[i, j] = ;
}
}

这一块是初始化墙和内部的构造。其中我们约定,0是路,1是墙。

接下来贴出之后的算法。

         public void GenerateMap() {
for (int i = ; i <= + ; i++) {
for (int j = ; j <= + ; j++) {
if (i == || i == + || j == || j == + ) //初始化迷宫
mazeMap[i, j] = ;
else
mazeMap[i, j] = ;
}
} Create( * (Rd.Next() % ( / ) + ), * (Rd.Next() % ( / ) + )); //从随机一个点开始生成迷宫,该点行列都为偶数
for (int i = ; i <= + ; i++) //边界处理
{
mazeMap[i, ] = ;
mazeMap[i, + ] = ;
} for (int j = ; j <= + ; j++) //边界处理
{
mazeMap[, j] = ;
mazeMap[ + , j] = ;
}
mazeMap[, ] = ; //给定入口
mazeMap[ - , ] = ; //给定出口
}
         public void Create(int x, int y) //随机生成迷宫
{
int[,] c = new int[, ] { { , }, { , }, { , - }, { -, } }; //四个方向
for (int i = ; i < ; i++)
{
int j = Rd.Next() % ; int t = c[i, ];
c[i, ] = c[j, ];
c[j, ] = t;
t = c[i, ];
c[i, ] = c[j, ];
c[j, ] = t;
}
mazeMap[x, y] = ;
for (int i = ; i < ; i++)
if (mazeMap[x + * c[i, ], y + * c[i, ]] == ) {
mazeMap[x + c[i, ], y + c[i, ]] = ; Create(x + * c[i, ], y + * c[i, ]);
}
}

审视这段代码,如果我们使用一些技巧,代码可读性将会更好,其中的13都是Height,迷宫高度;25都是Width,迷宫宽度,当读到13和25时,可以自动代入Height与Width去理解。

算法的原理很简单,就是递归生成迷宫。

 Create(x +  * c[i, ], y +  * c[i, ]);

这一行就是关键递归代码。

参考文献:http://wenku.baidu.com/view/f22455126edb6f1aff001f13.html

虽说是百度文库的,但是值得一读。

下面贴出完整代码。

 using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Devices.Bluetooth.Advertisement;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.Security.Cryptography.Core;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation; // The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409 namespace Maze
{
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class MainPage : Page
{
private static int[,] mazeMap = new int[ + , + ];//0<=x<=12 0<=y<=24
private static Random Rd = new Random();
public static List<Rect> Rects { get; set; } public MainPage() {
this.InitializeComponent(); Rects = new List<Rect>(); GenerateMap();
for (int x = ; x < ; x++)//25*14
{
var rect = new Rect() { X = x / , Y = x % };
switch (mazeMap[rect.X + , rect.Y + ]) {
case :
rect.Color = "Blue";
break;
case :
rect.Color = "Gray";
break;
case :
rect.Color = "Red";
break;
case :
rect.Color = "Yellow";
break; }
Rects.Add(rect);
}
GridView.ItemsSource = Rects; } public class Rect
{
public int X { get; set; }
public int Y { get; set; }//以左上角为1,1
public string Color { get; set; }
} public void GenerateMap() {
for (int i = ; i <= + ; i++) {
for (int j = ; j <= + ; j++) {
if (i == || i == + || j == || j == + ) //初始化迷宫
mazeMap[i, j] = ;
else
mazeMap[i, j] = ;
}
} Create( * (Rd.Next() % ( / ) + ), * (Rd.Next() % ( / ) + )); //从随机一个点开始生成迷宫,该点行列都为偶数
for (int i = ; i <= + ; i++) //边界处理
{
mazeMap[i, ] = ;
mazeMap[i, + ] = ;
} for (int j = ; j <= + ; j++) //边界处理
{
mazeMap[, j] = ;
mazeMap[ + , j] = ;
}
mazeMap[, ] = ; //给定入口
mazeMap[ - , ] = ; //给定出口
} public void Create(int x, int y) //随机生成迷宫
{
int[,] c = new int[, ] { { , }, { , }, { , - }, { -, } }; //四个方向
for (int i = ; i < ; i++)
{
int j = Rd.Next() % ; int t = c[i, ];
c[i, ] = c[j, ];
c[j, ] = t;
t = c[i, ];
c[i, ] = c[j, ];
c[j, ] = t;
}
mazeMap[x, y] = ;
for (int i = ; i < ; i++)
if (mazeMap[x + * c[i, ], y + * c[i, ]] == ) {
mazeMap[x + c[i, ], y + c[i, ]] = ; Create(x + * c[i, ], y + * c[i, ]);
}
}
}

UWP开发:自动生成迷宫&自动寻路算法(3)的更多相关文章

  1. UWP开发:自动生成迷宫&自动寻路算法(2)

    之后我们编写一个类,同时创建一个List,将List与前端的Rectangle绑定. public static List<Rect> Rects { get; set; }Rects = ...

  2. UWP开发:自动生成迷宫&自动寻路算法(1)

    (1)前端篇 首先,我们创建一个新的Universal Windows Platform程序.这些小方块是通过GridView来罗列的,这样可以避免MainPaga.xaml的<Rectangl ...

  3. 使用Java注解开发自动生成SQL

    使用注解开发的好处就是减少配置文件的使用.在实际过程中,随着项目越来越复杂,功能越来越多,会产生非常多的配置文件.但是,当配置文件过多,实际维护过程中产生的问题就不容易定位,这样就会徒劳的增加工作量. ...

  4. Android开发——自动生成Android屏幕适配的dimens.xml文件

    使用dimens.xml解决屏幕适配问题是Android官方解决方案,本文主要讲述了如何自动生成Android屏幕适配的dimens.xml,减少了工作量,在维护dimens.xml文件时更加省时省力 ...

  5. 基于注解处理器开发自动生成getter和setter方法的插件

    昨天无意中,逛到了lombok的网站,并看到了首页的5分钟视频,视频中的作者只是在实体类中写了几个字段,就可以自动编译为含setter.getter.toString()等方法的class文件.看着挺 ...

  6. php生成迷宫和迷宫寻址算法实例

    较之前的终于有所改善.生成迷宫的算法和寻址算法其实是一样.只是一个用了遍历一个用了递归.参考了网上的Mike Gold的算法. <?php //zairwolf z@cot8.com heade ...

  7. 【Javascript + Vue】实现随机生成迷宫图片

    前言 成品预览:https://codesandbox.io/s/maze-vite-15-i7oik?file=/src/maze.js 不久前写了一篇文章介绍了如何解迷宫:https://www. ...

  8. 迷宫自动生成以及基于DFS的自动寻路算法

    直接贴代码 #include<ctime> #include<conio.h> #include<iostream> #include<windows.h&g ...

  9. 用Q-learning算法实现自动走迷宫机器人

    项目描述: 在该项目中,你将使用强化学习算法,实现一个自动走迷宫机器人. 如上图所示,智能机器人显示在右上角.在我们的迷宫中,有陷阱(红色炸弹)及终点(蓝色的目标点)两种情景.机器人要尽量避开陷阱.尽 ...

随机推荐

  1. 《精通Spring4.X企业应用开发实战》读后感第五章(注入参数详解)

  2. hdu1853 Cyclic Tour (二分图匹配KM)

    Cyclic Tour Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/65535 K (Java/Others)Total ...

  3. NativeScript官方书籍:1.为什么选择nativescript

    1.为什么选择nativescript 本章介绍 什么是NativeScript nativescript对于移动开发世界意味着什么 NativeScript工作原理 在早期的移动应用程序(前iPho ...

  4. spring-boot-starter-data-redis学习笔记01

    1.Redis在Unbuntu14开启, 进入安装的src目录: 1.修改redis.conf,因为redis默认是受保护模式. protected-mode yes   (改为no) bind 12 ...

  5. c# 库间关系

  6. Unity T4M 中文讲解

    http://blog.csdn.net/tianmao111/article/details/46482963 现在在u3d圈里流行了一种地形转换器(或者叫编辑器吧),但是经查阅之后,似乎还没有中文 ...

  7. IT兄弟连 Java语法教程 Java语言背景

    驱使计算机语言革新的因素有两个:程序设计技术的改进和计算环境的改变.Java也不例外.在大量继承C和C++的基础之上,Java还增加了反应当前程序设计技术状态的功能与精华.针对在线环境的蓬勃发展(In ...

  8. Android实现监听控件点击事件

    Android实现监听控件点击事件 引言 这篇文章主要想写一下Android实现监听点击事件的几种方法,Activity和Fragment实现起来有些方法上会有些不同,这里也略做介绍. 最近一直在忙一 ...

  9. 如何在VMware workstation上创建Linux虚拟机

    由于需要使用Linux虚拟机部署Hadoop集群,故在win10系统上安装了VMware workstation 14,现将介绍如何在VMware workstation上创建Linux虚拟机.下面以 ...

  10. Node.js的安装与使用-Windows系统

    首先到官网下载node.js http://nodejs.cn 下载完成后一直下一步Next即可安装完成,路径可以自己设置 然后配置环境变量,将node安装的目录配置到Path中 例如: cmd打开命 ...