Skip to content

Instantly share code, notes, and snippets.

@vsvld
Last active August 29, 2015 14:21
Show Gist options
  • Save vsvld/cd43f2f55f5daf720576 to your computer and use it in GitHub Desktop.
Save vsvld/cd43f2f55f5daf720576 to your computer and use it in GitHub Desktop.
//FALSE = will place into computer sea
//TRUE = will place into user sea
public void PlaceAllShips(bool usersea)
{
int i;
ArrayList ships = new ArrayList(); // для зберігання кораблів всіх кораблів, які треба поставити на дошку
// додаємо всі кораблі в список
for (i = 0; i < ShipConstants.TOTAL_BATTLESHIPS; i++) ships.Add(new BattleShip(0, 0, ShipDirection.Horizontal));
for (i = 0; i < ShipConstants.TOTAL_CRUISERS; i++) ships.Add(new Cruiser(0, 0, ShipDirection.Horizontal));
for (i = 0; i < ShipConstants.TOTAL_SUBMARINES; i++) ships.Add(new Submarine(0, 0, ShipDirection.Horizontal));
for (i = 0; i < ShipConstants.TOTAL_ROWING_BOATS; i++) ships.Add(new Rowing_Boat(0, 0, ShipDirection.Horizontal));
// для користувача просто додаємо кораблі зі списку
if (usersea)
{
foreach (Ship ship in ships)
PlaceUserShip(ship);
}
// для комп’ютера передаємо весь список і номер початкового корабля
else
{
PlaceComputerShip(ships, 0);
}
}
private bool PlaceComputerShip(ArrayList ships, int counter)
{
Ship shnew;
ShipDirection direction;
int xpp, ypp;
ArrayList coords = new ArrayList();
// не входимо, якщо вже всі кораблі додані
if (counter != ships.Count)
{
Ship sh = (Ship)ships[counter]; // беремо наступний
bool failed = true; // чи не змогло при всіх комбінаціях розташувати корабель
do
{
bool combNotFound = true;
// знаходимо комбінацію, яку ще не використовували для цього кроку
do
{
direction = (ShipDirection)randomNum(0, 2);
xpp = randomNum(0, SeaConstants.SEA_SIZE);
ypp = randomNum(0, SeaConstants.SEA_SIZE);
Tuple<int, int, ShipDirection> tuple = new Tuple<int, int, ShipDirection>(xpp, ypp, direction);
// якщо такої комбінації не було
if (!coords.Contains(tuple))
{
combNotFound = false;
coords.Add(tuple); // додаємо комбінацію в список використаних
// створюємо новий корабель, щоб додати на дошку
shnew = new Ship(sh.shipType, xpp, ypp, sh.length, direction, 0, false, sh.blocks[0].printChar, sh.blocks[0].shipname);
// додаємо і якщо додали успішно
if (ComputerSea.AddShip(shnew))
{
// рекурсивно додаємо наступний і якщо все далі пройшло успішно,
// знімаємо мітку, щоб вийти з загального циклу
if (PlaceComputerShip(ships, ++counter)) failed = false;
else new EmptySea(xpp, ypp); // ця штука не працює, має бути щось типу ComputerSea.AddSea(new EmptySea(xpp, ypp);)
}
}
} while (combNotFound);
} while (failed);
}
return true;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment