This commit is contained in:
Manish 2023-07-27 18:19:40 +10:00
parent dded8aa012
commit 0f6df37aec
4 changed files with 585 additions and 0 deletions

354
Three Math Games.ipynb Normal file

File diff suppressed because one or more lines are too long

231
Three Math Games.md Normal file
View File

@ -0,0 +1,231 @@
```python
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
from ipywidgets import interactive, fixed
from IPython import display
from random import randint
from time import sleep
from sympy import symbols, Eq
from sympy.solvers import solve
from sympy.parsing.sympy_parser import parse_expr
```
# Projectile game
## Easy Mode
```python
xlo = -2
xhi = 20
ylo = -20
yhi = 120
def graph(a, b, c, height, distance):
plt.clf()
fix = plt.subplot()
plt.axis([xlo, xhi, ylo, yhi])
plt.plot([0, 0], [ylo, yhi], "black")
plt.plot([xlo, xhi], [0, 0], "black")
wall_height = height
wall_distance = distance
plt.plot([wall_distance, wall_distance], [0, wall_height], "brown")
plt.grid()
plt.title(f"{a:.1f}*x**2 + {b:.1f}*x + {c:.1f}")
x = np.linspace(0, xhi, xhi*1000)
y = a*x**2 + b*x + c
success = a*wall_distance**2 + b*wall_distance + c > wall_height
x2 = []
y2 = []
for i in range(len(y)):
if y[i] < 0:
break
if not success and x[i] > wall_distance:
break
x2.append(x[i])
y2.append(y[i])
y2[-1] = 0 # finally ball hits the ground (handling imprecisions and ball hitting walls)
plt.plot([x2[-1]], [y2[-1]], 'ro')
plt.plot(x2, y2, "b")
plt.show()
slider_range = (-25, 25, 0.1)
wall_height = randint(2, yhi-20)
wall_distance = randint(2, xhi-2)
interactive_graph = interactive(graph, a=slider_range, b=slider_range, c=slider_range, height=fixed(wall_height), distance=fixed(wall_distance))
interactive_graph
```
interactive(children=(FloatSlider(value=0.0, description='a', max=25.0, min=-25.0), FloatSlider(value=0.0, des…
## Hard Mode
Now guess projectile paramaters without fiddloing with slider
```python
xlo = -2
xhi = 20
ylo = -20
yhi = 120
wall_height = randint(2, yhi-20)
wall_distance = randint(2, xhi-2)
plt.clf()
fix = plt.subplot()
plt.axis([xlo, xhi, ylo, yhi])
plt.plot([0, 0], [ylo, yhi], "black")
plt.plot([xlo, xhi], [0, 0], "black")
plt.plot([wall_distance, wall_distance], [0, wall_height], "brown")
plt.grid()
display.display(plt.gcf())
print("You're at origin, provide A, B and C values for projectile to get across wall.")
a = float(input("A: "))
b = float(input("B: "))
c = float(input("C: "))
x = np.linspace(0, xhi, xhi*1000)
y = a*x**2 + b*x + c
success = a*wall_distance**2 + b*wall_distance + c > wall_height
x2 = []
y2 = []
for i in range(len(y)):
if y[i] < 0:
break
if not success and x[i] > wall_distance:
break
x2.append(x[i])
y2.append(y[i])
if success:
plt.title(f"Awesome, {a:.1f}*x**2 + {b:.1f}*x + {c:.1f} worked!")
else:
plt.title(f"Oops, {a:.1f}*x**2 + {b:.1f}*x + {c:.1f} did not work :(")
y2[-1] = 0 # ball hits the ground after hitting wall
plt.plot([x2[-1]], [y2[-1]], 'ro')
plt.plot(x2, y2, "b")
display.clear_output(wait=True)
plt.show()
```
![png](output_5_0.png)
# Algebra practice game
```python
def rn(): # random integer
return randint(-100, 100)
def rop(): # random operation
op = randint(1, 4)
if op == 1:
return '+'
elif op == 2:
return '-'
elif op == 3:
return '*'
elif op == 4:
return '/'
def rpm(): # random plus minus
if randint(0, 1):
return '-'
return ''
x = symbols("x")
eq = ""
if randint(0, 1): # one step problem
eq = f"x {rop()} {rn()} = {rn()}"
else:
eq = f"{rn()} {rop()} {rpm()}x {rop()} {rn()} = {rn()}"
eq = eq.replace('- -', '+ ').replace('+ -', '- ').replace('- +=', '- ')
lhs, rhs = [parse_expr(part) for part in eq.split(' = ')]
sympy_eq = Eq(lhs, rhs)
solution = round(solve(sympy_eq, x)[0], 2)
print("Solve for x in following equation:")
print(eq)
ans = [float(num) for num in input("answer: ").split('/')]
if len(ans) == 2:
ans = ans[0]/ans[1]
else:
ans = ans[0]
if abs(ans-solution) < 0.01:
print("Pretty accurate!")
else:
print(f"Oops! correct answer was {solution} but your answer was {ans}")
```
Solve for x in following equation:
34 - x / 18 = -49
answer: 1494
Pretty accurate!
# Scatter Plot Game
```python
plt.clf()
xlo = -50
xhi = 50
ylo = -50
yhi = 50
x = randint(xlo, xhi)
y = randint(ylo, yhi)
fig = plt.subplot()
plt.axis([xlo, xhi, ylo, yhi])
plt.plot([x], [y], 'ro')
plt.show()
gussed_x, gussed_y = [int(round(float(num.strip(' ')), 0)) for num in input("Guess the location of point (x, y) on graph: ").split(', ')]
if gussed_x == x and gussed_y == y:
print("You got it!")
else:
print(f"Sorry, the correct answer was ({x}, {y}) but you provided ({gussed_x}, {gussed_y})")
```
![png](output_9_0.png)
Guess the location of point (x, y) on graph: -28, 22
Sorry, the correct answer was (-25, 24) but you provided (-28, 22)
```python
```

BIN
output_5_0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
output_9_0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB