232 lines
4.7 KiB
Markdown
232 lines
4.7 KiB
Markdown
```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
|
|
|
|
```
|