Files
basic-computer-games/14_Bowling/csharp/Bowling.cs
2022-02-06 10:27:47 -05:00

199 lines
7.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Bowling
{
public class Bowling
{
private readonly Pins pins = new();
private int players;
public void Play()
{
ShowBanner();
MaybeShowInstructions();
Setup();
GameLoop();
}
private static void ShowBanner()
{
Utility.PrintString(34, "BOWL");
Utility.PrintString(15, "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY");
Utility.PrintString();
Utility.PrintString();
Utility.PrintString();
Utility.PrintString("WELCOME TO THE ALLEY");
Utility.PrintString("BRING YOUR FRIENDS");
Utility.PrintString("OKAY LET'S FIRST GET ACQUAINTED");
Utility.PrintString();
}
private static void MaybeShowInstructions()
{
Utility.PrintString("THE INSTRUCTIONS (Y/N)");
if (Utility.InputString() == "N") return;
Utility.PrintString("THE GAME OF BOWLING TAKES MIND AND SKILL.DURING THE GAME");
Utility.PrintString("THE COMPUTER WILL KEEP SCORE.YOU MAY COMPETE WITH");
Utility.PrintString("OTHER PLAYERS[UP TO FOUR].YOU WILL BE PLAYING TEN FRAMES");
Utility.PrintString("ON THE PIN DIAGRAM 'O' MEANS THE PIN IS DOWN...'+' MEANS THE");
Utility.PrintString("PIN IS STANDING.AFTER THE GAME THE COMPUTER WILL SHOW YOUR");
Utility.PrintString("SCORES .");
}
private void Setup()
{
Utility.PrintString("FIRST OF ALL...HOW MANY ARE PLAYING", false);
var input = Utility.InputInt();
players = input < 1 ? 1 : input;
Utility.PrintString();
Utility.PrintString("VERY GOOD...");
}
private void GameLoop()
{
GameResults[] gameResults = InitGameResults();
var done = false;
while (!done)
{
ResetGameResults(gameResults);
for (int frame = 0; frame < GameResults.FramesPerGame; ++frame)
{
for (int player = 0; player < players; ++player)
{
pins.Reset();
int pinsDownThisFrame = pins.GetPinsDown();
int ball = 1;
while (ball == 1 || ball == 2) // One or two rolls
{
Utility.PrintString("TYPE ROLL TO GET THE BALL GOING.");
_ = Utility.InputString();
int pinsDownAfterRoll = pins.Roll();
ShowPins(player, frame, ball);
if (pinsDownAfterRoll == pinsDownThisFrame)
{
Utility.PrintString("GUTTER!!");
}
if (ball == 1)
{
// Store current pin count
gameResults[player].Results[frame].PinsBall1 = pinsDownAfterRoll;
// Special handling for strike
if (pinsDownAfterRoll == Pins.TotalPinCount)
{
Utility.PrintString("STRIKE!!!!!\a\a\a\a");
// No second roll
ball = 0;
gameResults[player].Results[frame].PinsBall2 = pinsDownAfterRoll;
gameResults[player].Results[frame].Score = FrameResult.Points.Strike;
}
else
{
ball = 2; // Roll again
Utility.PrintString("ROLL YOUR SECOND BALL");
}
}
else if (ball == 2)
{
// Store current pin count
gameResults[player].Results[frame].PinsBall2 = pinsDownAfterRoll;
ball = 0;
// Determine the score for the frame
if (pinsDownAfterRoll == Pins.TotalPinCount)
{
Utility.PrintString("SPARE!!!!");
gameResults[player].Results[frame].Score = FrameResult.Points.Spare;
}
else
{
Utility.PrintString("ERROR!!!");
gameResults[player].Results[frame].Score = FrameResult.Points.Error;
}
}
Utility.PrintString();
}
}
}
ShowGameResults(gameResults);
Utility.PrintString("DO YOU WANT ANOTHER GAME");
var a = Utility.InputString();
done = a.Length == 0 || a[0] != 'Y';
}
}
private GameResults[] InitGameResults()
{
var gameResults = new GameResults[players];
for (int i = 0; i < gameResults.Length; i++)
{
gameResults[i] = new GameResults();
}
return gameResults;
}
private void ShowPins(int player, int frame, int ball)
{
Utility.PrintString($"FRAME: {frame + 1} PLAYER: {player + 1} BALL: {ball}");
var breakPins = new bool[] { true, false, false, false, true, false, false, true, false, true };
var indent = 0;
for (int pin = 0; pin < Pins.TotalPinCount; ++pin)
{
if (breakPins[pin])
{
Utility.PrintString(); // End row
Utility.PrintString(indent++, false); // Indent next row
}
var s = pins[pin] == Pins.State.Down ? "+ " : "o ";
Utility.PrintString(s, false);
}
Utility.PrintString();
Utility.PrintString();
}
private void ResetGameResults(GameResults[] gameResults)
{
foreach (var gameResult in gameResults)
{
foreach (var frameResult in gameResult.Results)
{
frameResult.Reset();
}
}
}
private void ShowGameResults(GameResults[] gameResults)
{
Utility.PrintString("FRAMES");
for (int i = 0; i < GameResults.FramesPerGame; ++i)
{
Utility.PrintString(Utility.PadInt(i, 3), false);
}
Utility.PrintString();
foreach (var gameResult in gameResults)
{
foreach (var frameResult in gameResult.Results)
{
Utility.PrintString(Utility.PadInt(frameResult.PinsBall1, 3), false);
}
Utility.PrintString();
foreach (var frameResult in gameResult.Results)
{
Utility.PrintString(Utility.PadInt(frameResult.PinsBall2, 3), false);
}
Utility.PrintString();
foreach (var frameResult in gameResult.Results)
{
Utility.PrintString(Utility.PadInt((int)frameResult.Score, 3), false);
}
Utility.PrintString();
Utility.PrintString();
}
}
}
}