mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-23 07:29:02 -08:00
Reduce precision to float
This commit is contained in:
@@ -10,14 +10,14 @@ namespace SuperStarTrek.Commands
|
||||
IsGameOver = isGameOver;
|
||||
}
|
||||
|
||||
private CommandResult(double timeElapsed)
|
||||
private CommandResult(float timeElapsed)
|
||||
{
|
||||
TimeElapsed = timeElapsed;
|
||||
}
|
||||
|
||||
public bool IsGameOver { get; }
|
||||
public double TimeElapsed { get; }
|
||||
public float TimeElapsed { get; }
|
||||
|
||||
public static CommandResult Elapsed(double timeElapsed) => new(timeElapsed);
|
||||
public static CommandResult Elapsed(float timeElapsed) => new(timeElapsed);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@ namespace SuperStarTrek
|
||||
|
||||
private int _initialStardate;
|
||||
private int _finalStarDate;
|
||||
private double _currentStardate;
|
||||
private float _currentStardate;
|
||||
private Coordinates _currentQuadrant;
|
||||
private Coordinates _currentSector;
|
||||
private Galaxy _galaxy;
|
||||
@@ -27,7 +27,7 @@ namespace SuperStarTrek
|
||||
_input = new Input(_output);
|
||||
}
|
||||
|
||||
public double Stardate => _currentStardate;
|
||||
public float Stardate => _currentStardate;
|
||||
|
||||
public void DoIntroduction()
|
||||
{
|
||||
@@ -111,7 +111,7 @@ namespace SuperStarTrek
|
||||
return _enterprise.IsStranded;
|
||||
}
|
||||
|
||||
private double GetEfficiency() =>
|
||||
1000 * Math.Pow(_initialKlingonCount / (_currentStardate - _initialStardate), 2);
|
||||
private float GetEfficiency() =>
|
||||
1000 * (float)Math.Pow(_initialKlingonCount / (_currentStardate - _initialStardate), 2);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,8 +33,8 @@ namespace SuperStarTrek.Objects
|
||||
public Coordinates Sector { get; }
|
||||
public string Condition => GetCondition();
|
||||
public ShieldControl ShieldControl => (ShieldControl)_commandExecutors[Command.SHE];
|
||||
public double Energy => TotalEnergy - ShieldControl.ShieldEnergy;
|
||||
public double TotalEnergy { get; private set; }
|
||||
public float Energy => TotalEnergy - ShieldControl.ShieldEnergy;
|
||||
public float TotalEnergy { get; private set; }
|
||||
public int DamagedSystemCount => _systems.Count(s => s.IsDamaged);
|
||||
public IEnumerable<Subsystem> Systems => _systems;
|
||||
public int TorpedoCount { get; }
|
||||
@@ -68,7 +68,7 @@ namespace SuperStarTrek.Objects
|
||||
(_quadrant.HasKlingons, Energy / _maxEnergy) switch
|
||||
{
|
||||
(true, _) => "*Red*",
|
||||
(_, < 0.1) => "Yellow",
|
||||
(_, < 0.1f) => "Yellow",
|
||||
_ => "Green"
|
||||
};
|
||||
|
||||
@@ -112,15 +112,15 @@ namespace SuperStarTrek.Objects
|
||||
return CommandResult.Ok;
|
||||
}
|
||||
|
||||
private void TakeDamage(double hitStrength)
|
||||
private void TakeDamage(float hitStrength)
|
||||
{
|
||||
var hitShieldRatio = hitStrength / ShieldControl.ShieldEnergy;
|
||||
if (_random.GetDouble() > 0.6 || hitShieldRatio <= 0.02)
|
||||
if (_random.GetFloat() > 0.6 || hitShieldRatio <= 0.02f)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_systems[_random.Get1To8Inclusive() - 1].TakeDamage(hitShieldRatio + 0.5 * _random.GetDouble());
|
||||
_systems[_random.Get1To8Inclusive() - 1].TakeDamage(hitShieldRatio + 0.5f * _random.GetFloat());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ namespace SuperStarTrek.Objects
|
||||
{
|
||||
internal class Klingon
|
||||
{
|
||||
private double _energy;
|
||||
private float _energy;
|
||||
private Coordinates _sector;
|
||||
private readonly Random _random;
|
||||
|
||||
@@ -13,14 +13,14 @@ namespace SuperStarTrek.Objects
|
||||
{
|
||||
_sector = sector;
|
||||
_random = random;
|
||||
_energy = _random.GetDouble(100, 300);
|
||||
_energy = _random.GetFloat(100, 300);
|
||||
}
|
||||
|
||||
public override string ToString() => "+K+";
|
||||
|
||||
public CommandResult FireOn(Enterprise enterprise)
|
||||
{
|
||||
var attackStrength = _random.GetDouble();
|
||||
var attackStrength = _random.GetFloat();
|
||||
var hitStrength = (int)(_energy * (2 + attackStrength) / _sector.GetDistanceTo(enterprise.Sector));
|
||||
_energy /= 3 + attackStrength;
|
||||
|
||||
|
||||
@@ -6,21 +6,21 @@ namespace SuperStarTrek.Objects
|
||||
{
|
||||
private readonly Input _input;
|
||||
private readonly Output _output;
|
||||
private readonly double _repairDelay;
|
||||
private readonly float _repairDelay;
|
||||
|
||||
public Starbase(Random random, Input input, Output output)
|
||||
{
|
||||
_repairDelay = random.GetDouble() * 0.5;
|
||||
_repairDelay = random.GetFloat() * 0.5f;
|
||||
_input = input;
|
||||
_output = output;
|
||||
}
|
||||
|
||||
public override string ToString() => ">!<";
|
||||
|
||||
internal bool TryRepair(Enterprise enterprise, out double repairTime)
|
||||
internal bool TryRepair(Enterprise enterprise, out float repairTime)
|
||||
{
|
||||
repairTime = enterprise.DamagedSystemCount * 0.1 + _repairDelay;
|
||||
if (repairTime >= 1) { repairTime = 0.9; }
|
||||
repairTime = enterprise.DamagedSystemCount * 0.1f + _repairDelay;
|
||||
if (repairTime >= 1) { repairTime = 0.9f; }
|
||||
|
||||
_output.Write(Strings.RepairEstimate, repairTime);
|
||||
if (_input.GetYesNo(Strings.RepairPrompt, Input.YesNoMode.TrueOnY))
|
||||
|
||||
@@ -12,14 +12,14 @@ namespace SuperStarTrek
|
||||
// 475 DEF FNR(R)=INT(RND(R)*7.98+1.01)
|
||||
// Returns a value from 1 to 8, inclusive.
|
||||
// Note there's a slight bias away from the extreme values, 1 and 8.
|
||||
public int Get1To8Inclusive() => (int)(_random.NextDouble() * 7.98 + 1.01);
|
||||
public int Get1To8Inclusive() => (int)(GetFloat() * 7.98 + 1.01);
|
||||
|
||||
public int GetInt(int inclusiveMinValue, int exclusiveMaxValue) =>
|
||||
_random.Next(inclusiveMinValue, exclusiveMaxValue);
|
||||
|
||||
public double GetDouble() => _random.NextDouble();
|
||||
public float GetFloat() => (float)_random.NextDouble();
|
||||
|
||||
public double GetDouble(double inclusiveMinValue, double exclusiveMaxValue)
|
||||
=> _random.NextDouble() * (exclusiveMaxValue - inclusiveMinValue) + inclusiveMinValue;
|
||||
public float GetFloat(float inclusiveMinValue, float exclusiveMaxValue)
|
||||
=> GetFloat() * (exclusiveMaxValue - inclusiveMinValue) + inclusiveMinValue;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ namespace SuperStarTrek.Space
|
||||
|
||||
public IEnumerable<Coordinates> GetSectorsFrom(Coordinates start)
|
||||
{
|
||||
(double x, double y) = start;
|
||||
(float x, float y) = start;
|
||||
|
||||
while(true)
|
||||
{
|
||||
|
||||
@@ -24,14 +24,14 @@ namespace SuperStarTrek.Space
|
||||
public static QuadrantInfo Create(Coordinates coordinates, string name)
|
||||
{
|
||||
var random = new Random();
|
||||
var klingonCount = random.GetDouble() switch
|
||||
var klingonCount = random.GetFloat() switch
|
||||
{
|
||||
> 0.98 => 3,
|
||||
> 0.95 => 2,
|
||||
> 0.80 => 1,
|
||||
> 0.98f => 3,
|
||||
> 0.95f => 2,
|
||||
> 0.80f => 1,
|
||||
_ => 0
|
||||
};
|
||||
var hasStarbase = random.GetDouble() > 0.96;
|
||||
var hasStarbase = random.GetFloat() > 0.96f;
|
||||
var starCount = random.Get1To8Inclusive();
|
||||
|
||||
return new QuadrantInfo(coordinates, name, klingonCount, starCount, hasStarbase);
|
||||
|
||||
@@ -18,7 +18,7 @@ namespace SuperStarTrek.Systems
|
||||
_input = input;
|
||||
}
|
||||
|
||||
public double ShieldEnergy { get; private set; }
|
||||
public float ShieldEnergy { get; private set; }
|
||||
|
||||
protected override bool CanExecuteCommand() => IsOperational("{name} inoperable");
|
||||
|
||||
@@ -39,7 +39,7 @@ namespace SuperStarTrek.Systems
|
||||
return CommandResult.Ok;
|
||||
}
|
||||
|
||||
private bool Validate(double requested)
|
||||
private bool Validate(float requested)
|
||||
{
|
||||
if (requested > _enterprise.TotalEnergy)
|
||||
{
|
||||
|
||||
@@ -17,7 +17,7 @@ namespace SuperStarTrek.Systems
|
||||
}
|
||||
|
||||
public string Name { get; }
|
||||
public double Condition { get; private set; }
|
||||
public float Condition { get; private set; }
|
||||
public bool IsDamaged => Condition < 0;
|
||||
public Command Command { get; }
|
||||
|
||||
@@ -44,7 +44,7 @@ namespace SuperStarTrek.Systems
|
||||
if (IsDamaged) { Condition = 0; }
|
||||
}
|
||||
|
||||
internal void TakeDamage(double damage)
|
||||
internal void TakeDamage(float damage)
|
||||
{
|
||||
Condition -= damage;
|
||||
_output.WriteLine($"Damage Control reports, '{Name} damaged by the hit.'");
|
||||
|
||||
Reference in New Issue
Block a user