diff --git a/.codacy.yml b/.codacy.yml
deleted file mode 100644
index 44c0e92e..00000000
--- a/.codacy.yml
+++ /dev/null
@@ -1,4 +0,0 @@
----
-exclude_paths:
- - "README.md"
- - "**/README.md"
\ No newline at end of file
diff --git a/.github/workflows/project-submission.yml b/.github/workflows/project-submission.yml
deleted file mode 100644
index d01ee8b5..00000000
--- a/.github/workflows/project-submission.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-name: Project Submission
-
-on:
- pull_request_target:
- branches: [ "main" ]
- types: [opened, reopened]
-
- # Allows you to run this workflow manually from the Actions tab
- workflow_dispatch:
-
-permissions:
- pull-requests: write
- issues: write
-
-# A workflow run is made up of one or more jobs that can run sequentially or in parallel
-jobs:
- call-submission-workflow:
- uses: the-csharp-academy/base-repo/.github/workflows/project-submission.yml@main
diff --git a/.gitignore b/.gitignore
index 154e1272..3e168525 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,477 +1,3 @@
-## Ignore Visual Studio temporary files, build results, and
-## files generated by popular Visual Studio add-ons.
-##
-## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
-
-# User-specific files
-*.rsuser
-*.suo
-*.user
-*.userosscache
-*.sln.docstates
-
-# User-specific files (MonoDevelop/Xamarin Studio)
-*.userprefs
-
-# Mono auto generated files
-mono_crash.*
-
-# Build results
-[Dd]ebug/
-[Dd]ebugPublic/
-[Rr]elease/
-[Rr]eleases/
-x64/
-x86/
-[Ww][Ii][Nn]32/
-[Aa][Rr][Mm]/
-[Aa][Rr][Mm]64/
-bld/
-[Bb]in/
-[Oo]bj/
-[Ll]og/
-[Ll]ogs/
-
-# Visual Studio 2015/2017 cache/options directory
-.vs/
-# Uncomment if you have tasks that create the project's static files in wwwroot
-#wwwroot/
-
-# Visual Studio 2017 auto generated files
-Generated\ Files/
-
-# MSTest test Results
-[Tt]est[Rr]esult*/
-[Bb]uild[Ll]og.*
-
-# NUnit
-*.VisualState.xml
-TestResult.xml
-nunit-*.xml
-
-# Build Results of an ATL Project
-[Dd]ebugPS/
-[Rr]eleasePS/
-dlldata.c
-
-# Benchmark Results
-BenchmarkDotNet.Artifacts/
-
-# .NET
-project.lock.json
-project.fragment.lock.json
-artifacts/
-
-# Tye
-.tye/
-
-# ASP.NET Scaffolding
-ScaffoldingReadMe.txt
-
-# StyleCop
-StyleCopReport.xml
-
-# Files built by Visual Studio
-*_i.c
-*_p.c
-*_h.h
-*.ilk
-*.meta
-*.obj
-*.iobj
-*.pch
-*.pdb
-*.ipdb
-*.pgc
-*.pgd
-*.rsp
-*.sbr
-*.tlb
-*.tli
-*.tlh
-*.tmp
-*.tmp_proj
-*_wpftmp.csproj
-*.log
-*.tlog
-*.vspscc
-*.vssscc
-.builds
-*.pidb
-*.svclog
-*.scc
-
-# Chutzpah Test files
-_Chutzpah*
-
-# Visual C++ cache files
-ipch/
-*.aps
-*.ncb
-*.opendb
-*.opensdf
-*.sdf
-*.cachefile
-*.VC.db
-*.VC.VC.opendb
-
-# Visual Studio profiler
-*.psess
-*.vsp
-*.vspx
-*.sap
-
-# Visual Studio Trace Files
-*.e2e
-
-# TFS 2012 Local Workspace
-$tf/
-
-# Guidance Automation Toolkit
-*.gpState
-
-# ReSharper is a .NET coding add-in
-_ReSharper*/
-*.[Rr]e[Ss]harper
-*.DotSettings.user
-
-# TeamCity is a build add-in
-_TeamCity*
-
-# DotCover is a Code Coverage Tool
-*.dotCover
-
-# AxoCover is a Code Coverage Tool
-.axoCover/*
-!.axoCover/settings.json
-
-# Coverlet is a free, cross platform Code Coverage Tool
-coverage*.json
-coverage*.xml
-coverage*.info
-
-# Visual Studio code coverage results
-*.coverage
-*.coveragexml
-
-# NCrunch
-_NCrunch_*
-.*crunch*.local.xml
-nCrunchTemp_*
-
-# MightyMoose
-*.mm.*
-AutoTest.Net/
-
-# Web workbench (sass)
-.sass-cache/
-
-# Installshield output folder
-[Ee]xpress/
-
-# DocProject is a documentation generator add-in
-DocProject/buildhelp/
-DocProject/Help/*.HxT
-DocProject/Help/*.HxC
-DocProject/Help/*.hhc
-DocProject/Help/*.hhk
-DocProject/Help/*.hhp
-DocProject/Help/Html2
-DocProject/Help/html
-
-# Click-Once directory
-publish/
-
-# Publish Web Output
-*.[Pp]ublish.xml
-*.azurePubxml
-# Note: Comment the next line if you want to checkin your web deploy settings,
-# but database connection strings (with potential passwords) will be unencrypted
-*.pubxml
-*.publishproj
-
-# Microsoft Azure Web App publish settings. Comment the next line if you want to
-# checkin your Azure Web App publish settings, but sensitive information contained
-# in these scripts will be unencrypted
-PublishScripts/
-
-# NuGet Packages
-*.nupkg
-# NuGet Symbol Packages
-*.snupkg
-# The packages folder can be ignored because of Package Restore
-**/[Pp]ackages/*
-# except build/, which is used as an MSBuild target.
-!**/[Pp]ackages/build/
-# Uncomment if necessary however generally it will be regenerated when needed
-#!**/[Pp]ackages/repositories.config
-# NuGet v3's project.json files produces more ignorable files
-*.nuget.props
-*.nuget.targets
-
-# Microsoft Azure Build Output
-csx/
-*.build.csdef
-
-# Microsoft Azure Emulator
-ecf/
-rcf/
-
-# Windows Store app package directories and files
-AppPackages/
-BundleArtifacts/
-Package.StoreAssociation.xml
-_pkginfo.txt
-*.appx
-*.appxbundle
-*.appxupload
-
-# Visual Studio cache files
-# files ending in .cache can be ignored
-*.[Cc]ache
-# but keep track of directories ending in .cache
-!?*.[Cc]ache/
-
-# Others
-ClientBin/
-~$*
-*~
-*.dbmdl
-*.dbproj.schemaview
-*.jfm
-*.pfx
-*.publishsettings
-orleans.codegen.cs
-
-# Including strong name files can present a security risk
-# (https://github.com/github/gitignore/pull/2483#issue-259490424)
-#*.snk
-
-# Since there are multiple workflows, uncomment next line to ignore bower_components
-# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
-#bower_components/
-
-# RIA/Silverlight projects
-Generated_Code/
-
-# Backup & report files from converting an old project file
-# to a newer Visual Studio version. Backup files are not needed,
-# because we have git ;-)
-_UpgradeReport_Files/
-Backup*/
-UpgradeLog*.XML
-UpgradeLog*.htm
-ServiceFabricBackup/
-*.rptproj.bak
-
-# SQL Server files
-*.mdf
-*.ldf
-*.ndf
-
-# Business Intelligence projects
-*.rdl.data
-*.bim.layout
-*.bim_*.settings
-*.rptproj.rsuser
-*- [Bb]ackup.rdl
-*- [Bb]ackup ([0-9]).rdl
-*- [Bb]ackup ([0-9][0-9]).rdl
-
-# Microsoft Fakes
-FakesAssemblies/
-
-# GhostDoc plugin setting file
-*.GhostDoc.xml
-
-# Node.js Tools for Visual Studio
-.ntvs_analysis.dat
-node_modules/
-
-# Visual Studio 6 build log
-*.plg
-
-# Visual Studio 6 workspace options file
-*.opt
-
-# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
-*.vbw
-
-# Visual Studio 6 auto-generated project file (contains which files were open etc.)
-*.vbp
-
-# Visual Studio 6 workspace and project file (working project files containing files to include in project)
-*.dsw
-*.dsp
-
-# Visual Studio 6 technical files
-*.ncb
-*.aps
-
-# Visual Studio LightSwitch build output
-**/*.HTMLClient/GeneratedArtifacts
-**/*.DesktopClient/GeneratedArtifacts
-**/*.DesktopClient/ModelManifest.xml
-**/*.Server/GeneratedArtifacts
-**/*.Server/ModelManifest.xml
-_Pvt_Extensions
-
-# Paket dependency manager
-.paket/paket.exe
-paket-files/
-
-# FAKE - F# Make
-.fake/
-
-# CodeRush personal settings
-.cr/personal
-
-# Python Tools for Visual Studio (PTVS)
-__pycache__/
-*.pyc
-
-# Cake - Uncomment if you are using it
-# tools/**
-# !tools/packages.config
-
-# Tabs Studio
-*.tss
-
-# Telerik's JustMock configuration file
-*.jmconfig
-
-# BizTalk build output
-*.btp.cs
-*.btm.cs
-*.odx.cs
-*.xsd.cs
-
-# OpenCover UI analysis results
-OpenCover/
-
-# Azure Stream Analytics local run output
-ASALocalRun/
-
-# MSBuild Binary and Structured Log
-*.binlog
-
-# NVidia Nsight GPU debugger configuration file
-*.nvuser
-
-# MFractors (Xamarin productivity tool) working folder
-.mfractor/
-
-# Local History for Visual Studio
-.localhistory/
-
-# Visual Studio History (VSHistory) files
-.vshistory/
-
-# BeatPulse healthcheck temp database
-healthchecksdb
-
-# Backup folder for Package Reference Convert tool in Visual Studio 2017
-MigrationBackup/
-
-# Ionide (cross platform F# VS Code tools) working folder
-.ionide/
-
-# Fody - auto-generated XML schema
-FodyWeavers.xsd
-
-# VS Code files for those working on multiple tools
-.vscode/*
-!.vscode/settings.json
-!.vscode/tasks.json
-!.vscode/launch.json
-!.vscode/extensions.json
-*.code-workspace
-
-# Local History for Visual Studio Code
-.history/
-
-# Windows Installer files from build outputs
-*.cab
-*.msi
-*.msix
-*.msm
-*.msp
-
-# JetBrains Rider
-*.sln.iml
-
-##
-## Visual studio for Mac
-##
-
-
-# globs
-Makefile.in
-*.userprefs
-*.usertasks
-config.make
-config.status
-aclocal.m4
-install-sh
-autom4te.cache/
-*.tar.gz
-tarballs/
-test-results/
-
-# Mac bundle stuff
-*.dmg
-*.app
-
-# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore
-# General
-.DS_Store
-.AppleDouble
-.LSOverride
-
-# Icon must end with two \r
-Icon
-
-
-# Thumbnails
-._*
-
-# Files that might appear in the root of a volume
-.DocumentRevisions-V100
-.fseventsd
-.Spotlight-V100
-.TemporaryItems
-.Trashes
-.VolumeIcon.icns
-.com.apple.timemachine.donotpresent
-
-# Directories potentially created on remote AFP share
-.AppleDB
-.AppleDesktop
-Network Trash Folder
-Temporary Items
-.apdisk
-
-# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore
-# Windows thumbnail cache files
-Thumbs.db
-ehthumbs.db
-ehthumbs_vista.db
-
-# Dump file
-*.stackdump
-
-# Folder config file
-[Dd]esktop.ini
-
-# Recycle Bin used on file shares
-$RECYCLE.BIN/
-
-# Windows Installer files
-*.cab
-*.msi
-*.msix
-*.msm
-*.msp
-
-# Windows shortcuts
-*.lnk
+bin/
+obj/
+.vs/
\ No newline at end of file
diff --git a/MathGameAcademy.slnx b/MathGameAcademy.slnx
new file mode 100644
index 00000000..3643f833
--- /dev/null
+++ b/MathGameAcademy.slnx
@@ -0,0 +1,3 @@
+
+
+
diff --git a/MathGameAcademy/Calculator.cs b/MathGameAcademy/Calculator.cs
new file mode 100644
index 00000000..5474e3d4
--- /dev/null
+++ b/MathGameAcademy/Calculator.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace MathGameAcademy
+{
+ internal class Calculator
+ {
+ public static int MathCalculation(int[] random, char _operator)
+ {
+ switch (_operator)
+ {
+ case '+':
+ return (random[0] + random[1]);
+ case '-':
+ return (random[0] - random[1]);
+ case '*':
+ return (random[0] * random[1]);
+ case '/':
+ if (random[1] == 0)
+ {
+ throw new DivideByZeroException("Cannot divide by zero.");
+ }
+ return (random[0] / random[1]);
+ default:
+ throw new ArgumentException("Invalid operator.");
+ }
+ }
+ }
+}
diff --git a/MathGameAcademy/MathGameAcademy.csproj b/MathGameAcademy/MathGameAcademy.csproj
new file mode 100644
index 00000000..ed9781c2
--- /dev/null
+++ b/MathGameAcademy/MathGameAcademy.csproj
@@ -0,0 +1,10 @@
+
+
+
+ Exe
+ net10.0
+ enable
+ enable
+
+
+
diff --git a/MathGameAcademy/Program.cs b/MathGameAcademy/Program.cs
new file mode 100644
index 00000000..b81c6696
--- /dev/null
+++ b/MathGameAcademy/Program.cs
@@ -0,0 +1,239 @@
+using System.Diagnostics.Metrics;
+
+namespace MathGameAcademy
+{
+ class Program
+ {
+ private static List gameList = new List();
+ private static List operatorList = new List();
+
+ private static List gameHistory = new List();
+
+ private static int GameRound = 0;
+ static void Main(string[] args)
+ {
+ bool playAgain = false;
+ do
+ {
+ GameRound++;
+ Console.WriteLine("Welcome to the Math Game!");
+ Console.WriteLine("How many rounds do you want to play? (Enter a number between 5 and 10):");
+ int roundsInt = GetInteger(5, 10);
+ int pointsInt = 0;
+ Random random = new Random();
+ char _operator = GetOperator();
+ if (_operator == 'r')
+ {
+ int opInt = random.Next(1, 5);
+ switch (opInt)
+ {
+ case 1:
+ _operator = '+';
+ break;
+ case 2:
+ _operator = '-';
+ break;
+ case 3:
+ _operator = '*';
+ break;
+ case 4:
+ _operator = '/';
+ break;
+ }
+ }
+ for (int i = 0; i < roundsInt; i++)
+ {
+ int[] randomNumbers = new int[2];
+
+ randomNumbers[0] = random.Next(1, 101);
+ randomNumbers[1] = random.Next(1, 101);
+
+ if (_operator == '/')
+ {
+ do
+ {
+ randomNumbers[1] = random.Next(1, 51);
+ if (randomNumbers[1] == 1 || randomNumbers[1] == 2)
+ {
+ randomNumbers[1] = random.Next(1, 51); // to make probability of 1 and 2 lower, since they are more likely to be factors of other numbers
+ }
+ do
+ {
+ randomNumbers[0] = random.Next(1, 101);
+ } while (randomNumbers[0] < randomNumbers[1]);
+
+ } while (randomNumbers[0] % randomNumbers[1] != 0);
+ }
+
+
+ int resultGuess = GetNumber(randomNumbers, _operator);
+ int correctResult = Calculator.MathCalculation(randomNumbers, _operator);
+ if (resultGuess == correctResult)
+ {
+ Console.WriteLine("Correct!");
+ pointsInt++;
+ Console.WriteLine($"You have {pointsInt} points of {roundsInt} possible points.");
+ }
+ else
+ {
+ Console.WriteLine($"Incorrect! The correct answer is {correctResult}");
+ Console.WriteLine($"You have {pointsInt} points of {roundsInt} possible points.");
+ }
+ gameList.Add(new int[] { randomNumbers[0], randomNumbers[1], resultGuess, correctResult });
+ operatorList.Add(_operator);
+ }
+
+ Console.WriteLine("Game Finished!");
+ Console.WriteLine("You got {0} points out of {1} possible points.", pointsInt, roundsInt);
+ gameHistory.Add(new int[] {GameRound, pointsInt, roundsInt });
+
+ bool runMenu = true;
+ while (runMenu)
+ {
+ PrintSeparator();
+ Console.WriteLine("Do you want to see the game history? Type 'h': ");
+ Console.WriteLine("Do you want to delete the game history? Type 'd': ");
+ Console.WriteLine("Do you want to play again? Type 'p': ");
+ Console.WriteLine("Do you want to stop the game? Type 's': ");
+ string userInputMenu;
+ do
+ {
+ Console.Write("Enter a valid choice: ");
+ userInputMenu = Console.ReadLine().Trim().ToLower();
+ PrintSeparator();
+ } while (userInputMenu != "h" && userInputMenu != "d" && userInputMenu != "p" && userInputMenu != "s");
+
+ switch (userInputMenu)
+ {
+ case "h":
+ int roundCounter = 0;
+ if (gameList.Count == 0)
+ {
+ Console.WriteLine("No game history available.");
+ break;
+ }
+ else if (gameList.Count != operatorList.Count)
+ {
+ Console.WriteLine("Game history is corrupted. Please delete the game history.");
+ break;
+ }
+ else
+ {
+ foreach(int[] game in gameHistory)
+ {
+ Console.WriteLine($"Game {game[0]}: {game[1]} points out of {game[2]} possible points.");
+ }
+ foreach (int[] game in gameList)
+ {
+ var op = operatorList[roundCounter];
+ Console.WriteLine($"Round {roundCounter+1}: {game[0]} {op} {game[1]} = {game[2]} (Correct answer: {game[3]})");
+ roundCounter++;
+ }
+ }
+
+ break;
+
+ case "d":
+ gameList.Clear();
+ operatorList.Clear();
+ Console.WriteLine("Game history deleted.");
+ break;
+
+ case "p":
+ playAgain = true;
+ runMenu = false;
+ PrintSeparator();
+ PrintSeparator();
+ break;
+
+ case "s":
+ playAgain = false;
+ runMenu = false;
+ break;
+
+ default:
+ Console.WriteLine("Invalid input. Please enter exactly 'h', 'd', 'p' or 's':");
+ break;
+ }
+ }
+
+ }while (playAgain);
+
+ }
+ private static void PrintSeparator()
+ {
+ Console.WriteLine(new string('-', 30));
+ }
+ private static int GetInteger(int min, int max)
+ {
+ int rounds;
+ bool check;
+ do
+ {
+ check = int.TryParse(Console.ReadLine(), out rounds);
+ if (!check || rounds < min || rounds > max)
+ {
+ check = false;
+ Console.WriteLine($"Invalid input. Please enter a number between {min} and {max}.");
+ }
+ } while (check == false);
+ return rounds;
+ }
+ //private static bool YesOrNo(string message)
+ //{
+ // Console.WriteLine(message);
+ // char choice;
+ // bool check;
+ // do
+ // {
+ // check = char.TryParse(Console.ReadLine(), out choice);
+
+ // if (!check || (choice != 'y' && choice != 'Y' && choice != 'n' && choice != 'N'))
+ // {
+ // check = false;
+ // Console.WriteLine("Invalid input. Please enter exactly 'y' or 'n':");
+ // }
+ // } while (check == false);
+
+ // if (choice == 'y' || choice == 'Y')
+ // {
+ // return true;
+ // }
+ // return false;
+ //}
+
+ private static int GetNumber(int[] random, char _operator)
+ {
+ Console.WriteLine($"What is {random[0]}{_operator}{random[1]}?");
+ bool check;
+ int result;
+ do
+ {
+ check = int.TryParse(Console.ReadLine(), out result);
+ if(!check)
+ {
+ Console.WriteLine("Invalid input. Please enter a valid integer.");
+ }
+ } while (check == false);
+ return result;
+ }
+ private static char GetOperator()
+ {
+ Console.WriteLine("Type an operator or random r (+, -, *, /, r):");
+ char _operator;
+ bool check;
+ do
+ {
+ check = char.TryParse(Console.ReadLine(), out _operator);
+ if (!check || (_operator != '+' && _operator != '-' && _operator != '*' && _operator != '/' && _operator != 'r'))
+ {
+ check = false;
+ Console.WriteLine("Invalid operator. Please choose one of the following: +, -, *, /, r");
+ }
+ } while (check == false);
+ return _operator;
+ }
+
+ }
+
+}