using Salvo.Targetting; namespace Salvo; internal class Game { private readonly IReadWrite _io; private readonly IRandom _random; public Game(IReadWrite io, IRandom random) { _io = io; _random = random; } internal void Play() { _io.Write(Streams.Title); var damagedShips = new List<(int Turn, Ship Ship)>(); var temp = new Position[13]; var computerGrid = new Grid(_random); var humanGrid = new Grid(_io); var humanShotSelector = new HumanShotSelector(humanGrid, _io); var computerShotSelector = new ComputerShotSelector(computerGrid, _random); var startResponse = _io.ReadString(Prompts.Start); while (startResponse == Strings.WhereAreYourShips) { foreach (var ship in computerGrid.Ships) { _io.WriteLine(ship); } startResponse = _io.ReadString(Prompts.Start); } L1890: var turnNumber=0; L1900: var seeShotsResponse = _io.ReadString(Prompts.SeeShots); L1920: _io.WriteLine(); L1930: if (startResponse != "YES") { goto L2620; } L1950: if (startResponse != "YES") { goto L1990; } L1960: turnNumber++; L1980: _io.Write(Strings.Turn(turnNumber)); L1990: var numberOfShots = humanShotSelector.NumberOfShots; L2220: _io.Write(Strings.YouHaveShots(numberOfShots)); if (numberOfShots == 0) { goto L2270; } L2230: if (humanShotSelector.CanTargetAllRemainingSquares) { _io.WriteLine(Streams.YouHaveMoreShotsThanSquares); L2250: goto L2890; } foreach (var shot1 in humanShotSelector.GetShots(turnNumber)) { if (computerGrid.IsHit(shot1, out var ship)) { _io.Write(Strings.YouHit(ship.Name)); } } L2620: if (startResponse == "YES") { goto L2670; } L2640: turnNumber++; L2660: _io.Write(Strings.Turn(turnNumber)); L2670: numberOfShots = computerShotSelector.NumberOfShots; L2840: _io.Write(Strings.IHaveShots(numberOfShots)); L2850: if (!computerShotSelector.CanTargetAllRemainingSquares) { goto L2880; } L2860: _io.Write(Streams.IHaveMoreShotsThanSquares); L2270: _io.Write(Streams.IWon); return; L2880: if (numberOfShots > 0) { goto L2960; } L2890: _io.Write(Streams.YouWon); L2900: return; L2960: temp = computerShotSelector.GetShots(turnNumber).ToArray(); // display shots L3380: if (seeShotsResponse == "YES") { foreach (var shot in temp) { _io.WriteLine(shot); } } foreach (var shot in temp) { if (humanGrid.IsHit(shot, out var ship)) { _io.Write(Strings.IHit(ship.Name)); computerShotSelector.RecordHit(ship, turnNumber); } } goto L1950; } } internal class DataRandom : IRandom { private readonly Queue _values = new(File.ReadAllLines("data.txt").Select(l => float.Parse(l) / 1000000)); private float _previous; public float NextFloat() => _previous = _values.Dequeue(); public float PreviousFloat() => _previous; public void Reseed(int seed) { throw new NotImplementedException(); } }