예제 #1
0
        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;
        }
예제 #2
0
        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;
        }
예제 #3
0
        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();
        }
예제 #4
0
 //// 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;
 }
예제 #5
0
        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();
            // вроде все
        }
예제 #6
0
        /// <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;
        }