Esempio n. 1
0
        //получение координат квадрата, на который хочет сходить игрок
        private void CheckCellUnderStep(UserPlayer user)
        {
            userMoveRectangles.Clear();
            userShotRectangles.Clear();

            Coords C = new Coords();

            if (user.NextMoveType == MoveType.Move)
            {
                bool isBusy = false;//занята ли клетка

                foreach (var player in players)
                {
                    C.X = user.X + user.NextPosX;
                    C.Y = user.Y + user.NextPosY;

                    if (IsBusy(C))//если в намеченной клетке есть игрок или препятствие
                    {
                        isBusy = true;
                        break;
                    }
                }

                if (!isBusy)//если выбранная клетка не занята
                    userMoveRectangles.Add(CellCoords(user.Y + user.NextPosY, user.X + user.NextPosX));//отметить её в траектории движения
                else//иначе никуда не идти
                {
                    user.NextPosY = user.NextPosX = 0;
                }

            }

            //если следующим ходом будем стрелять
            else
            {
                int dx = Math.Sign(user.NextPosX);
                int dy = Math.Sign(user.NextPosY);

                int count = Math.Abs(user.NextPosX);
                if (count == 0)
                    count = Math.Abs(user.NextPosY);

                for (int i = 1; i < count + 1; i++)
                {
                    userShotRectangles.Add(CellCoords(user.Y + dy * i, user.X + dx * i));
                }
            }
        }
Esempio n. 2
0
        private void btNewGame_Click(object sender, EventArgs e)
        {
            tableLayoutPanel.Controls.Clear();
            tableLayoutPanel.Visible=false;

            RowCount = tableLayoutPanel.RowCount;
            ColumnCount = tableLayoutPanel.ColumnCount;

            PlayerCoords.Clear();
            BarrierCoords.Clear();
            players.Clear();
            barriers.Clear();
            rips.Clear();

            userMoveRectangles.Clear();
            userShotRectangles.Clear();
            shotRadiusRectangles.Clear();

            Player Ashe = new Player("Эш", picbAshe);
            Player Kayle = new Player("Кайла", picbKayle);
            Player Nidalee = new Player("Нидали", picbNidalee);
            Player Sivir = new Player("Сивир", picbSivir);
            Player Vi = new Player("Ви", picbVi);

            players.Add(Ashe);
            players.Add(Kayle);
            players.Add(Nidalee);
            players.Add(Sivir);
            players.Add(Vi);

            Coords C = new Coords();
            Random r = new Random();

            //Размещение препятствий
            for (int i = 0; i < 40; i++)
            {
                barriers.Add(new Barrier());

                barriers[barriers.Count - 1].Picture.BackgroundImage = (Bitmap)picbStone.BackgroundImage.Clone();
                barriers[barriers.Count - 1].Picture.BackgroundImageLayout = ImageLayout.Zoom;

                bool done = false;
                while (!done)
                {
                    C.X = r.Next(20);
                    C.Y = r.Next(20);

                    //проверка занятости ячейки
                    if (tableLayoutPanel.GetControlFromPosition(C.X, C.Y) == null)
                    {
                        tableLayoutPanel.Controls.Add(barriers[barriers.Count - 1].Picture, C.X, C.Y);

                        barriers[barriers.Count - 1].X = C.X;
                        barriers[barriers.Count - 1].Y = C.Y;

                        done = true;
                    }

                }

                BarrierCoords.Add(C, barriers[barriers.Count - 1]);
            }

            //Размещение персонажей
            foreach (Player pl in players)
            {
                bool done = false;
                while (!done)
                {
                    C.X = r.Next(20);
                    C.Y = r.Next(20);

                    //проверка занятости ячейки
                    if(tableLayoutPanel.GetControlFromPosition(C.X, C.Y) == null)
                    {
                        tableLayoutPanel.Controls.Add(pl.Picture, C.X, C.Y);

                        pl.X = C.X;
                        pl.Y = C.Y;
                        PlayerCoords.Add(C, pl);

                        done = true;
                    }
                }
            }

            user = new UserPlayer("Удир", picbUdyr, "StoneSword");//создание пользовательского игрока

            bool[,] ableUserPoses = new bool[20, 20];
            for (int i = 0; i < 20; i++)
            {
                for (int j = 0; j < 20; j++)
                {
                    ableUserPoses[i, j] = true;
                }
            }
            foreach(Player pl in players)
            {
                List<Rectangle> shotArea = GetShotRadiusRectangles(pl);

                //простреливаемые места недоступны
                foreach (Rectangle rect in shotArea)
                {
                    ableUserPoses[MapX2Cell(rect.X + 2), MapY2Cell(rect.Y + 2)] = false;
                }

                pl.Picture.MouseClick += user.MouseClick;//чтобы нажатие на игрока обрабатывалось игроком пользователя
            }
            foreach(Barrier barrier in barriers)
            {
                ableUserPoses[barrier.X, barrier.Y] = false;//места, заняты барьерами, недоступны

                barrier.Picture.MouseClick += user.MouseClick;//чтобы нажатие на барьер обрабатывалось игроком пользователя
            }

            List<Coords> ablePoses = new List<Coords>();//список непростреливаемых и доступных мест
            for (int i = 0; i < 20; i++)
            {
                for (int j = 0; j < 20; j++)
                {
                    if (ableUserPoses[i, j])
                    {
                        C.X = i;
                        C.Y = j;
                        ablePoses.Add(C);
                    }
                }
            }

            int k = r.Next(ablePoses.Count);//выбор случайного из свободных мест

            user.X = ablePoses[k].X;
            user.Y = ablePoses[k].Y;

            tableLayoutPanel.Controls.Add(user.Picture, user.X, user.Y);//размещение пользовательского игрока на поле боя

            tableLayoutPanel.Visible = true;

            context = BufferedGraphicsManager.Current;
            grafx = context.Allocate(tableLayoutPanel.CreateGraphics(), new Rectangle(0, 0, tableLayoutPanel.Width, tableLayoutPanel.Height));

            tableLayoutPanel.MouseClick += user.MouseClick;
            user.mapX = MapX2Cell;//привязка для UserPlayer
            user.mapY = MapY2Cell;
            user.isBusy = IsBusy;
            user.damagePos = DamagePos;
            user.step = CheckCellUnderStep;
            user.endStep = AIActions;

            gameIsRunning = true;
        }