UWP开发:自动生成迷宫&自动寻路算法(3)
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)的更多相关文章
- UWP开发:自动生成迷宫&自动寻路算法(2)
之后我们编写一个类,同时创建一个List,将List与前端的Rectangle绑定. public static List<Rect> Rects { get; set; }Rects = ...
- UWP开发:自动生成迷宫&自动寻路算法(1)
(1)前端篇 首先,我们创建一个新的Universal Windows Platform程序.这些小方块是通过GridView来罗列的,这样可以避免MainPaga.xaml的<Rectangl ...
- 使用Java注解开发自动生成SQL
使用注解开发的好处就是减少配置文件的使用.在实际过程中,随着项目越来越复杂,功能越来越多,会产生非常多的配置文件.但是,当配置文件过多,实际维护过程中产生的问题就不容易定位,这样就会徒劳的增加工作量. ...
- Android开发——自动生成Android屏幕适配的dimens.xml文件
使用dimens.xml解决屏幕适配问题是Android官方解决方案,本文主要讲述了如何自动生成Android屏幕适配的dimens.xml,减少了工作量,在维护dimens.xml文件时更加省时省力 ...
- 基于注解处理器开发自动生成getter和setter方法的插件
昨天无意中,逛到了lombok的网站,并看到了首页的5分钟视频,视频中的作者只是在实体类中写了几个字段,就可以自动编译为含setter.getter.toString()等方法的class文件.看着挺 ...
- php生成迷宫和迷宫寻址算法实例
较之前的终于有所改善.生成迷宫的算法和寻址算法其实是一样.只是一个用了遍历一个用了递归.参考了网上的Mike Gold的算法. <?php //zairwolf z@cot8.com heade ...
- 【Javascript + Vue】实现随机生成迷宫图片
前言 成品预览:https://codesandbox.io/s/maze-vite-15-i7oik?file=/src/maze.js 不久前写了一篇文章介绍了如何解迷宫:https://www. ...
- 迷宫自动生成以及基于DFS的自动寻路算法
直接贴代码 #include<ctime> #include<conio.h> #include<iostream> #include<windows.h&g ...
- 用Q-learning算法实现自动走迷宫机器人
项目描述: 在该项目中,你将使用强化学习算法,实现一个自动走迷宫机器人. 如上图所示,智能机器人显示在右上角.在我们的迷宫中,有陷阱(红色炸弹)及终点(蓝色的目标点)两种情景.机器人要尽量避开陷阱.尽 ...
随机推荐
- android学习点滴一:android环境的搭建
东一点西一点,很多时间都浪费了.是该系统性的做好自己的东西了. <android学习点滴一:android环境的搭建> [环境变量]变量名:JAVA_HOME变量值:C:\Java\jdk ...
- 网络编程demo之Udp和URL
首先是udp编程客户端发送消息给服务端,服务端接受然后打印到console控制台上 下面是一个有代表性的demo package com.henu.liulei; import java.io.IOE ...
- How to generate a CSR in Microsoft IIS 7
How to generate a CSR in Microsoft IIS 7 To help you generate your CSR for Microsoft IIS 7 we've pre ...
- Php5.6.15-fpm的运行机制源码剖析
源码版本:Php5.6.15 源码目录:sapi/fpm/fpm 说明:源码的主要功能在上面直接注解 =============>>start<<=============== ...
- STP-9-处理RSTP中的拓扑变化
STP能识别四种不同的拓扑变化事件, 而RSTP只有当非边界端口从非转发状态变为转发状态才认为发生了拓扑变化事件 因为刚变为转发状态的端口可以为一些mac地址提供比之前更好的路径,CAM表需要更新.失 ...
- 搞定vscode编写java
下载vscode: 地址: https://code.visualstudio.com/ 安装插件 我这里下载的是绿色版,所以解压后 向桌面发送一个快捷方式 找到VS Code 的快捷方式位置: 右键 ...
- js 对象深拷贝
/* *p需要拷贝的对象 * */ var deepCopy=function(p, c) { var c = c || {}; for (var i in p) { if (typeof p[i] ...
- Python面向对象之接口类(抽象类)
Python面向对象之接口类(抽象类):就是制定一个规范. 比如定义了一个接口类(抽象类)(他们是不可以进行实例化的,这就是他为什么是制定一个规范的原因). 他的定义是需要abc模块,要变的就是他的方 ...
- Python网络编程之基础
计算机网络基础 网络到底是什么?计算机之间如何通信的? 早期:联机 以太网:局域网与交换机 ******广播 主机之间“一对所有”的通讯模式,网络对其中每一台主机发出的信号都进行无条件复制并转发, 所 ...
- CF 700E
构建后缀自动机,求出后缀树 比较明显的dp 设 \(f[i]\) 表示从上而下到达当前点能够满足条件的最优值 只需要检查父亲节点是否在当前串中出现过两次就行了 这个判断用 \(endpos\) 来判断 ...