Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions MathGame.Bashar-Amer/MathGame.Bashar-Amer.slnx
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<Solution>
<Project Path="MathGame.Bashar-Amer/MathGame.Bashar-Amer.csproj" />
</Solution>
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<RootNamespace>MathGame.Bashar_Amer</RootNamespace>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

</Project>
50 changes: 50 additions & 0 deletions MathGame.Bashar-Amer/MathGame.Bashar-Amer/MathGameLogic.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
namespace MathGame.Bashar_Amer;

internal class MathGameLogic
{
public List<string> GameHistory { get; set; } = new();

public void ShowMenu()
{
Console.WriteLine("Please enter an option to select operation:");
Console.WriteLine("1. Addition");
Console.WriteLine("2. Subtraction");
Console.WriteLine("3. Multiplication");
Console.WriteLine("4. Division");
Console.WriteLine("5. Random Mode");
Console.WriteLine("6. Show History");
Console.WriteLine("7. Change difficulty");
Console.WriteLine("8. Exist");
Console.WriteLine("--------------------");
}

public int CalculateMathOperation(int firstNumber, int secondNumber, char operation)
{
switch (operation)
{
case '+':
GameHistory.Add($"firstNumber + secondNumber = {firstNumber + secondNumber}");
return firstNumber + secondNumber;
case '-':
GameHistory.Add($"firstNumber - secondNumber = {firstNumber - secondNumber}");
return firstNumber - secondNumber;
case '*':
GameHistory.Add($"firstNumber * secondNumber = {firstNumber * secondNumber}");
return firstNumber * secondNumber;
case '÷':
while (firstNumber < 0 || firstNumber > 100)
{
try {
Console.WriteLine("Please enter between 0 and 100.");
firstNumber = Convert.ToInt32(Console.ReadLine());
}
catch (Exception)
{ }

}
GameHistory.Add($"firstNumber / secondNumber = {firstNumber / secondNumber}");
return firstNumber / secondNumber;
}
return 0;
}
}
221 changes: 221 additions & 0 deletions MathGame.Bashar-Amer/MathGame.Bashar-Amer/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,221 @@
using System.Diagnostics;

namespace MathGame.Bashar_Amer;

