Advertisement
xxeell

Untitled

May 8th, 2018
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 12.60 KB | None | 0 0
  1.     public class TonelGenOld
  2.     {
  3.         static private bool[,] res;
  4.         static private bool[,] secondLayer;
  5.         static private Random r = new Random();
  6.         static private int h, w;
  7.  
  8.         static public bool[,] TGen(int inPutWidth, int inPutHeight)
  9.         {
  10.             w = inPutWidth;
  11.             h = inPutHeight;
  12.             res = new bool[w, h];
  13.             secondLayer = new bool[w, h];
  14.             w--;
  15.             h--;
  16.             //
  17.             for (int x = 1; x < w; x++)
  18.             {
  19.                 for (int y = 1; y < h; y++)
  20.                 {
  21.                     if (r.Next(0, 50) == 0) res[x, y] = true;
  22.                 }
  23.             }
  24.  
  25.             layerTwoInut();
  26.             makeOneLayer();
  27.  
  28.             FinalProverka();
  29.  
  30.             return res;
  31.         }
  32.  
  33.         static private void layerTwoInut()
  34.         {
  35.             for (int x = 1; x < w; x++)
  36.             {
  37.                 for (int y = 1; y < h; y++)
  38.                 {
  39.                     if (res[x, y]) roundLook(x, y);
  40.                 }
  41.             }
  42.         }
  43.  
  44.         static private void roundLook(int sx, int sy)
  45.         {
  46.             for (int x = sx - 1; x >= 0; x--)
  47.             {
  48.                 if (res[x, sy]) doLine(x, sy, sx, sy);
  49.             }
  50.  
  51.             for (int x = sx + 1; x < w; x++)
  52.             {
  53.                 if(res[x, sy]) doLine(sx, sy, x, sy);
  54.             }
  55.  
  56.             for (int y = sy - 1; y >= 0; y--)
  57.             {
  58.                 if (res[sx, y]) doLine(sx, y, sx, sy);
  59.             }
  60.  
  61.             for (int y = sy + 1; y < h; y++)
  62.             {
  63.                 if (res[sx, y]) doLine(sx, sy, sx, y);
  64.             }
  65.         }
  66.  
  67.         static private void doLine(int sx, int sy, int fx, int fy)
  68.         {
  69.             for (int x = sx; x <= fx; x++)
  70.             {
  71.                 for (int y = sy; y <= fy; y++)
  72.                 {
  73.                     secondLayer[x, y] = true;
  74.                 }
  75.             }
  76.         }
  77.  
  78.         static private void makeOneLayer()
  79.         {
  80.             for (int x = 0; x < w; x++)
  81.             {
  82.                 for (int y = 0; y < h; y++)
  83.                 {
  84.                     if (secondLayer[x, y]) res[x, y] = true;
  85.                 }
  86.             }
  87.         }
  88.  
  89.         static private void FinalProverka()
  90.         {
  91.             for (int x = 0; x < w; x++)
  92.             {
  93.                 for (int y = 0; y < h; y++)
  94.                 {
  95.                     if (res[x, y])
  96.                     {
  97.                         if (LookAroundIsAlone(x, y))
  98.                         {
  99.                             ForAlone(x, y);
  100.                         }
  101.                     }
  102.                 }
  103.             }
  104.         }
  105.  
  106.         static private bool LookAroundIsAlone(int x, int y)
  107.         {
  108.             int c = 0;
  109.             if (res[x + 1, y]) c++;
  110.             if (res[x - 1, y]) c++;
  111.             if (res[x, y + 1]) c++;
  112.             if (res[x, y - 1]) c++;
  113.  
  114.             if (c < 2) return true;
  115.             return false;
  116.         }
  117.  
  118.         static private void ForAlone(int ix, int iy)
  119.         {
  120.             int x = ix;
  121.             int y = iy;
  122.  
  123.             for (x++; x < w; x++)
  124.             {
  125.                 if (res[x, y])
  126.                 {
  127.                     for (x--; x > ix; x--)
  128.                     {
  129.                         res[x, y] = true;
  130.                     }
  131.                     break;
  132.                 }
  133.             }
  134.  
  135.             x = ix;
  136.             y = iy;
  137.  
  138.             for (x--; x > 0; x--)
  139.             {
  140.                 if (res[x, y])
  141.                 {
  142.                     for (x++; x < ix; x++)
  143.                     {
  144.                         res[x, y] = true;
  145.                     }
  146.                     break;
  147.                 }
  148.             }
  149.  
  150.             x = ix;
  151.             y = iy;
  152.  
  153.             for (y++; y < h; y++)
  154.             {
  155.                 if (res[x, y])
  156.                 {
  157.                     for (y--; y > iy; y--)
  158.                     {
  159.                         res[x, y] = true;
  160.                     }
  161.                     break;
  162.                 }
  163.             }
  164.  
  165.             x = ix;
  166.             y = iy;
  167.  
  168.             for (y--; y > 0; y--)
  169.             {
  170.                 if (res[x, y])
  171.                 {
  172.                     for (y++; y < iy; y++)
  173.                     {
  174.                         res[x, y] = true;
  175.                     }
  176.                     break;
  177.                 }
  178.             }
  179.         }
  180.  
  181.         static private void endSkan()
  182.         {
  183.             int ix, iy;
  184.  
  185.             for (int x = 0; x < w; x++)
  186.             {
  187.                 for (int y = 0; y < h; y++)
  188.                 {
  189.                     if (res[x, y])
  190.                     {
  191.                         if (LookAroundIsAlone(x, y))
  192.                         {
  193.                             ix = x;
  194.                             ix++;
  195.                             if (ix < w) res[ix, y] = true;
  196.                             ix++;
  197.                             if (ix < w) res[ix, y] = true;
  198.                             ix++;
  199.                             if (ix < w) res[ix, y] = true;
  200.                             ix++;
  201.                             if (ix < w) res[ix, y] = true;
  202.                             ix++;
  203.                             if (ix < w) res[ix, y] = true;
  204.  
  205.                             ix = x;
  206.                             ix--;
  207.                             if (ix > 1) res[ix, y] = true;
  208.                             ix--;
  209.                             if (ix > 1) res[ix, y] = true;
  210.                             ix--;
  211.                             if (ix > 1) res[ix, y] = true;
  212.                             ix--;
  213.                             if (ix > 1) res[ix, y] = true;
  214.                             ix--;
  215.                             if (ix > 1) res[ix, y] = true;
  216.  
  217.                             iy = y;
  218.                             iy++;
  219.                             if (ix < h) res[x, iy] = true;
  220.                             iy++;
  221.                             if (ix < h) res[x, iy] = true;
  222.                             iy++;
  223.                             if (ix < h) res[x, iy] = true;
  224.                             iy++;
  225.                             if (ix < h) res[x, iy] = true;
  226.                             iy++;
  227.                             if (ix < h) res[x, iy] = true;
  228.  
  229.                             iy = y;
  230.                             iy--;
  231.                             if (ix > 1) res[x, iy] = true;
  232.                             iy--;
  233.                             if (ix > 1) res[x, iy] = true;
  234.                             iy--;
  235.                             if (ix > 1) res[x, iy] = true;
  236.                             iy--;
  237.                             if (ix > 1) res[x, iy] = true;
  238.                             iy--;
  239.                             if (ix > 1) res[x, iy] = true;
  240.                         }
  241.                     }
  242.                 }
  243.             }
  244.             FinalProverka();
  245.         }
  246.     }
  247.  
  248.     class TonelDungeonGeneratorNew
  249.     {
  250.         private static bool[,] layer1;
  251.         private static bool[,] layer2;
  252.         private static int height, width;
  253.         private static int frequency = 50;
  254.         private static Random r;
  255.  
  256.         public static bool[,] Generate(int iheight, int iwidth)
  257.         {
  258.             r = new Random();
  259.             height = iheight;
  260.             width = iwidth;
  261.             frequency = (height + width) / 2;
  262.             layer1 = new bool[width, height];
  263.             layer2 = new bool[width, height];
  264.  
  265.             Init(frequency);
  266.             PrimaryTunneling();
  267.             AdditionalWays();
  268.  
  269.             bool[,] res = new bool[width, height];
  270.  
  271.             for (int x = 0; x < width; x++)
  272.             {
  273.                 for (int y = 0; y < height; y++)
  274.                 {
  275.                     if (layer1[x, y])
  276.                     {
  277.                         res[x, y] = true;
  278.                     }
  279.                 }
  280.             }
  281.  
  282.             layer1 = null;
  283.             layer2 = null;
  284.  
  285.             return res;
  286.         }
  287.  
  288.         private static void JoiningLayers()
  289.         {
  290.             for (int x = 0; x < width; x++)
  291.             {
  292.                 for (int y = 0; y < height; y++)
  293.                 {
  294.                     if (layer2[x, y])
  295.                     {
  296.                         layer1[x, y] = true;
  297.                     }
  298.  
  299.                     layer2[x, y] = false;
  300.                 }
  301.             }
  302.         }
  303.  
  304.         private static void Init(int frequency)
  305.         {
  306.             for (int x = 0; x < width; x++)
  307.             {
  308.                 for (int y = 0; y < height; y++)
  309.                 {
  310.                     if (r.Next(frequency) == 0)
  311.                     {
  312.                         layer1[x, y] = true;
  313.                     }
  314.                 }
  315.             }
  316.         }
  317.  
  318.         private static void PrimaryTunneling()
  319.         {
  320.             for (int x = 0; x < width; x++)
  321.             {
  322.                 for (int y = 0; y < height; y++)
  323.                 {
  324.                     if (layer1[x, y])
  325.                     {
  326.                         Tunneling_1(x, y);
  327.                     }
  328.                 }
  329.             }
  330.  
  331.             JoiningLayers();
  332.         }
  333.  
  334.         private static void Tunneling_1(int ix, int iy)
  335.         {
  336.             bool draw_flag = false;
  337.             for (int x = 0; x < ix; x++)
  338.             {
  339.                 if (draw_flag)
  340.                 {
  341.                     layer2[x, iy] = true;
  342.                 }
  343.                 else
  344.                 {
  345.                     if (layer1[x, iy])
  346.                     {
  347.                         draw_flag = true;
  348.                     }
  349.                 }
  350.             }
  351.  
  352.             draw_flag = false;
  353.             for (int x = ix + 1; x < width; x++)
  354.             {
  355.                 if (draw_flag)
  356.                 {
  357.                     layer2[x, iy] = true;
  358.                 }
  359.                 else
  360.                 {
  361.                     if (layer1[x, iy])
  362.                     {
  363.                         draw_flag = true;
  364.                     }
  365.                 }
  366.             }
  367.  
  368.             draw_flag = false;
  369.             for (int y = 0; y < iy; y++)
  370.             {
  371.                 if (draw_flag)
  372.                 {
  373.                     layer2[ix, y] = true;
  374.                 }
  375.                 else
  376.                 {
  377.                     if (layer1[ix, y])
  378.                     {
  379.                         draw_flag = true;
  380.                     }
  381.                 }
  382.             }
  383.  
  384.             draw_flag = false;
  385.             for (int y = 0; y < iy; y++)
  386.             {
  387.                 if (draw_flag)
  388.                 {
  389.                     layer2[ix, y] = true;
  390.                 }
  391.                 else
  392.                 {
  393.                     if (layer1[ix, y])
  394.                     {
  395.                         draw_flag = true;
  396.                     }
  397.                 }
  398.             }
  399.         }
  400.  
  401.         private static int LookAround(int x, int y)
  402.         {
  403.             int c = 0;
  404.  
  405.             if (x - 1 > 0) if (layer1[x - 1, y]) c++;
  406.             if (x + 1 < width - 1) if (layer1[x + 1, y]) c++;
  407.             if (y - 1 > 0) if (layer1[x, y - 1]) c++;
  408.             if (y + 1 < height - 1) if (layer1[x, y + 1]) c++;
  409.  
  410.             return c;
  411.         }
  412.  
  413.         private static void TunnelingAround(int ix, int iy)
  414.         {
  415.             for (int x = ix - 1; x > 0; x--)
  416.             {
  417.                 if (layer1[x, iy]) break;
  418.                 layer2[x, iy] = true;
  419.             }
  420.  
  421.             for (int x = ix + 1; x < width - 1; x++)
  422.             {
  423.                 if (layer1[x, iy]) break;
  424.                 layer2[x, iy] = true;
  425.             }
  426.  
  427.             for (int y = iy - 1; y > 0; y--)
  428.             {
  429.                 if (layer1[ix, y]) break;
  430.                 layer2[ix, y] = true;
  431.             }
  432.  
  433.             for (int y = iy + 1; y < height - 1; y--)
  434.             {
  435.                 if (layer1[ix, y]) break;
  436.                 layer2[ix, y] = true;
  437.             }
  438.         }
  439.  
  440.         private static void AdditionalWays()
  441.         {
  442.             bool again = true;
  443.  
  444.             while (again)
  445.             {
  446.                 again = false;
  447.  
  448.                 for (int x = 0; x < width; x++)
  449.                 {
  450.                     for (int y = 0; y < height; y++)
  451.                     {
  452.                         if (layer1[x, y])
  453.                         {
  454.                             if (LookAround(x, y) < 2)
  455.                             {
  456.                                 again = true;
  457.                                 TunnelingAround(x, y);
  458.                             }
  459.                         }
  460.                     }
  461.                 }
  462.  
  463.                 if (again) JoiningLayers();
  464.             }
  465.         }
  466.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement