mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-22 23:26:40 -08:00
Add parts and messages
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
using Bug.Resources;
|
||||
using BugGame.Resources;
|
||||
using Games.Common.IO;
|
||||
using Games.Common.Randomness;
|
||||
|
||||
namespace BugGame;
|
||||
|
||||
internal class Game
|
||||
{
|
||||
private readonly IReadWrite _io;
|
||||
|
||||
25
16_Bug/csharp/Parts/Body.cs
Normal file
25
16_Bug/csharp/Parts/Body.cs
Normal file
@@ -0,0 +1,25 @@
|
||||
using BugGame.Resources;
|
||||
|
||||
namespace BugGame.Parts;
|
||||
|
||||
internal class Body : ParentPart
|
||||
{
|
||||
private readonly Neck _neck = new();
|
||||
private readonly Tail _tail = new();
|
||||
private readonly Legs _legs = new();
|
||||
|
||||
public Body()
|
||||
: base(Message.BodyAdded, Message.BodyNotNeeded)
|
||||
{
|
||||
}
|
||||
|
||||
protected override bool TryAddCore(IPart part, out Message message)
|
||||
=> part switch
|
||||
{
|
||||
Neck => _neck.TryAdd(out message),
|
||||
Head or Feeler => _neck.TryAdd(part, out message),
|
||||
Tail => _tail.TryAdd(out message),
|
||||
Leg => _legs.TryAddOne(out message),
|
||||
_ => throw new NotSupportedException($"Can't add a {part.Name} to a {Name}.")
|
||||
};
|
||||
}
|
||||
6
16_Bug/csharp/Parts/Feeler.cs
Normal file
6
16_Bug/csharp/Parts/Feeler.cs
Normal file
@@ -0,0 +1,6 @@
|
||||
namespace BugGame.Parts;
|
||||
|
||||
internal class Feeler : IPart
|
||||
{
|
||||
public string Name => nameof(Feeler);
|
||||
}
|
||||
11
16_Bug/csharp/Parts/Feelers.cs
Normal file
11
16_Bug/csharp/Parts/Feelers.cs
Normal file
@@ -0,0 +1,11 @@
|
||||
using BugGame.Resources;
|
||||
|
||||
namespace BugGame.Parts;
|
||||
|
||||
internal class Feelers : PartCollection
|
||||
{
|
||||
public Feelers()
|
||||
: base(6, Message.FeelerAdded, Message.FeelersFull)
|
||||
{
|
||||
}
|
||||
}
|
||||
20
16_Bug/csharp/Parts/Head.cs
Normal file
20
16_Bug/csharp/Parts/Head.cs
Normal file
@@ -0,0 +1,20 @@
|
||||
using BugGame.Resources;
|
||||
|
||||
namespace BugGame.Parts;
|
||||
|
||||
internal class Head : ParentPart
|
||||
{
|
||||
private Feelers _feelers = new();
|
||||
|
||||
public Head()
|
||||
: base(Message.HeadAdded, Message.HeadNotNeeded)
|
||||
{
|
||||
}
|
||||
|
||||
protected override bool TryAddCore(IPart part, out Message message)
|
||||
=> part switch
|
||||
{
|
||||
Feeler => _feelers.TryAddOne(out message),
|
||||
_ => throw new NotSupportedException($"Can't add a {part.Name} to a {Name}.")
|
||||
};
|
||||
}
|
||||
6
16_Bug/csharp/Parts/IPart.cs
Normal file
6
16_Bug/csharp/Parts/IPart.cs
Normal file
@@ -0,0 +1,6 @@
|
||||
namespace BugGame.Parts;
|
||||
|
||||
internal interface IPart
|
||||
{
|
||||
string Name { get; }
|
||||
}
|
||||
6
16_Bug/csharp/Parts/Leg.cs
Normal file
6
16_Bug/csharp/Parts/Leg.cs
Normal file
@@ -0,0 +1,6 @@
|
||||
namespace BugGame.Parts;
|
||||
|
||||
internal class Leg : IPart
|
||||
{
|
||||
public string Name => nameof(Leg);
|
||||
}
|
||||
11
16_Bug/csharp/Parts/Legs.cs
Normal file
11
16_Bug/csharp/Parts/Legs.cs
Normal file
@@ -0,0 +1,11 @@
|
||||
using BugGame.Resources;
|
||||
|
||||
namespace BugGame.Parts;
|
||||
|
||||
internal class Legs : PartCollection
|
||||
{
|
||||
public Legs()
|
||||
: base(2, Message.LegAdded, Message.LegsFull)
|
||||
{
|
||||
}
|
||||
}
|
||||
21
16_Bug/csharp/Parts/Neck.cs
Normal file
21
16_Bug/csharp/Parts/Neck.cs
Normal file
@@ -0,0 +1,21 @@
|
||||
using BugGame.Resources;
|
||||
|
||||
namespace BugGame.Parts;
|
||||
|
||||
internal class Neck : ParentPart
|
||||
{
|
||||
private Head _head = new();
|
||||
|
||||
public Neck()
|
||||
: base(Message.NeckAdded, Message.NeckNotNeeded)
|
||||
{
|
||||
}
|
||||
|
||||
protected override bool TryAddCore(IPart part, out Message message)
|
||||
=> part switch
|
||||
{
|
||||
Head => _head.TryAdd(out message),
|
||||
Feeler => _head.TryAdd(part, out message),
|
||||
_ => throw new NotSupportedException($"Can't add a {part.Name} to a {Name}.")
|
||||
};
|
||||
}
|
||||
22
16_Bug/csharp/Parts/ParentPart.cs
Normal file
22
16_Bug/csharp/Parts/ParentPart.cs
Normal file
@@ -0,0 +1,22 @@
|
||||
using BugGame.Resources;
|
||||
|
||||
namespace BugGame.Parts;
|
||||
|
||||
internal abstract class ParentPart : Part
|
||||
{
|
||||
public ParentPart(Message addedMessage, Message duplicateMessage)
|
||||
: base(addedMessage, duplicateMessage)
|
||||
{
|
||||
}
|
||||
|
||||
public bool TryAdd(IPart part, out Message message)
|
||||
=> IsPresent ? TryAddCore(part, out message) : ReportDoNotHave(out message);
|
||||
|
||||
protected abstract bool TryAddCore(IPart part, out Message message);
|
||||
|
||||
private bool ReportDoNotHave(out Message message)
|
||||
{
|
||||
message = Message.DoNotHaveA(this);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
32
16_Bug/csharp/Parts/Part.cs
Normal file
32
16_Bug/csharp/Parts/Part.cs
Normal file
@@ -0,0 +1,32 @@
|
||||
using BugGame.Resources;
|
||||
|
||||
namespace BugGame.Parts;
|
||||
|
||||
internal class Part
|
||||
{
|
||||
private readonly Message _addedMessage;
|
||||
private readonly Message _duplicateMessage;
|
||||
|
||||
public Part(Message addedMessage, Message duplicateMessage)
|
||||
{
|
||||
_addedMessage = addedMessage;
|
||||
_duplicateMessage = duplicateMessage;
|
||||
}
|
||||
|
||||
protected bool IsPresent { get; private set; }
|
||||
|
||||
public string Name => GetType().Name;
|
||||
|
||||
public bool TryAdd(out Message message)
|
||||
{
|
||||
if (IsPresent)
|
||||
{
|
||||
message = _duplicateMessage;
|
||||
return false;
|
||||
}
|
||||
|
||||
message = _addedMessage;
|
||||
IsPresent = true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
31
16_Bug/csharp/Parts/PartCollection.cs
Normal file
31
16_Bug/csharp/Parts/PartCollection.cs
Normal file
@@ -0,0 +1,31 @@
|
||||
using BugGame.Resources;
|
||||
|
||||
namespace BugGame.Parts;
|
||||
|
||||
internal class PartCollection
|
||||
{
|
||||
private readonly int _maxCount;
|
||||
private readonly Message _addedMessage;
|
||||
private readonly Message _fullMessage;
|
||||
private int _count;
|
||||
|
||||
public PartCollection(int maxCount, Message addedMessage, Message fullMessage)
|
||||
{
|
||||
_maxCount = maxCount;
|
||||
_addedMessage = addedMessage;
|
||||
_fullMessage = fullMessage;
|
||||
}
|
||||
|
||||
public bool TryAddOne(out Message message)
|
||||
{
|
||||
if (_count < _maxCount)
|
||||
{
|
||||
_count++;
|
||||
message = _addedMessage.ForQuantity(_count);
|
||||
return true;
|
||||
}
|
||||
|
||||
message = _fullMessage;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
11
16_Bug/csharp/Parts/Tail.cs
Normal file
11
16_Bug/csharp/Parts/Tail.cs
Normal file
@@ -0,0 +1,11 @@
|
||||
using BugGame.Resources;
|
||||
|
||||
namespace BugGame.Parts;
|
||||
|
||||
internal class Tail : Part
|
||||
{
|
||||
public Tail()
|
||||
: base(Message.TailAdded, Message.TailNotNeeded)
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,4 @@
|
||||
using BugGame;
|
||||
using Games.Common.IO;
|
||||
using Games.Common.Randomness;
|
||||
|
||||
|
||||
42
16_Bug/csharp/Resources/Message.cs
Normal file
42
16_Bug/csharp/Resources/Message.cs
Normal file
@@ -0,0 +1,42 @@
|
||||
namespace BugGame.Resources;
|
||||
|
||||
internal class Message
|
||||
{
|
||||
public static Message Rolled = new("rolled a {0}");
|
||||
|
||||
public static Message BodyAdded = new("now have a body.");
|
||||
public static Message BodyNotNeeded = new("do not need a body.");
|
||||
|
||||
public static Message NeckAdded = new("now have a neck.");
|
||||
public static Message NeckNotNeeded = new("do not need a neck.");
|
||||
|
||||
public static Message HeadAdded = new("needed a head.");
|
||||
public static Message HeadNotNeeded = new("I do not need a head.", "You have a head.");
|
||||
|
||||
public static Message TailAdded = new("I now have a tail.", "I now give you a tail.");
|
||||
public static Message TailNotNeeded = new("I do not need a tail.", "You already have a tail.");
|
||||
|
||||
public static Message FeelerAdded = new("I get a feeler.", "I now give you a feeler");
|
||||
public static Message FeelersFull = new("I have 2 feelers already.", "You have two feelers already");
|
||||
|
||||
public static Message LegAdded = new("now have {0} legs");
|
||||
public static Message LegsFull = new("I have 6 feet.", "You have 6 feet already");
|
||||
|
||||
private Message(string common)
|
||||
: this("I " + common, "You" + common)
|
||||
{
|
||||
}
|
||||
|
||||
private Message(string i, string you)
|
||||
{
|
||||
I = i;
|
||||
You = you;
|
||||
}
|
||||
|
||||
public string I { get; }
|
||||
public string You { get; }
|
||||
|
||||
public static Message DoNotHaveA(Part part) => new($"do no have a {part.Name}");
|
||||
|
||||
public Message ForQuantity(int quantity) => new(string.Format(I, quantity), string.Format(You, quantity));
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
|
||||
namespace Bug.Resources;
|
||||
namespace BugGame.Resources;
|
||||
|
||||
internal static class Resource
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user