Run Code
|
API
|
Code Wall
|
Misc
|
Feedback
|
Login
|
Theme
|
Privacy
|
Patreon
Enemy Spawner
//Rextester.Program.Main is the entry point for your code. Don't change it. //Microsoft (R) Visual C# Compiler version 2.9.0.63208 (958f2354) using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; namespace Rextester { public class Program { private static Random rng = new Random(); public static void Main(string[] args) { const int SpawnChunksSize = 5; int spawnSizeX = 5; int spawnSizeZ = 5; int iteration = 0; int minX = 0; int minZ = 0; int maxX = Math.Min(spawnSizeX, SpawnChunksSize); int maxZ = Math.Min(spawnSizeZ, SpawnChunksSize); int unitIndex = 0; List<Entity> allEnemiesToSpawn = new List<Entity>(); for(int i = 0; i < 3; i++) { allEnemiesToSpawn.Add(new Entity("A" + i, 1)); } for(int i = 0; i < 3; i++) { allEnemiesToSpawn.Add(new Entity("B" + i, 3)); } for(int i = 0; i < 3; i++) { allEnemiesToSpawn.Add(new Entity("C" + i, 4)); } Shuffle(allEnemiesToSpawn); List<Entity> remainingEnemiesToSpawn = new List<Entity>(allEnemiesToSpawn); Console.WriteLine(string.Join(", ", remainingEnemiesToSpawn)); Console.WriteLine(""); HashSet<(int, int)> filledPositions = new HashSet<(int, int)>(); HashSet<(int, int)> auxPositions = new HashSet<(int, int)>(); List<(Entity, (int, int))> enemiesPositionList = new List<(Entity, (int, int))>(); Dictionary<(int, int), Entity> entityPositions = new Dictionary<(int, int), Entity>(); List<Entity> placedEntities = new List<Entity>(); do { for (int z = minZ; z < maxZ; z++) { for (int x = minX; x < maxX;) { Console.WriteLine(x + ", " + z); if (filledPositions.Contains((x, z))) { Console.WriteLine("---Is filled: " + x + ", " + z); x++; continue; } while (unitIndex < remainingEnemiesToSpawn.Count) { int unitSize = remainingEnemiesToSpawn[unitIndex].size; if (unitSize > spawnSizeX - x || unitSize > spawnSizeZ - z) // Does not fit { Console.WriteLine("---Too big " + remainingEnemiesToSpawn[unitIndex] + " at: " + x + ", " + z + " - unitSize: " + unitSize + " spawnSize: " + spawnSizeX + ", " + spawnSizeZ); unitIndex++; // Try next one continue; } // Check if positions are free auxPositions.Clear(); bool fits = true; for (int enemyX = 0; enemyX < unitSize && fits; enemyX++) { for (int enemyZ = 0; enemyZ < unitSize && fits; enemyZ++) { (int, int) auxPos = (x + enemyX, z + enemyZ); if (filledPositions.Contains(auxPos)) { fits = false; continue; } auxPositions.Add(auxPos); } } if (!fits) { Console.WriteLine("---Couldn't place " + remainingEnemiesToSpawn[unitIndex] + " at: " + x + ", " + z); unitIndex++; // Try next one continue; } // Assign position to enemy enemiesPositionList.Add((remainingEnemiesToSpawn[unitIndex], (x, z))); entityPositions.Add((x, z), remainingEnemiesToSpawn[unitIndex]); placedEntities.Add(remainingEnemiesToSpawn[unitIndex]); // Reserve positions according to unit size int i = 0; int j = 0; for (; i < unitSize; i++) { for (j = 0; j < unitSize; j++) { filledPositions.Add((x + i, z + j)); enemiesPositionList.Add((remainingEnemiesToSpawn[unitIndex], (x + i, z + j))); if(i != 0 || j != 0) { entityPositions.Add((x + i, z + j), remainingEnemiesToSpawn[unitIndex]); } } } x += i - 1; remainingEnemiesToSpawn.RemoveAt(unitIndex); unitIndex = 0; break; } Console.WriteLine("Couldn't place any at: " + x + ", " + z); unitIndex = 0; x++; } } if (iteration % 2 == 0) { minX = maxX; maxX = Math.Min(maxX * 2, spawnSizeX); minZ = 0; } else { minZ = maxZ; maxZ = Math.Min(maxZ * 2, spawnSizeZ); minX = 0; } Console.WriteLine("Iteration: " + iteration); Console.WriteLine("Placed: " + string.Join(", ", placedEntities)); Console.WriteLine("Remaining: " + string.Join(", ", remainingEnemiesToSpawn)); DebugSpawner(spawnSizeX, spawnSizeZ, entityPositions); Console.WriteLine("__________________________________________"); Console.WriteLine(""); placedEntities.Clear(); iteration++; }while (maxX < spawnSizeX && maxZ < spawnSizeZ && remainingEnemiesToSpawn.Count > 0); Console.WriteLine(" ******************* "); Console.WriteLine("Final: "); Console.WriteLine("Remaining: " + string.Join(", ", remainingEnemiesToSpawn)); DebugSpawner(spawnSizeX, spawnSizeZ, entityPositions); DebugSpawner(spawnSizeX, spawnSizeZ, CenterEnemiesToSpawn(spawnSizeX, spawnSizeZ, entityPositions)); } public static void DebugSpawner(int sizeX, int sizeZ, Dictionary<(int, int), Entity> entityPositions) { string debug = ""; for(int z = -1; z < sizeZ; z++) { if(z == -1) { for(int x = -1; x < sizeX; x++) { debug += x + "\t"; } debug += "\n"; continue; } debug += z + "\t"; for(int x = 0; x < sizeX; x++) { debug += entityPositions.ContainsKey((x, z)) ? entityPositions[(x, z)].name : "--"; debug += "\t"; } if(z + 1 < sizeZ) { debug += "\n"; } } Console.WriteLine("\nEnemies: "); Console.WriteLine(debug); } public static void DebugFilledPosition(int sizeX, int sizeZ, HashSet<(int, int)> filledPositions) { string debug = ""; for(int z = 0; z < sizeZ; z++) { for(int x = 0; x < sizeX; x++) { debug += filledPositions.Contains((x, z)) ? "xx" : "--"; debug += "\t"; } if(z + 1 < sizeZ) { debug += "\n"; } } Console.WriteLine("\nFilled Positions: "); Console.WriteLine(debug); } public static Dictionary<(int, int), Entity> CenterEnemiesToSpawn(int sizeX, int sizeZ, Dictionary<(int, int), Entity> entityPositions) { int maxX = 0; int maxZ = 0; foreach((int, int) pos in entityPositions.Keys) { maxX = Math.Max(maxX, pos.Item1); maxZ = Math.Max(maxZ, pos.Item2); } int offsetX = (int)Math.Floor((sizeX - maxX - 1) * 0.5f); int offsetZ = (int)Math.Floor((sizeZ - maxZ - 1) * 0.5f); Dictionary<(int, int), Entity> fixedPositions = new Dictionary<(int, int), Entity>(); foreach((int, int) pos in entityPositions.Keys) { fixedPositions.Add((pos.Item1 + offsetX, pos.Item2 + offsetZ), entityPositions[pos]); } return fixedPositions; } public static void Shuffle<T>(IList<T> list) { int n = list.Count; while (n > 1) { n--; int k = rng.Next(n + 1); T value = list[k]; list[k] = list[n]; list[n] = value; } } } public class Entity { public string name; public int size; public Entity(string name, int size) { this.name = name; this.size = size; } public override string ToString() { return name; } } }
run
|
edit
|
history
|
help
0
Lab7
makingNum
gh
jkloikujyt5r4e3wsxdf
prettier Tasty
online compiler
7.1. Asynchrony: the new approach
tool
look at this, soaches
if Two Words Are Anagrams of Each Other