/// <summary> /// помечает убитые корабли /// </summary> /// <param name="place"></param> /// <returns></returns> private int markKilledShip(Точка place) { if (!sea.НаМоре(place)) { return(0); } if (map[place.x, place.y] == 2) { map[place.x, place.y] = 3;//убитая int x, y; for (x = place.x - 1; x <= place.x + 1; x++) { for (y = place.y - 1; y <= place.x + 1; y++) { if (Map(x, y) == 0) { map[x, y] = 1; //помечаем что стреляли } } } int length = 1; //рекурсивно пройдемся по точкам length += markKilledShip(new Точка(place.x - 1, place.y)); length += markKilledShip(new Точка(place.x + 1, place.y)); length += markKilledShip(new Точка(place.x, place.y - 1)); length += markKilledShip(new Точка(place.x, place.y + 1)); return(length); } return(0); }
/// <summary> /// стреляем по кораблю ИИ /// </summary> /// <returns></returns> private Точка FightDanger() { // return new Точка(0,0); InitPut(); for (int x = 0; x < Море.размер_моря.x; x++) { for (int y = 0; y < Море.размер_моря.y; y++) { if (map[x, y] == 2) //если ранен ищем { bool longer = false; Точка ship = new Точка(x, y); //идем вврх вниз for (int length = shipLength.Length - 1; length >= 2; length--) //берем корабль и начинаем мочить в разные стороны в зависимости от того какие корабли остались { if (longer || shipLength[length] > 0) { CheckShipDirection(ship, -1, 0, length); CheckShipDirection(ship, 1, 0, length); CheckShipDirection(ship, 0, -1, length); CheckShipDirection(ship, 0, 1, length); longer = true; } } } } } return(RandomPut()); }
public Статус Fight(out Точка target) { //do //{ // target = new Точка( // rand.Next(0, Море.размер_моря.x), // rand.Next(0, Море.размер_моря.y)); //} while (sea.КартаПопаданий(target) != Статус.неизвестно); if (modeDanger) { target = FightDanger(); } else { target = FightShapes(); } Статус status = sea.Выстрел(target); switch (status) { case Статус.мимо: map[target.x, target.y] = 1; break; case Статус.ранил: map[target.x, target.y] = 2; modeDanger = true; break; case Статус.убил: case Статус.победил: map[target.x, target.y] = 2; int len = markKilledShip(target); //если попали в корабль shipLength[len]--; //уменьшаем его длину modeDanger = false; break; } //return sea.Выстрел(target); return(status); }
/// <summary> /// показывать корабли противника и показывать корабли в режиме редактирования сколько их осталось не установлено /// </summary> /// <param name="place"></param> /// <param name="nr"></param> private void ShowPcShip(Точка place, int nr) { //ShowShip(grid_pc, place, nr); if (mode == Mode.EditShips) { GridComp.ShowShip(place, nr); } }
/// <summary> /// проверка направления бомбандировки /// </summary> /// <param name="ship"></param> /// <param name="sx"></param> /// <param name="sy"></param> /// <param name="length"></param> private void CheckShipDirection(Точка ship, int sx, int sy, int length) //проверить клетки в указанном направлении { //текущая клетка должна быть ранен if (Map(ship.x, ship.y) != 2) { return; //не ранен } //в остальных напралениях не должно быть раненных клеток if (Map(ship.x - sx, ship.y - sy) == 2) { return; //за пределами } if (sx == 0) //перемещение по x { if (Map(ship.x - 1, ship.y) == 2) { return; } if (Map(ship.x + 1, ship.y) == 2) { return; } } if (sy == 0) //перемещение по y { if (Map(ship.x, ship.y - 1) == 2) { return; } if (Map(ship.x, ship.y + 1) == 2) { return; } } //в выбранном направлении не должно быть клеток МИМО //в указанном напралении должна быть хотя бы одна клетка неизвестна //может быть клетка ранен int unknown = 0; int unknown_i = 0; for (int i = 1; i < length; i++) { int p = Map(ship.x + i * sx, ship.y + i * sy); if (p == 1) { return; } if (p == -1) { return; } if (p == 0) { unknown++; if (unknown == 1) { unknown_i = i; } } } if (unknown >= 1) { put[ship.x + unknown_i * sx, ship.y + unknown_i * sy]++; //нашли неизвестную клетку } }
private void ShowPcFight(Точка place, Статус status) { //ShowFight(grid_pc, place, status); GridComp.ShowFight(place, status); }
private void ShowUserFight(Точка place, Статус status) { //ShowFight(grid_user, place, status); GridUser.ShowFight(place, status); }
//private void ShowSea() //{ // string text = ""; // for (int y = 0; y < Море.размер_моря.y; y++) // { // for (int x = 0; x < Море.размер_моря.x; x++) // text += sea.КартаКораблей(new Точка(x, y)) == -1 ? " . " : "# "; // text += Environment.NewLine; // } // // textBox1.Text = text; //} //private void ShowFigh() //{ // string text = ""; // for (int x = 0; x < Море.размер_моря.x; x++) // { // for (int y = 0; y < Море.размер_моря.y; y++) // switch (sea.КартаПопаданий(new Точка(x, y))) // { // case Статус.неизвестно: text += " . ";break; // case Статус.мимо: text += "* "; break; // case Статус.ранил: text += "x "; break; // case Статус.убил: text += "X "; break; // } // text += Environment.NewLine; // } // textBox2.Text = text; //} //претенденты на делегатов в другие классы private void ShowUserShip(Точка place, int nr) { GridUser.ShowShip(place, nr); }