/*
* we all know the classic "guessing game" with higher or lower prompts.
* lets do a role reversal; you create a program that
* will guess numbers between 1-100, and respond appropriately
* based on whether users say that the number is too high or too low.
* Try to make a program that can guess your number based on user input and great code!
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
namespace First_Hard
{
class Program
{
static void Main(string[] args)
{
string[] enumValues = Enum.GetNames(typeof(Opoments));
Console.WriteLine("Choose the opponent for guessing:");
for (int i = 0; i < enumValues.Length; i++)
{
Console.WriteLine("[{0}] -> {1} Opoment", i + 1, enumValues[i]);
}
int userInput = 0;
string line;
do
{
line = Console.ReadLine();
} while (!int.TryParse(line, out userInput) || userInput > enumValues.Length || userInput <= 0);
userInput--;
IGuesser guesser;
string opponentClass = enumValues[userInput];
opponentClass = new CultureInfo("en-GB").TextInfo.ToTitleCase(opponentClass);
opponentClass += "Guesser";
opponentClass = "First_Hard." + opponentClass;
Type opponentType = Type.GetType(opponentClass, true, true);
guesser = opponentType.GetConstructor(new Type[0]).Invoke(new object[0]) as IGuesser;
if (guesser == null) return;
Console.WriteLine("Game is starting.");
Console.WriteLine("First Guess is {0}", guesser.FirstGuess());
GuessResult result;
while ((result = AskUser()) != GuessResult.exact)
{
if (result == GuessResult.higher)
{
Console.WriteLine("Is it {0}?", guesser.GuessHigher());
}
else
{
Console.WriteLine("How about {0}?", guesser.GuessLower());
}
}
Console.WriteLine("Thank you for playing");
Console.ReadKey();
}
static GuessResult AskUser()
{
string answer;
do
{
Console.WriteLine("[H]igher, [L]ower or [E]xact");
answer = Console.ReadLine();
answer.ToLower();
} while (answer != "h" && answer != "l" && answer != "e");
switch (answer)
{
case "h":
return GuessResult.higher;
case "l":
return GuessResult.lower;
case "e":
return GuessResult.exact;
}
throw new InvalidOperationException("I should never be thrown");
}
}
interface IGuesser
{
int FirstGuess();
int GuessLower();
int GuessHigher();
}
enum Opoments
{
dumb, smart, random
}
enum GuessResult
{
higher, lower, exact
}
class DumbGuesser : IGuesser
{
private int top;
private int bottom;
private int last;
private Random rand;
public DumbGuesser()
{
top = 100;
bottom = 1;
last = -1;
rand = new Random();
}
public int FirstGuess()
{
if (last != -1) throw new InvalidOperationException("I alredy guessed first time");
last = rand.Next(100);
return last;
}
public int GuessLower()
{
Check();
top = last;
last = rand.Next(bottom, top);
return last;
}
public int GuessHigher()
{
Check();
bottom = last;
last = rand.Next(bottom, top);
return last;
}
private void Check()
{
if (last == -1)
throw new InvalidOperationException("I did not have first guess");
if (bottom >= top)
{
Console.WriteLine("CHEATER!!!!!!");
Console.ReadKey();
Environment.Exit(0);
}
}
}
class SmartGuesser : IGuesser
{
private int top;
private int bottom;
private int last;
public SmartGuesser()
{
top = 100;
bottom = 1;
last = -1;
}
public int FirstGuess()
{
last = 50;
return 50;
}
public int GuessLower()
{
top = last;
return Guess();
}
public int GuessHigher()
{
bottom = last;
return Guess();
}
private int Guess()
{
Check();
int retVal = (top - bottom + 1) / 2;
retVal += bottom;
last = retVal;
return retVal;
}
private void Check()
{
if (last == -1)
throw new InvalidOperationException("I did not have first guess");
if (bottom >= top)
{
Console.WriteLine("CHEATER!!!!!!");
Console.ReadKey();
Environment.Exit(0);
}
}
}
public class RandomGuesser : IGuesser
{
private IGuesser innerGuesser;
public RandomGuesser()
{
if ((new Random().Next() % 2) == 0)
{
innerGuesser = new SmartGuesser();
}
else
{
innerGuesser = new DumbGuesser();
}
}
public int FirstGuess()
{
return innerGuesser.FirstGuess();
}
public int GuessLower()
{
return innerGuesser.GuessLower();
}
public int GuessHigher()
{
return innerGuesser.GuessHigher();
}
}
}