private List<ICoordinates> ListOfRadius(ICoordinates co, int Radius) { ICoordinates cur=new CCoordinates(); cur.Copy(co); List<ICoordinates> ret=new List<ICoordinates>(); List<ICoordinates> allied=new List<ICoordinates>(); Stack<ICoordinates> stack1 = new Stack<ICoordinates>(); Stack<ICoordinates> stack2 = new Stack<ICoordinates>(); Stack<ICoordinates> swap=null; ret.Add(co); bool [,]gone=new bool[maxX+1,maxY+1]; stack1.Push(cur); gone[cur.X1, cur.Y1] = true; for(int y=0;y<Radius;y++) { while(stack1.Count!=0) { cur=new CCoordinates(); cur.Copy(stack1.Pop()); allied=AlliedNodes(cur); foreach (ICoordinates x in allied) { if(!gone[x.X1,x.Y1]) { stack2.Push(x); gone[x.X1,x.Y1]=true; } } } foreach( ICoordinates x in stack2) { cur=new CCoordinates(); cur.Copy(x); ret.Add(cur); } swap=stack2; stack2=stack1; stack1=swap; } return ret; }
private bool isConnected() { ICoordinates empt=EmptyCoords[0]; // любой пустой элемент Stack<CCoordinates> stack=new Stack<CCoordinates>(); CCoordinates lol=new CCoordinates(); CCoordinates pushing=new CCoordinates(); lol.Copy(empt); stack.Push(lol); int HowMuchEmpty=1; // сначала есть 1 пустая вершина bool [,]lables=new bool[maxX+1,maxY+1]; // false по умолчанию lables[lol.X1,lol.Y1]=true; while(stack.Count!=0) { lol=stack.Pop(); foreach(ICoordinates x in this.AlliedNodes(lol)) { if((this.map[x.X1,x.Y1]!=TypesOfField.WALL)&&(!lables[x.X1,x.Y1])) { pushing = new CCoordinates(); pushing.Copy(x); stack.Push(pushing); HowMuchEmpty++; lables[pushing.X1,pushing.Y1]=true; } } } bool ret=false; if(HowMuchEmpty==EmptyCoords.Count) ret=true; return ret; }
internal void ReadFromFile(string path) { BinaryReader r = new BinaryReader(File.OpenRead(path)); maxX = r.ReadInt32(); maxY = r.ReadInt32(); Bonuses = 0; Medics = 0; Spaces = 0; Walls = 0; map = new TypesOfField[maxX + 1, maxY + 1]; EmptyCoords = new List<ICoordinates>(); ICoordinates cur=new CCoordinates(); int k=0; for (int x = 1; x <= maxX; x++) for (int y = 1; y <= maxY; y++) { k = r.ReadInt32(); switch (k) { case 0: map[x, y] = TypesOfField.NOTHING; Spaces++; cur = new CCoordinates(); cur.X1 = x;cur.Y1=y; EmptyCoords.Add(cur); break; case 1: map[x, y] = TypesOfField.WALL; Walls++; break; case 2: map[x, y] = TypesOfField.BONUS; Bonuses++; break; case 3: map[x, y] = TypesOfField.MEDKIT; Medics++; break; case 8: map[x, y] = TypesOfField.ME; Bot1 = new CCoordinates(); Bot1.X1 = x; Bot1.Y1 = y; break; case 9: map[x, y] = TypesOfField.HI; Bot2 = new CCoordinates(); Bot2.X1 = x; Bot2.Y1 = y; break; } } r.Close(); MaxWalls = Walls; MaxMedics = Medics; MaxBonuses = Bonuses; SetVisibilitys(); }
//// internal static bool isAllied(ICoordinates pos, ICoordinates sos) // { // ICoordinates x = new CCoordinates(); // x.Copy(pos); // x.X1++; // if (this.isNorm(x) && ISEQUAL(x, sos)) // { // return true; // } // x.Copy(pos); // x.X1--; // if (isNorm(x) && ISEQUAL(x, sos)) // { // return true; // } // x.Copy(pos); // x.Y1++; // if (isNorm(x) && ISEQUAL(x, sos)) // { // return true; // } // x.Copy(pos); // x.Y1--; // if (isNorm(x) && ISEQUAL(x, sos)) // { // return true; // } // return false; // } internal List<ICoordinates> MAKECOPY(List<ICoordinates> lol) { List<ICoordinates> ololo=new List<ICoordinates>(); ICoordinates co=new CCoordinates(); for(int i=0;i<lol.Count;i++) { co.Copy(lol[i]); ololo.Add(co); co=new CCoordinates(); } return ololo; }
internal void Generate() { maxX = rand.Next(minRazmMap, maxRazmMap); maxY = rand.Next(minRazmMap, maxRazmMap); map = new TypesOfField[maxX + 1, maxY + 1]; Walls = 0; Spaces = AllSize; Bonuses = 0; Medics = 0; ICoordinates cur = new CCoordinates(); EmptyCoords = new List<ICoordinates>(); //а тут все с 0 :( for (int i = 1; i <= maxX; i++) for (int j = 1; j <= maxY; j++) { cur.X1 = i; cur.Y1 = j; EmptyCoords.Add(cur); map[i, j] = TypesOfField.NOTHING; cur = new CCoordinates(); } //забили список всех пустых вершин. Начинаем генерацию стен. MaxWalls = rand.Next(0, (int)((double)AllSize * (amountWalls))); // стен не более amountWalls MaxMedics = rand.Next(0, (int)((double)AllSize * (amountMedics))); MaxBonuses = rand.Next(0, (int)((double)AllSize * (amountBonuses))); int CurrentNumInList; List<ICoordinates> ForRand = MAKECOPY(EmptyCoords); int thisIsEqual = 0; bool foundNorm = false; for (int i = 1; i <= MaxWalls; i++) { Walls++; Spaces--; while (!(foundNorm || (ForRand.Count == 0))) { CurrentNumInList = rand.Next(0, ForRand.Count - 1); cur = ForRand[CurrentNumInList]; map[cur.X1, cur.Y1] = TypesOfField.WALL; ForRand.RemoveAt(CurrentNumInList); thisIsEqual= FINDEQUALNUM(EmptyCoords, cur); EmptyCoords.RemoveAt(thisIsEqual); // тут может быть фигня if (isConnected()) { foundNorm = true; } else { map[cur.X1, cur.Y1] = TypesOfField.NOTHING; EmptyCoords.Add(cur); } } if (!foundNorm) { i = MaxWalls + 1; } else { ForRand = MAKECOPY(EmptyCoords); foundNorm = false; } } //генерация бонусов // пока все сразу, во время - потом for (int i = 1; i <= MaxBonuses; i++) { SetRandBonus(); } // генерация аптечек - //аналогично for (int i = 1; i <= MaxMedics; i++) { SetRandMedic(); } // генерация игроков // 1 int del = rand.Next(0, EmptyCoords.Count - 1); map[EmptyCoords[del].X1, EmptyCoords[del].Y1] = TypesOfField.ME; Spaces--; Bot1.Copy(EmptyCoords[del]); EmptyCoords.RemoveAt(del); // генерация игроков // 2 del = rand.Next(0, EmptyCoords.Count - 1); map[EmptyCoords[del].X1, EmptyCoords[del].Y1] = TypesOfField.HI; Spaces--; Bot2.Copy(EmptyCoords[del]); EmptyCoords.RemoveAt(del); // генерация видимости между клетками SetVisibilitys(); // вроде все }
/// <summary> /// Все соседние вершины в пределах поля /// </summary> /// <param name="lol">Для координаты</param> /// <returns></returns> internal List<ICoordinates> AlliedNodes(ICoordinates lol) { List<ICoordinates> ret=new List<ICoordinates>(); ICoordinates x=new CCoordinates(); x.Copy(lol); x.X1++; if(isNorm(x)) { ret.Add(x); x = new CCoordinates(); } x.Copy(lol); x.X1--; if(isNorm(x)) { ret.Add(x); x = new CCoordinates(); } x.Copy(lol); x.Y1++; if(isNorm(x)) { ret.Add(x); x = new CCoordinates(); } x.Copy(lol); x.Y1--; if(isNorm(x)) { ret.Add(x); } return ret; }