hanna_rechnet.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #!/usr/bin/python3
  2. import subprocess
  3. from os import system
  4. from sys import exit
  5. from math import log10
  6. from time import sleep
  7. from random import choice, shuffle, seed
  8. from readchar import readkey
  9. from datetime import datetime
  10. from inspect import getmembers, isfunction
  11. import logging
  12. logging.basicConfig(level=logging.WARNING)
  13. from . import aufgaben
  14. seed()
  15. videos_filename = "videos.txt"
  16. anzahl_aufgaben = 10
  17. videos = []
  18. def stelle_aufgabe(aufgabe, ergebnis):
  19. logging.debug(f"Aufgabe: {aufgabe}")
  20. logging.debug(f"Ergebnis: {ergebnis}")
  21. print(str(aufgabe))
  22. eingabe = []
  23. for i in range(0, 1 + int(log10(ergebnis))):
  24. eingabe.append(readkey())
  25. if eingabe[-1] == "x" or eingabe[-1] == "q":
  26. print("ENDE")
  27. exit(0)
  28. logging.debug(f"Eingabe: {str(eingabe)}")
  29. wert = 0
  30. potenz = 0
  31. try:
  32. while eingabe:
  33. wert += int(eingabe.pop()) * 10 ** potenz
  34. potenz += 1
  35. except:
  36. logging.warning("Kann Eingabe nicht in Wert wandeln.")
  37. wert = None
  38. logging.debug(f"Eingabewert: {wert}")
  39. return wert == ergebnis
  40. def play_video():
  41. global videos
  42. if len(videos) < 1:
  43. with open(videos_filename, "r") as fh:
  44. videos = fh.readlines()
  45. shuffle(videos)
  46. logging.info(f"{len(videos)} videos geladen")
  47. logging.debug(f"noch {len(videos)} videos vorhanden")
  48. subprocess.run(["mpv", "--fs", videos.pop()])
  49. def frage_weiter():
  50. print("Taste drücken, wenn es weiter gehen kann. Oder 'q' fuer ENDE.")
  51. k = readkey()
  52. if k == "q":
  53. print("ENDE")
  54. exit(0)
  55. def main():
  56. relative_dauer = []
  57. mittel_relative_dauer = 1
  58. aufgaben_vorhanden = []
  59. for i in getmembers(aufgaben, isfunction):
  60. if i[0][0] != "_": # remove _internal functions
  61. aufgaben_vorhanden.append(i)
  62. while True:
  63. system("clear")
  64. aufgabe_name, aufgabe_function = choice(aufgaben_vorhanden)
  65. aufgabe, ergebnis, zeitvorgabe = aufgabe_function()
  66. logging.info(f"{aufgabe_name} mit Zeitvorgabe {zeitvorgabe} Sekunden")
  67. richtige = f"Richtige: {len(relative_dauer)}"
  68. zeit = f"Zeit: {mittel_relative_dauer:.1f}"
  69. if mittel_relative_dauer <= 0.8:
  70. emoji = f"\U0001f603" # :-D
  71. elif mittel_relative_dauer <= 1:
  72. emoji = f"\U0001f642" # :-)
  73. elif mittel_relative_dauer <= 1.2:
  74. emoji = f"\U0001f610" # :-|
  75. else: # > 1.2
  76. emoji = f"\U0001f614" # :-(
  77. print(f"{richtige} {zeit} {emoji}\n")
  78. start = datetime.now()
  79. e = stelle_aufgabe(aufgabe, ergebnis)
  80. ende = datetime.now()
  81. relativ_gebraucht = (ende - start).total_seconds() / zeitvorgabe
  82. if relativ_gebraucht > 2:
  83. relativ_gebraucht = 2
  84. if e:
  85. print("RICHTIG!")
  86. relative_dauer.insert(0, relativ_gebraucht)
  87. relative_dauer = relative_dauer[0:anzahl_aufgaben]
  88. mittel_relative_dauer = sum(relative_dauer)/len(relative_dauer)
  89. sleep(1)
  90. else:
  91. print("FALSCH!\n")
  92. print(f"Richtig wäre {ergebnis}.")
  93. relative_dauer = []
  94. mittel_relative_dauer = 1
  95. sleep(2)
  96. logging.debug(f"Dauer: {str(relative_dauer)}")
  97. logging.info(f"{len(relative_dauer)} Richtige im {mittel_relative_dauer:.2f}-fachen der Zeit.")
  98. if len(relative_dauer) >= anzahl_aufgaben and mittel_relative_dauer <= 1:
  99. print(
  100. f"\n\nJUHU! Für die letzten {anzahl_aufgaben} Aufgaben hast du {mittel_relative_dauer:.2f}-fache der Zeit gebraucht!\n"
  101. )
  102. play_video()
  103. relative_dauer = []
  104. frage_weiter()
  105. if __name__ == "__main__":
  106. main()