public class Game
{
private IOutputProvider _outputProvider;
private List frames = new List();
private int currentRoll = 0;
public Game(IOutputProvider outputProvider)
{
_outputProvider = outputProvider;
for (int i = 0; i < 10; i++)
{
frames.Add(new Frame());
}
}
public void StarteSpiel()
{
while (!Over())
{
_outputProvider.Write("Geben Sie die Anzahl der umgeworfenen Pins ein: ");
string input = _outputProvider.Read();
int pins;
while (!int.TryParse(input, out pins) || pins < 0 || pins > 10)
{
_outputProvider.Write("Ungültige Eingabe! Bitte geben Sie eine Zahl zwischen 0 und 10 ein: ");
input = _outputProvider.Read();
}
AddRoll(pins);
}
_outputProvider.Write("Spiel beendet! Endpunktzahl: " + TotalScore());
}
private void AddRoll(int pins)
{
if (Over())
{
throw new IndexOutOfRangeException("Das Spiel ist beendet!");
}
int frameIndex = GetCurrentFrameIndex();
if (pins == 10 && currentRoll % 2 == 0 && frameIndex < 9)
{
_outputProvider.Write("Herzlichen Glückwunsch, Sie haben einen Strike geworfen!");
frames[frameIndex].PinsRolled[0] = pins;
frames[frameIndex].IsComplete = true;
currentRoll += 2;
}
else
{
if (frames[frameIndex].PinsRolled[0] + pins > 10 && frameIndex < 9)
{
_outputProvider.Write("Die Summe der beiden Würfe in einem Frame darf nicht mehr als 10 betragen. Bitte geben Sie eine gültige Anzahl Pins ein: ");
return;
}
// Den Wurf zum aktuellen Frame hinzufügen
if (frames[frameIndex].PinsRolled[0] == 0)
{
frames[frameIndex].PinsRolled[0] = pins;
}
else
{
frames[frameIndex].PinsRolled[1] = pins;
frames[frameIndex].IsComplete = true; // Frame ist vollständig
}
currentRoll++;
}
CalculateScores();
_outputProvider.Write($"Aktuelle Punktzahl: {TotalScore()}");
}
private int GetCurrentFrameIndex()
{
return currentRoll / 2;
}
private int TotalScore()
{
int totalScore = 0;
foreach (var frame in frames)
{
totalScore += frame.Score;
}
return totalScore;
}
private bool Over()
{
// Stelle sicher, dass das Spiel 10 Frames hat
if (frames.Count < 10)
{
return false;
}
var lastFrame = frames[9];
if (lastFrame.PinsRolled[0] == 10)
{
return lastFrame.PinsRolled.Length == 3 && currentRoll >= 12;
}
if (lastFrame.PinsRolled[0] + lastFrame.PinsRolled[1] == 10)
{
return currentRoll >= 11;
}
return currentRoll >= 20;
}
private void CalculateScores()
{
for (int i = 0; i < frames.Count; i++)
{
var frame = frames;
if (frame.IsComplete)
{
if (IsStrike(i))
{
CalculateStrikeScore(frame, i);
}
else if (IsSpare(i))
{
CalculateSpareScore(frame, i);
}
else
{
frame.Score = frame.PinsRolled[0] + frame.PinsRolled[1];
}
}
}
}
private void CalculateStrikeScore(Frame frame, int frameIndex)
{
frame.Score = 10 + StrikeBonus(frameIndex);
}
private void CalculateSpareScore(Frame frame, int frameIndex)
{
frame.Score = 10 + SpareBonus(frameIndex);
}
private bool IsStrike(int frameIndex)
{
return frames[frameIndex].PinsRolled[0] == 10;
}
private bool IsSpare(int frameIndex)
{
return frames[frameIndex].PinsRolled[0] + frames[frameIndex].PinsRolled[1] == 10;
}
private int StrikeBonus(int frameIndex)
{
if (frameIndex + 1 < frames.Count)
{
var nextFrame = frames[frameIndex + 1];
return nextFrame.PinsRolled[0] + (nextFrame.PinsRolled[1] != 0 ? nextFrame.PinsRolled[1] : (frameIndex + 2 < frames.Count ? frames[frameIndex + 2].PinsRolled[0] : 0));
}
return 0;
}
private int SpareBonus(int frameIndex)
{
if (frameIndex + 1 < frames.Count)
{
return frames[frameIndex + 1].PinsRolled[0];
}
return 0;
}
}
Итак, ребята, я пишу небольшую игру для подсчета того, сколько кеглей я выбил в игре в боулинг. Я написал множество тестов практически для каждого случая, который мог произойти, и я просто не могу исправить тот факт, что мой тест терпит неудачу при нанесении только ударов.
Цель — получить 12 пометов и 300 в итоге общая сумма баллов. Я очень застрял, поэтому было бы здорово, если бы кто-нибудь мог мне помочь.
Это мой класс Frame:
public class Frame
{
public int[] PinsRolled { get; set; }
public int Score { get; set; }
public bool IsComplete { get; set; }
public Frame()
{
PinsRolled = new int[2];
IsComplete = false;
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... -code-kata
Модульный тест завершается неудачей при компиляции моего ката «Код боулинга» ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Модульное тестирование ArgumentOutOfRangeException при компиляции моего ката «Код боулинга»
Anonymous » » в форуме C# - 0 Ответы
- 10 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Модульное тестирование ArgumentOutOfRangeException при компиляции моего ката «Код боулинга»
Anonymous » » в форуме C# - 0 Ответы
- 10 Просмотры
-
Последнее сообщение Anonymous
-