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
27 changes: 26 additions & 1 deletion Math_Game/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,33 @@ It's just a simple math game. Improve your math skills
## How to run the script
`python math_game.py`

## How to play
1. Choose a difficulty level: `easy`, `medium`, or `hard`
2. Choose how many questions you want to answer
3. Type your answer for each math question
4. See your final score and percentage at the end

## Difficulty levels
| Level | Number Range | Operations |
|--------|--------------|----------------|
| Easy | 1 – 10 | `+` and `-` |
| Medium | 1 – 20 | `+` `-` `*` `/`|
| Hard | 1 – 50 | `+` `-` `*` `/`|

> Division questions always produce whole number answers.

## Changes from original
- Added difficulty levels (easy, medium, hard)
- Added question limit — choose how many questions per game
- Added final score percentage at the end
- Fixed division to always produce clean whole number answers
- Simplified input error handling

## Screenshot
<div align="center"><img src="https://github.com/xNewz/python-mini-projects/blob/master/projects/Math%20Game/img.gif"></div>

## *Author Name*
[`Pargorn Ruasijan (xNewz)`](https://github.com/xNewz)
[`Pargorn Ruasijan (xNewz)`](https://github.com/xNewz)

## *Contributor Name*
[`Megha Chandrashaker`](https://github.com/MChand20656789)
95 changes: 61 additions & 34 deletions Math_Game/math_game.py
Original file line number Diff line number Diff line change
@@ -1,51 +1,78 @@
import random
import operator

def errorHandle(problem_answer):
switch = False
validated_guess = 0.0
while switch == False:
try:
validated_guess = float(input('Please enter a valid answer: '))
if type(validated_guess) is float:
switch = True
break
except ValueError:
pass
return validated_guess

def random_problem():
operators = {
OPERATORS = {
'+': operator.add,
'-': operator.sub,
'*': operator.mul,
'/': operator.truediv,
}
}

DIFFICULTY_SETTINGS = {
'easy': {'range': (1, 10), 'ops': ['+', '-']},
'medium': {'range': (1, 20), 'ops': ['+', '-', '*', '/']},
'hard': {'range': (1, 50), 'ops': ['+', '-', '*', '/']},
}

def get_valid_input(prompt):
while True:
try:
return float(input(prompt))
except ValueError:
print('Invalid input — please enter a number.')

num_1 = random.randint(1, 10)
num_2 = random.randint(1, 10)
operation = random.choice(list(operators.keys()))
answer = float(round(operators.get(operation)(num_1, num_2),3))
print(f'What is {num_1} {operation} {num_2}')
def get_difficulty():
while True:
choice = input('Choose difficulty (easy / medium / hard): ').strip().lower()
if choice in DIFFICULTY_SETTINGS:
return DIFFICULTY_SETTINGS[choice]
print('Please enter easy, medium, or hard.')

def random_problem(settings):
low, high = settings['range']
operation = random.choice(settings['ops'])
num_1 = random.randint(low, high)

if operation == '/':
# Ensure clean division — no ugly decimals
num_2 = random.randint(1, num_1)
while num_1 % num_2 != 0:
num_2 = random.randint(1, num_1)
else:
num_2 = random.randint(low, high)

answer = round(OPERATORS[operation](num_1, num_2), 3)
print(f'\nWhat is {num_1} {operation} {num_2}?')
return answer

def ask_question():
answer = random_problem()
try:
guess = float(input('Enter you answer: '))
except ValueError:
guess = errorHandle(answer)
def ask_question(settings):
answer = random_problem(settings)
guess = get_valid_input('Your answer: ')
return guess == answer

def game():
print('=== Math Game ===')
settings = get_difficulty()

total = int(input('How many questions? '))
score = 0
while True:
if ask_question() == True:

for q in range(1, total + 1):
print(f'Question {q} of {total}')
if ask_question(settings):
score += 1
print('Correct !')
print('Correct!')
else:
print('Incorrect')
break
print(f'======== Game Over ========\nYou score is {score}\nKeep going!')
print('Incorrect.')

pct = round((score / total) * 100)
print(f'\n======== Game Over ========')
print(f'Score: {score}/{total} ({pct}%)')
if pct == 100:
print('Perfect score!')
elif pct >= 70:
print('Nice work!')
else:
print('Keep practicing!')

game()
game()