internal class Program
{
static async Task Main()
{
MathGameLogic mathGame = new();
Random random = new();

int firstNumber;
int secondNumber;
int userMenuSelection;
int score = 0;
bool gameOver = false;

DifficultyLevel difficultyLevel = DifficultyLevel.Easy;

while (!gameOver)
{
userMenuSelection = GetUserMenuSelection(mathGame);

firstNumber = random.Next(1, 101);
secondNumber = random.Next(1, 101);

switch (userMenuSelection)
{
case 1:
score += await PerformOperation(mathGame,firstNumber,secondNumber,'+',score, difficultyLevel);
break;
case 2:
score += await PerformOperation(mathGame, firstNumber, secondNumber, '-', score, difficultyLevel);
break;
case 3:
score += await PerformOperation(mathGame, firstNumber, secondNumber, '*', score, difficultyLevel);
break;
case 4:
while (firstNumber % secondNumber != 0)
{
firstNumber = random.Next(1, 101);
secondNumber = random.Next(1, 101);
}
score += await PerformOperation(mathGame, firstNumber, secondNumber, '/', score, difficultyLevel);
break;
case 5:
int numberOfQuestions = 99;
Console.WriteLine("Please enter the number of questions you want to attempt.");

while (!int.TryParse(Console.ReadLine(),out numberOfQuestions))
Console.WriteLine("Please enter the number of questions you want to attempt as an integer number.");

while (numberOfQuestions > 0)
{
int randomOperation = random.Next(1, 5);

firstNumber = random.Next(1, 101);
secondNumber = random.Next(1, 101);

switch (randomOperation)
{
case 1:
score += await PerformOperation(mathGame, firstNumber, secondNumber, '+', score, difficultyLevel);
break;
case 2:
score += await PerformOperation(mathGame, firstNumber, secondNumber, '-', score, difficultyLevel);
break;
case 3:
score += await PerformOperation(mathGame, firstNumber, secondNumber, '*', score, difficultyLevel);
break;
case 4:
while (firstNumber % secondNumber != 0)
{
firstNumber = random.Next(1, 101);
secondNumber = random.Next(1, 101);
}
score += await PerformOperation(mathGame, firstNumber, secondNumber, '÷', score, difficultyLevel);
break;
}
numberOfQuestions--;
}
break;

case 6:
Console.WriteLine("Game History: \n");
foreach (var operation in mathGame.GameHistory)
Console.WriteLine(operation);

break;

case 7:
difficultyLevel = ChangeDifficulty();
Enum.IsDefined(typeof(DifficultyLevel), difficultyLevel);
Console.WriteLine($"Your new difficulty level: {difficultyLevel}");
break;

case 8:
gameOver = true;
Console.WriteLine($"Your final score is: {score}");
break;

}


}
}


static DifficultyLevel ChangeDifficulty()
{
int userSelection = 0;
Console.WriteLine("1 - Easy");
Console.WriteLine("2 - Medium");
Console.WriteLine("3 - Hard");

while (!int.TryParse(Console.ReadLine(), out userSelection) || userSelection < 1 || userSelection > 3)
{
Console.WriteLine("Please enter a valid option 1-3");
}

return userSelection switch
{
1 => DifficultyLevel.Easy,
2 => DifficultyLevel.Medium,
3 => DifficultyLevel.Hard,
_ => DifficultyLevel.Easy
};
}

static void DisplayMathGameQuestion(int firstNumber, int secondNumber, char operation)
{
Console.WriteLine($"{firstNumber} {operation} {secondNumber} = ??");
}

static int GetUserMenuSelection(MathGameLogic mathGame)
{
int selection = -1;
mathGame.ShowMenu();

while (selection < 1 || selection > 8)
{
while (!int.TryParse(Console.ReadLine(), out selection))
Console.WriteLine("Please enter a valid option 1-8");

if (!(selection >= 1 & selection <= 8))
Console.WriteLine("Please enter a valid option 1-8");
}
return selection;
}

static async Task<int?> GetUserResponse(DifficultyLevel difficulty)
{

int response = 0;
int timeout = (int)difficulty;

Stopwatch stopwatch = new();
stopwatch.Start();

Task<string?> getUserInputTask = Task.Run(() => Console.ReadLine());

try
{
string? result = await Task.WhenAny(getUserInputTask, Task.Delay(timeout * 1000))
== getUserInputTask ? getUserInputTask.Result : null;

stopwatch.Stop();

if (result != null && int.TryParse(result, out response))
{
Console.WriteLine($"Time taken to answer: {stopwatch.Elapsed.ToString(@"mm\:ss\.fff")}");
return response;
}
else
throw new OperationCanceledException();

}
catch (OperationCanceledException)
{
Console.WriteLine("Time is up!");
return null;
}
}

static int ValidateResult(int result, int? userResponse, int score)
{
if (result == userResponse)
{
Console.WriteLine("Your answer is correct! You earned 5 points");
score += 5;
}
else
{
Console.WriteLine("Try again!");
Console.WriteLine($"Correct answer is: {result}");
}
return score;
}


static async Task<int> PerformOperation(MathGameLogic mathGame, int firstNumber, int secondNumber, char operation, int score, DifficultyLevel difficulty)
{
int result;
int? userResponse;

DisplayMathGameQuestion(firstNumber, secondNumber, operation);
result = mathGame.CalculateMathOperation(firstNumber, secondNumber, operation);
userResponse = await GetUserResponse(difficulty);
score = ValidateResult(result, userResponse, score);
return score;
}

}

enum DifficultyLevel
{
Easy = 45,
Medium = 30,
Hard = 15
}

Loading