Improve computer shot tracking/selection

This commit is contained in:
drewjcooper
2023-05-16 17:45:48 +10:00
parent 6e01ee5b6a
commit 30360f2784
6 changed files with 11 additions and 50 deletions

View File

@@ -17,15 +17,9 @@ internal class Game
{
_io.Write(Streams.Title);
var hitTurnRecord = new int[13];
var hitRecords = new List<(int Turn, Ship Ship)>();
var temp = new Position[13];
var hitShipValue = new float[13];
for (var i = 1; i <= 12; i++)
{
hitTurnRecord[i] = -1;
hitShipValue[i] = -1;
}
var computerGrid = new Grid(_random);
var humanGrid = new Grid(_io);
var humanShotSelector = new HumanShotSelector(humanGrid, computerGrid, _io);
@@ -74,11 +68,7 @@ L2880: if (numberOfShots != 0) { goto L2960; }
L2890: _io.Write(Streams.YouWon);
L2900: return;
L2960: for (var i = 1; i <= 12; i++)
{
// if damaged ships
L2970: if (hitShipValue[i]>0) { goto L3800; }
}
L2960: if (humanGrid.Ships.Any(s => s.IsDamaged)) { goto L3800; }
temp = computerShotSelector.GetShots().ToArray();
// display shots
L3380: if (seeShotsResponse == "YES")
@@ -95,33 +85,20 @@ L3380: if (seeShotsResponse == "YES")
continue;
}
_io.Write(Strings.IHit(ship.Name));
for (var j = 1; j <= 12; j++)
{
if (hitTurnRecord[j] == -1)
{
hitTurnRecord[j]=10+turnNumber;
hitShipValue[j]=ship.Value;
break;
}
}
if (ship.IsDestroyed)
{
for (var k = 1; k <= 12; k++)
{
if (hitShipValue[k] == ship.Value)
{
hitShipValue[k] = hitTurnRecord[k] = -1;
}
}
hitRecords = hitRecords.Where(hr => hr.Ship != ship).ToList();
}
else
{
hitRecords.Add((turnNumber, ship));
}
humanGrid[shot]=10+turnNumber;
}
goto L1950;
L3800: //REM************************USINGEARRAY
var tempGrid = Position.All.ToDictionary(x => x, _ => 0);
L3860: for (var i = 1; i <= 12; i++)
L3860: foreach (var (hitTurn, ship) in hitRecords)
{
if (hitTurnRecord[i]<10) { continue; }
foreach (var position in Position.All)
{
if (humanGrid.WasTargetedAt(position, out _))
@@ -132,9 +109,9 @@ L3860: for (var i = 1; i <= 12; i++)
foreach (var neighbour in position.Neighbours)
{
if (humanGrid.WasTargetedAt(neighbour, out var turn) && turn == (hitTurnRecord[i] - 10))
if (humanGrid.WasTargetedAt(neighbour, out var turn) && turn == hitTurn)
{
tempGrid[position] += hitTurnRecord[i]-position.Y*(int)(hitShipValue[i]+.5F);
tempGrid[position] += hitTurn + 10 - position.Y * ship.Shots;
}
}
}

View File

@@ -57,18 +57,6 @@ internal class Grid
}
}
public float this[Position position]
{
get => _shots.TryGetValue(position, out var value)
? value + 10
: _ships.FirstOrDefault(s => s.Positions.Contains(position))?.Value ?? 0;
set
{
_ = _ships.FirstOrDefault(s => s.IsHit(position));
_shots[position] = (int)value - 10;
}
}
internal int UntriedSquareCount => 100 - _shots.Count;
internal IEnumerable<Ship> Ships => _ships.AsEnumerable();

View File

@@ -14,5 +14,4 @@ internal sealed class Battleship : Ship
internal override int Shots => 3;
internal override int Size => 5;
internal override float Value => 3;
}

View File

@@ -14,5 +14,4 @@ internal sealed class Cruiser : Ship
internal override int Shots => 2;
internal override int Size => 3;
internal override float Value => 2;
}

View File

@@ -14,5 +14,4 @@ internal sealed class Destroyer : Ship
internal override int Shots => 1;
internal override int Size => 2;
internal override float Value => Name.EndsWith("<A>") ? 1 : 0.5F;
}

View File

@@ -24,8 +24,7 @@ internal abstract class Ship
internal string Name { get; }
internal abstract int Shots { get; }
internal abstract int Size { get; }
internal abstract float Value { get; }
internal IEnumerable<Position> Positions => _positions;
internal bool IsDamaged => _positions.Count > 0 && _positions.Count < Size;
internal bool IsDestroyed => _positions.Count == 0;
internal bool IsHit(Position position) => _positions.Remove(position);