Advertisement
TimmyChannel

Untitled

May 23rd, 2022
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.58 KB | None | 0 0
  1. using System.Text;
  2.  
  3. using static System.Math;
  4.  
  5. class GameField
  6. {
  7.     private int[,] _cells;
  8.  
  9.     public GameField(int[,] cells)
  10.     {
  11.         _cells = cells;
  12.     }
  13.  
  14.     public static GameField Generate(int size)
  15.     {
  16.         var cells = new int[size, size];
  17.         var variants = new List<int>(size * size - 1);
  18.         var random = new Random();
  19.  
  20.         for (int i = 0; i < size * size - 1; i++)
  21.         {
  22.             variants.Add(i + 1);
  23.         }
  24.  
  25.         for (int i = 0; i < size * size - 1; i++)
  26.         {
  27.             var y = i % size;
  28.             var x = i / size;
  29.             var variant = random.Next(0, variants.Count);
  30.             cells[x, y] = variants[variant];
  31.             variants.RemoveAt(variant);
  32.         }
  33.  
  34.         var field = new GameField(cells);
  35.        
  36.         if(!field.IsResolvable())
  37.         {
  38.             if(size == 2)
  39.                 (cells[size - 1, size - 2], cells[size - 2, size - 1]) = (cells[size - 2, size - 1], cells[size - 1, size - 2]);
  40.             else
  41.                 (cells[size - 1, size - 2], cells[size - 1, size - 3]) = (cells[size - 1, size - 3], cells[size - 1, size - 2]);
  42.         }
  43.  
  44.         return field;
  45.     }
  46.  
  47.     public bool IsResolvable()
  48.     {
  49.         var evenness = 0;
  50.         for (int i = 0; i < _cells.Length - 1; i++)
  51.         {
  52.             var y1 = i % _cells.GetLength(0);
  53.             var x1 = i / _cells.GetLength(1);
  54.  
  55.             for (int j = i + 1; j < _cells.Length - 1; j++)
  56.             {
  57.                 var y2 = j % _cells.GetLength(0);
  58.                 var x2 = j / _cells.GetLength(1);
  59.                 if (_cells[x1, y1] > _cells[x2, y2])
  60.                     evenness++;
  61.             }
  62.         }
  63.         return (evenness & 1) == 0;
  64.     }
  65.  
  66.     public int GetHeuristics()
  67.     {
  68.         var heuristics = 0;
  69.         for(int i = 0; i < _cells.Length - 1; i++)
  70.         {
  71.             var y1 = i % _cells.GetLength(0);
  72.             var x1 = i / _cells.GetLength(1);
  73.  
  74.             var value = _cells[x1, y1] - 1;
  75.  
  76.             var y2 = value % _cells.GetLength(0);
  77.             var x2 = value / _cells.GetLength(1);
  78.  
  79.             heuristics += Abs(x1 - x2) + Abs(y1 - y2);
  80.         }
  81.         return heuristics;
  82.     }
  83.  
  84.     public override string ToString()
  85.     {
  86.         var result = new StringBuilder();
  87.         for (int i = 0; i < _cells.GetLength(0); i++)
  88.         {
  89.             for (int j = 0; j < _cells.GetLength(1); j++)
  90.             {
  91.                 result.Append($"\t{_cells[i, j]}\t");
  92.             }
  93.             result.Append("\n");
  94.         }
  95.         return result.ToString();
  96.     }
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement