Модульный тест завершается неудачей при компиляции моего ката «Код боулинга»C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Модульный тест завершается неудачей при компиляции моего ката «Код боулинга»

Сообщение Anonymous »

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»