mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-25 12:25:10 -08:00
Add TowerDisplay
This commit is contained in:
@@ -8,13 +8,13 @@ namespace Tower.Models
|
||||
{
|
||||
private readonly Stack<int> _disks = new Stack<int>();
|
||||
|
||||
public int Top => _disks.TryPeek(out var disc) ? disc : default;
|
||||
public int Top => _disks.TryPeek(out var disk) ? disk : default;
|
||||
|
||||
public bool TryPut(int disc)
|
||||
public bool TryPut(int disk)
|
||||
{
|
||||
if (_disks.Count == 0 || disc < _disks.Peek())
|
||||
if (_disks.Count == 0 || disk < _disks.Peek())
|
||||
{
|
||||
_disks.Push(disc);
|
||||
_disks.Push(disk);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ namespace Tower.Models
|
||||
public bool TryGetTopDisk(out int disk) => _disks.TryPop(out disk);
|
||||
|
||||
public IEnumerator<int> GetEnumerator() =>
|
||||
Enumerable.Repeat(1, 7 - _disks.Count).Concat(_disks).GetEnumerator();
|
||||
Enumerable.Repeat(0, 7 - _disks.Count).Concat(_disks).GetEnumerator();
|
||||
|
||||
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ namespace Tower.Models
|
||||
|
||||
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
|
||||
|
||||
private class TowersEnumerator : IEnumerator<(int First, int Second, int Third)>
|
||||
private class TowersEnumerator : IEnumerator<(int, int, int)>
|
||||
{
|
||||
private readonly List<IEnumerator<int>> _enumerators;
|
||||
|
||||
@@ -45,7 +45,7 @@ namespace Tower.Models
|
||||
_enumerators = needles.Select(n => n.GetEnumerator()).ToList();
|
||||
}
|
||||
|
||||
public (int First, int Second, int Third) Current =>
|
||||
public (int, int, int) Current =>
|
||||
(_enumerators[0].Current, _enumerators[1].Current, _enumerators[2].Current);
|
||||
|
||||
object IEnumerator.Current => Current;
|
||||
|
||||
37
90 Tower/csharp/Tower/UI/TowerDisplay.cs
Normal file
37
90 Tower/csharp/Tower/UI/TowerDisplay.cs
Normal file
@@ -0,0 +1,37 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using Tower.Models;
|
||||
|
||||
namespace Tower.UI
|
||||
{
|
||||
internal class TowerDisplay
|
||||
{
|
||||
private readonly Towers _towers;
|
||||
|
||||
public TowerDisplay(Towers towers)
|
||||
{
|
||||
_towers = towers;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
var builder = new StringBuilder();
|
||||
|
||||
foreach (var row in _towers)
|
||||
{
|
||||
AddTower(row.Item1);
|
||||
AddTower(row.Item2);
|
||||
AddTower(row.Item3);
|
||||
builder.AppendLine();
|
||||
}
|
||||
|
||||
return builder.ToString();
|
||||
|
||||
void AddTower(int size)
|
||||
{
|
||||
var padding = 10 - size / 2;
|
||||
builder.Append(' ', padding).Append('*', Math.Max(1, size)).Append(' ', padding);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user