import machine
import time
import random
from lcd_api import LcdApi
from pico_i2c_lcd import I2cLcd
import math
led_onboard = machine.Pin(25, machine.Pin.OUT)
yellow_led = machine.Pin(2, machine.Pin.OUT)
red_led = machine.Pin(6, machine.Pin.OUT)
green_led = machine.Pin(9, machine.Pin.OUT)
blue_led = machine.Pin(13, machine.Pin.OUT)
yellow_button = machine.Pin(4, machine.Pin.IN, machine.Pin.PULL_DOWN)
red_button = machine.Pin(5, machine.Pin.IN, machine.Pin.PULL_DOWN)
blue_button = machine.Pin(11, machine.Pin.IN, machine.Pin.PULL_DOWN)
green_button = machine.Pin(10, machine.Pin.IN, machine.Pin.PULL_DOWN)
number_columns = 20
number_rows = 4
display_number = 0x27
i2c = machine.I2C(0, sda=machine.Pin(0), scl=machine.Pin(1), freq=400000)
lcd = I2cLcd(i2c, display_number, number_rows, number_columns)
lcd.custom_char(0, bytearray([0x1F,
0x1F,
0x1F,
0x1F,
0x1F,
0x1F,
0x1F,
0x1F]))
lcd.clear()
red_led.value(0)
green_led.value(0)
blue_led.value(0)
yellow_led.value(0)
led_onboard.value(1)
def save_highscores(dictionary):
with open("highscores.txt","w") as f:
for i,(game,pts) in enumerate(sorted(dictionary.items(), key= lambda x:-x[1])):
f.write(f"{game}:{pts}\n")
def load_highscores():
hs = {}
try:
with open("highscores.txt","r") as f:
for line in f:
game,_,points = line.partition(":")
if game and points:
hs[game]=int(points)
except:
return {}
return hs
menu = 1
change = 1
global pressed
global load
load = 1
def increaseLoad(num):
global load
for i in range(num):
lcd.move_to(load, 1)
lcd.putchar(chr(0))
lcd.move_to(load, 2)
lcd.putchar(chr(0))
load += 1
def startupAnimation():
lcd.clear()
lcd.move_to(3, 0)
lcd.putstr("Booting up...")
blue_led.value(1)
time.sleep(0.5)
increaseLoad(2)
green_led.value(1)
blue_led.value(0)
time.sleep(0.5)
increaseLoad(5)
red_led.value(1)
green_led.value(0)
time.sleep(1)
increaseLoad(3)
yellow_led.value(1)
red_led.value(0)
time.sleep(0.2)
increaseLoad(1)
red_led.value(1)
yellow_led.value(0)
time.sleep(0.7)
increaseLoad(5)
blue_led.value(1)
green_led.value(1)
yellow_led.value(1)
time.sleep(0.5)
blue_led.value(0)
green_led.value(0)
red_led.value(0)
yellow_led.value(0)
#startupAnimation()
high = load_highscores()
if high == {}:
high["Whackamole"] = 0
high["RapidReaction"] = 100
high["Simon"] = 0
save_highscores(high)
# Menu loop
while True:
if menu == 1:
if change == 1:
lcd.clear()
lcd.putstr(" Whackamole\n Press Start\n\nHighscore: " + str(load_highscores()["Whackamole"]))
change = 0
elif menu == 2:
if change == 1:
lcd.clear()
lcd.putstr(" Rapid Reaction\n BUGGED\n\nHighscore: " + str(load_highscores()["RapidReaction"]))
change = 0
elif menu == 3:
if change == 1:
lcd.clear()
lcd.putstr(" Simon\n Press Start\n\nHighscore: " + str(load_highscores()["Simon"]))
change = 0
elif menu == 4:
if change == 1:
lcd.clear()
lcd.putstr(" Cube Timer\n Press Start")
change = 0
if blue_button.value() == 1:
change = 1
if menu != 1:
menu -= 1
else:
menu = 4
if yellow_button.value() == 1:
change = 1
if menu != 4:
menu += 1
else:
menu = 1
if green_button.value() == 1:
if menu == 1:
# Whackamole
blue_led.value(0)
green_led.value(0)
red_led.value(0)
yellow_led.value(0)
lcd.clear()
lcd.move_to(9, 0)
lcd.putstr("3")
time.sleep(1)
lcd.clear()
lcd.move_to(9, 0)
lcd.putstr("2")
time.sleep(1)
lcd.clear()
lcd.move_to(9, 0)
lcd.putstr("1")
time.sleep(1)
lcd.clear()
lcd.move_to(9, 0)
lcd.putstr("GO!")
time.sleep(1)
score = 0
lose = 0
timer = 0
limit = 2
while lose == 0:
light = random.randint(1,4)
timer = 0
if light == 1:
blue_led.value(1)
while lose == 0 and blue_button.value() == 0:
if green_button.value() == 1 or red_button.value() == 1 or yellow_button.value() == 1 or timer > limit:
lose = 1
time.sleep(0.01)
timer += 0.01
blue_led.value(0)
elif light == 2:
green_led.value(1)
while lose == 0 and green_button.value() == 0:
if blue_button.value() == 1 or red_button.value() == 1 or yellow_button.value() == 1 or timer > limit:
lose = 1
time.sleep(0.01)
timer += 0.01
green_led.value(0)
elif light == 3:
red_led.value(1)
while lose == 0 and red_button.value() == 0:
if blue_button.value() == 1 or green_button.value() == 1 or yellow_button.value() == 1 or timer > limit:
lose = 1
time.sleep(0.01)
timer += 0.01
red_led.value(0)
elif light == 4:
yellow_led.value(1)
while lose == 0 and yellow_button.value() == 0:
if blue_button.value() == 1 or green_button.value() == 1 or red_button.value() == 1 or timer > limit:
lose = 1
time.sleep(0.01)
timer += 0.01
yellow_led.value(0)
while blue_button.value() == 1 or green_button.value() == 1 or red_button.value() == 1 or yellow_button.value() == 1:
time.sleep(0.01)
if lose == 0:
score += 1
if limit > 0.5:
limit -= 0.1
high = load_highscores()
lcd.clear()
lcd.putstr(" Game Over!\nYour score: " + str(score) + "\nHighscore: " + str(high["Whackamole"]) + "\n")
if score > high["Whackamole"]:
lcd.putstr("New highscore!")
high["Whackamole"] = score
save_highscores(high)
else:
lcd.putstr("Maybe next time!")
time.sleep(5)
lcd.clear()
lcd.putstr(" Whackamole\n Press Start\n\nHighscore: " + str(load_highscores()["Whackamole"]))
if menu == 2:
lcd.clear()
lcd.putstr(" How many players?\n\n [1] 2")
choice = False
while not green_button.value() == 1:
if blue_button.value() == 1 or yellow_button.value() == 1:
choice = not choice
lcd.clear()
if choice == False:
lcd.putstr(" How many players?\n\n [1] 2")
else:
lcd.putstr(" How many players?\n\n 1 [2]")
while(blue_button.value() == 1 and yellow_button.value() == 1):
time.sleep(0.1)
if menu == 3:
# Simon
lcd.clear()
sequence = []
lose = 0
while lose == 0:
sequence.append(random.randint(1,4))
lcd.clear()
lcd.putstr(" Watch me!")
for i in sequence:
if i == 1:
blue_led.value(1)
time.sleep(0.25)
blue_led.value(0)
elif i == 2:
green_led.value(1)
time.sleep(0.25)
green_led.value(0)
elif i == 3:
red_led.value(1)
time.sleep(0.25)
red_led.value(0)
else:
yellow_led.value(1)
time.sleep(0.25)
yellow_led.value(0)
time.sleep(0.5)
time.sleep(0.1)
lcd.clear()
lcd.putstr(" Your turn!")
for i in sequence:
if i == 1:
while blue_button.value() == 0 and lose == 0:
if green_button.value() == 1 or red_button.value() == 1 or yellow_button.value() == 1:
lose = 1
if lose == 0:
blue_led.value(1)
time.sleep(0.25)
blue_led.value(0)
elif i == 2:
while green_button.value() == 0 and lose == 0:
if blue_button.value() == 1 or red_button.value() == 1 or yellow_button.value() == 1:
lose = 1
if lose == 0:
green_led.value(1)
time.sleep(0.25)
green_led.value(0)
elif i == 3:
while red_button.value() == 0 and lose == 0:
if blue_button.value() == 1 or green_button.value() == 1 or yellow_button.value() == 1:
lose = 1
if lose == 0:
red_led.value(1)
time.sleep(0.25)
red_led.value(0)
else:
while yellow_button.value() == 0 and lose == 0:
if blue_button.value() == 1 or green_button.value() == 1 or red_button.value() == 1:
lose = 1
if lose == 0:
yellow_led.value(1)
time.sleep(0.25)
yellow_led.value(0)
time.sleep(0.5)
for i in range(10):
blue_led.toggle()
green_led.toggle()
red_led.toggle()
yellow_led.toggle()
time.sleep(0.1)
score = len(sequence) - 1
high = load_highscores()
lcd.clear()
lcd.putstr(" Game over!\nYour score: " + str(score) + "\nHighscore: " + str(high["Simon"]) + "\n")
if score > high["Simon"]:
lcd.putstr("New highscore!")
high["Simon"] = score
save_highscores(high)
else:
lcd.putstr("Maybe next time!")
time.sleep(5)
lcd.clear()
lcd.putstr(" Simon\n Press Start\n\nHighscore: " + str(load_highscores()["Simon"]))
if menu == 4:
# Cube timer
lcd.clear()
hundredthsecond = 0
tenthsecond = 0
second = 0
minute = 0
loop = 0
red_led.value(1)
green_led.value(1)
while blue_button.value() == 0 and yellow_button.value() == 0:
time.sleep(0.1)
red_led.value(0)
green_led.value(0)
time.sleep(0.25)
red_led.value(1)
time.sleep(3)
red_led.value(0)
green_led.value(1)
lcd.clear()
lcd.putstr("start when ready")
while blue_button.value() == 1 and yellow_button.value() == 1:
time.sleep(0.001)
while loop == 0:
if blue_button.value() == 1 and yellow_button.value() == 1:
loop = 1
else:
time.sleep(0.01)
hundredthsecond += 1
if hundredthsecond == 10:
hundredthsecond = 0
tenthsecond += 1
if tenthsecond == 10:
tenthsecond = 0
second += 1
if second == 60:
second = 0
minute += 1
lcd.clear()
green_led.value(0)
time.sleep(0.25)
green_led.value(1)
red_led.value(1)
lcd.putstr("Your time:\n" + str(minute) + "m " + str(second) + "." + str(tenthsecond) + str(hundredthsecond) + "s")
time.sleep(5)
lcd.clear()
red_led.value(0)
green_led.value(0)
lcd.putstr(" Cube Timer\n Press Start")