mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2026-01-06 10:05:45 -08:00
Move folder for consistency
This commit is contained in:
78
90_Tower/csharp/Tower/Game.cs
Normal file
78
90_Tower/csharp/Tower/Game.cs
Normal file
@@ -0,0 +1,78 @@
|
||||
using System;
|
||||
using Tower.Models;
|
||||
using Tower.Resources;
|
||||
using Tower.UI;
|
||||
|
||||
namespace Tower
|
||||
{
|
||||
internal class Game
|
||||
{
|
||||
private readonly Towers _towers;
|
||||
private readonly TowerDisplay _display;
|
||||
private readonly int _optimalMoveCount;
|
||||
private int _moveCount;
|
||||
|
||||
public Game(int diskCount)
|
||||
{
|
||||
_towers = new Towers(diskCount);
|
||||
_display = new TowerDisplay(_towers);
|
||||
_optimalMoveCount = (1 << diskCount) - 1;
|
||||
}
|
||||
|
||||
public bool Play()
|
||||
{
|
||||
Console.Write(Strings.Instructions);
|
||||
|
||||
Console.Write(_display);
|
||||
|
||||
while (true)
|
||||
{
|
||||
if (!Input.TryReadNumber(Prompt.Disk, out int disk)) { return false; }
|
||||
|
||||
if (!_towers.TryFindDisk(disk, out var from, out var message))
|
||||
{
|
||||
Console.WriteLine(message);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!Input.TryReadNumber(Prompt.Needle, out var to)) { return false; }
|
||||
|
||||
if (!_towers.TryMoveDisk(from, to))
|
||||
{
|
||||
Console.Write(Strings.IllegalMove);
|
||||
continue;
|
||||
}
|
||||
|
||||
Console.Write(_display);
|
||||
|
||||
var result = CheckProgress();
|
||||
if (result.HasValue) { return result.Value; }
|
||||
}
|
||||
}
|
||||
|
||||
private bool? CheckProgress()
|
||||
{
|
||||
_moveCount++;
|
||||
|
||||
if (_moveCount == 128)
|
||||
{
|
||||
Console.Write(Strings.TooManyMoves);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (_towers.Finished)
|
||||
{
|
||||
if (_moveCount == _optimalMoveCount)
|
||||
{
|
||||
Console.Write(Strings.Congratulations);
|
||||
}
|
||||
|
||||
Console.WriteLine(Strings.TaskFinished, _moveCount);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return default;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user