Arrows - Code

From RoboWiki
Revision as of 15:14, 9 December 2024 by Robot (talk | contribs) (Created page with "Return back to project page: Python code for the Arrows project: <syntaxhighlight lang=python> from hub import light_matrix import random import time import force_sensor,...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Return back to project page:

Python code for the Arrows project:

<syntaxhighlight lang=python> from hub import light_matrix import random import time import force_sensor, motor


def main():

   actions = {
       "arrow_up": [
           [0, 0, 1, 0, 0],
           [0, 1, 1, 1, 0],
           [1, 0, 1, 0, 1],
           [0, 0, 1, 0, 0],
           [0, 0, 1, 0, 0],
       ],
       "arrow_down": [
           [0, 0, 1, 0, 0],
           [0, 0, 1, 0, 0],
           [1, 0, 1, 0, 1],
           [0, 1, 1, 1, 0],
           [0, 0, 1, 0, 0],
       ],
       "arrow_left": [
           [0, 0, 1, 0, 0],
           [0, 1, 0, 0, 0],
           [1, 1, 1, 1, 1],
           [0, 1, 0, 0, 0],
           [0, 0, 1, 0, 0],
       ],
       "arrow_right": [
           [0, 0, 1, 0, 0],
           [0, 0, 0, 1, 0],
           [1, 1, 1, 1, 1],
           [0, 0, 0, 1, 0],
           [0, 0, 1, 0, 0],
       ],
       "touch_button": [
           [0, 0, 0, 0, 0],
           [0, 1, 1, 1, 0],
           [0, 1, 1, 1, 0],
           [0, 1, 1, 1, 0],
           [0, 0, 0, 0, 0],
       ],
   }


   action_ranges = {
       "arrow_left": ([-20, 20], [-100, -60]),
       "arrow_right": ([-20, 20], [70, 140]),
       "arrow_up": ([70, 140], [-20, 20]),
       "arrow_down": ([-110, -60], [-20, 20]),
   }


   def display_action(matrix):
       light_matrix.clear()
       for y, row in enumerate(matrix):
           for x, value in enumerate(row):
               light_matrix.set_pixel(x, y, 100 * value)


   def detect_action(action_name, remaining_t):
       ranges = action_ranges.get(action_name)
       
       if ranges is None:# Force sensor
           filtered_ranges = [value for value in action_ranges.values()]
           starting_time = time.ticks_ms()
           while time.ticks_ms() - starting_time < remaining_t:
               #Erroneous movement
               position = (motor.absolute_position(1), motor.absolute_position(5))
               for filtered_range in filtered_ranges: 
                   fx_range, fy_range = filtered_range
                   if fx_range[0] <= position[0] <= fx_range[1] and fy_range[0] <= position[1] <= fy_range[1]:
                       print("Erroneous movement")
                       return False
               #Correct action
               if force_sensor.force(2) > 0:
                   print("Acción detectada")
                   return True
               time.sleep(0.1)
       else:# Actions
           
           x_range, y_range = ranges
           filtered_ranges = [value for value in action_ranges.values() if value != ranges]
           starting_time = time.ticks_ms()
           while time.ticks_ms() - starting_time < remaining_t:
               position = (motor.absolute_position(1), motor.absolute_position(5))
               #Erroneous movement
               for filtered_range in filtered_ranges: 
                   fx_range, fy_range = filtered_range
                   if fx_range[0] <= position[0] <= fx_range[1] and fy_range[0] <= position[1] <= fy_range[1]:
                       print("Erroneous movement")
                       return False# End the game
               #Erroneous force sensor
               if force_sensor.force(2) > 0:
                   print("Erroneous force sensor")
                   return False
               #Correct action
               if x_range[0] <= position[0] <= x_range[1] and y_range[0] <= position[1] <= y_range[1]:
                   print("Action detected")
                   return True
               time.sleep(0.1)
       return False
   remaining_time = 5000
   keep_on = True
   score = 0
   while remaining_time > 0:
       action_name = random.choice(list(actions.keys()))
       display_action(actions[action_name])
       keep_on = detect_action(action_name, remaining_time)
       if not keep_on:
           break
       remaining_time *= 0.95
       light_matrix.clear()
       score += 1
       time.sleep(1)
   light_matrix.clear()
   print("Game Over!")
   print("Score: ", score)
   light_matrix.write("Score: " + str(score))


main()