private static Frame GetLastNotFullFrame(Frames frames) { foreach (Frame f in frames) { if (!FullFrameRule.IsFull(f)) return f; } throw new Exception(); }
private Frames RollMany(int maxFrameCount, params int[] pins) { Frames frames = new Frames(maxFrameCount); foreach (int pin in pins) { frames = RollService.Roll(frames, pin); } return frames; }
private static int CalcBonus(Frames frames, int index) { int sum = 0; for (int i = 0; i < index + 1; i++) { sum += CalcBonusFrame(frames[i], frames); } return sum; }
internal static int Calc(Frames frames) { RemainCalculatorCore core = new RemainCalculatorCore(); foreach (int pin in frames.GetPins()) { core.Apply(pin); } return core.GetRemain(); }
private static int CalcBonusFrame(Frame f, Frames frames) { int bonus = 0; int bonusCount = GetBonusCount(f); foreach (int pins in GetPinsAfterFrame(f, frames)) { if (bonusCount == 0) return bonus; bonus += pins; bonusCount--; } return bonus; }
private static IEnumerable<int> GetPinsAfterFrame(Frame target, Frames frames) { bool found = false; foreach (Frame f in frames) { if (target == f) { found = true; continue; } if (!found) continue; foreach (int pin in f.GetPins()) yield return pin; } }
public static void Save(Frames frames, string path, IWriteFile fileSystem) { try { fileSystem.Open(path); foreach (int pin in frames.GetPins()) { fileSystem.Write(pin.ToString() + ","); } } finally { fileSystem.Close(); } }
public static Frames Replace(Frames old, Frame from, Frame to) { Frames frames = new Frames(old._frames.Count); for (int i = 0; i < old._frames.Count; i++) { if (old._frames[i] == from) { frames._frames[i] = to; } else { frames._frames[i] = old._frames[i]; } } return frames; }
public static Frames Load(string path, IReadFile readFile) { Frames frames = new Frames(FrameCountRule.GetCount()); try { readFile.Open(path); string content = readFile.ReadLine(); foreach (string str in content.Split(',')) { if (str == "") break; frames = RollService.Roll(frames, int.Parse(str)); } } finally { readFile.Close(); } return frames; }
public static Score Calc(Frames frames) { return CalcAt(frames, FrameCountRule.GetCount() - 1); }
public void Roll(int p) { _frames = RollService.Roll(_frames, p); }
private static int GetRemainPins(Frames frames) { return RemainCalculator.Calc(frames); }
public static Frames Roll(Frames frames, int p) { Frame f = GetLastNotFullFrame(frames); if (!Acceptable(frames, p)) throw new Exception(); return Frames.Replace(frames, f, Frame.Append(f, new Roll(p))); }
public static bool IsEnd(Frames frames) { return FullFrameRule.IsFull(frames[FrameCountRule.GetCount() - 1]); }
public static bool Acceptable(Frames frames, int p) { if (p < 0) return false; return GetRemainPins(frames) >= p; }
internal void SetFrames(Frames frames) { _frames = frames; }
public static Score CalcAt(Frames frames, int index) { return new Score(CalcBase(frames, index) + CalcBonus(frames, index)); }