//получение координат квадрата, на который хочет сходить игрок 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)); } } }
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; }