Advertisement
xxeell

Untitled

Mar 25th, 2018
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.80 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace LabyrinthGeneratorLibrary
  7. {
  8.     public class RecursionGenerator : BaseGenerator
  9.     {
  10.         private bool[,] res;
  11.         private int xSize, ySize;
  12.         private Random r;
  13.         private int generationFrequency = 30;
  14.  
  15.         private void StartInit()
  16.         {
  17.             for (int x = 3; x < xSize - 3; x++)
  18.             {
  19.                 for (int y = 3; y < ySize - 3; y++)
  20.                 {
  21.                     if (r.Next(generationFrequency) == 0) res[x, y] = true;
  22.                 }
  23.             }
  24.         }
  25.  
  26.         private void AllPathFinder()
  27.         {
  28.             for (int i = 0; i < 10; i++)
  29.             {
  30.                 for (int x = 2; x < xSize - 2; x++)
  31.                 {
  32.                     for (int y = 2; y < ySize - 2; y++)
  33.                     {
  34.                         if (res[x, y])
  35.                         {
  36.                             PathFinder(x, y);
  37.                         }
  38.                     }
  39.                 }
  40.             }
  41.         }
  42.  
  43.         private int LookAround(int x, int y)
  44.         {
  45.             int counter = 0;
  46.  
  47.             if(y + 1 < ySize - 1) if (res[x, y + 1]) counter++;
  48.             if (x + 1 < xSize - 1) if (res[x + 1, y]) counter++;
  49.             if (y - 1 > 1) if (res[x, y - 1]) counter++;
  50.             if (x - 1 > 1) if (res[x - 1, y]) counter++;
  51.  
  52.             return counter;
  53.         }
  54.  
  55.         private void PathFinder(int x, int y)
  56.         {
  57.             int around = LookAround(x, y);
  58.  
  59.             if (around == 3) return;
  60.  
  61.             if (around > 3) res[x, y] = false;
  62.  
  63.             if (around < 2)
  64.             {
  65.             pathlabel:
  66.                 int direction = r.Next(1, 5);
  67.  
  68.                 //   1
  69.                 // 4 0 2
  70.                 //   3
  71.  
  72.                 switch (direction)
  73.                 {
  74.                     case 1:
  75.                         {
  76.                             if (y - 1 < 2) goto pathlabel;
  77.                             else
  78.                             {
  79.                                 res[x, y - 1] = true;
  80.                                 PathFinder(x, y - 1);
  81.                             }
  82.                             break;
  83.                         }
  84.                     case 2:
  85.                         {
  86.                             if (x + 1 > xSize - 1) goto pathlabel;
  87.                             else
  88.                             {
  89.                                 res[x + 1, y] = true;
  90.                                 PathFinder(x + 1, y);
  91.                             }
  92.                             break;
  93.                         }
  94.                     case 3:
  95.                         {
  96.                             if (y + 1 > ySize - 1) goto pathlabel;
  97.                             else
  98.                             {
  99.                                 res[x, y + 1] = true;
  100.                                 PathFinder(x, y + 1);
  101.                             }
  102.                             break;
  103.                         }
  104.                     case 4:
  105.                         {
  106.                             if (x - 1 < 2) goto pathlabel;
  107.                             else
  108.                             {
  109.                                 res[x - 1, y] = true;
  110.                                 PathFinder(x - 1, y);
  111.                             }
  112.                             break;
  113.                         }
  114.                 }
  115.                 PathFinder(x, y);
  116.             }
  117.         }
  118.  
  119.         public override bool[,] Generate(int xSize, int ySize, Random r)
  120.         {
  121.             this.r = r;
  122.             this.xSize = xSize;
  123.             this.ySize = ySize;
  124.             res = new bool[xSize, ySize];
  125.  
  126.             StartInit();
  127.             AllPathFinder();
  128.  
  129.             return res;
  130.         }
  131.     }
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement