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算法实现自动走迷宫机器人
项目描述: 在该项目中,你将使用强化学习算法,实现一个自动走迷宫机器人. 如上图所示,智能机器人显示在右上角.在我们的迷宫中,有陷阱(红色炸弹)及终点(蓝色的目标点)两种情景.机器人要尽量避开陷阱.尽 ...
随机推荐
- MySQL之创、增、删、改、查
MySQL Select version(); 当前服务器版本 Select database(); 查看当前工作数据库 Show databases; 显示所有数据库 Select user ...
- SQL中的row_number() over()解释
有一个面试题目, 有一张表,如下: event_type value time : - : : : : : 需要按照event_type排序,返回同一个event_type的,最近时间和次近时间的两个 ...
- SetROP2
一个Windows API SetROP2(int nDrawMode)的使用 该函数的主要的作用是根据nDrawMode设置的方式重新设定绘图的方式,下面就不同的nDrawMode值具体解释绘图模式 ...
- Java之Spring Cloud概念介绍(非原创)
文章大纲 一.理解微服务二.Spring Cloud知识介绍三.Spring Cloud全家桶四.参考资料下载五.参考文章 一.理解微服务 我们通过软件架构演进过程来理解什么是微服务,软件架构的发 ...
- solidity 学习笔记(3) 函数修饰符/继承
修饰符: 函数修饰符有 constant view pure 其中 constant和view的功能是一样的 不会消耗gas 也就是说不会做任何存储 constant在5.0以后的版本中被废弃 ...
- cogs1612. 大话西游
1612. 大话西游 http://www.cogs.pro/cogs/problem/problem.php?pid=1612 ★★ 输入文件:westward.in 输出文件:westwa ...
- 剑指Offer的学习笔记(C#篇)-- 序列化二叉树
题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 一 . 理解题意 二叉树的序列化,是将一个结构化的东西变成扁平化的字符串,序列化二叉树或者是反序列化二叉树就是二叉树和扩展二叉树遍历序列之间的 ...
- Python小世界:彻底搞懂Python一切皆对象!!!
前言 犹记得当初学习Python的时候,对于Python一切皆对象很是懵逼,因为Python是面向对象的动态型语言,而在函数及高阶函数的应用中,如若对于一切皆对象不是有很透彻的了解,基础不是那么牢固的 ...
- JDK自带反编译工具javap
在JDK的bin文件夹下,有许多自带工具: javap就是其中的一个,对应为 javap.exe javap可反编译查看Java编译器编译生成的字节码文件, 语法: javap [ options ] ...
- C# 文件异步操作
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...