karel_slider.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. from graphics import Canvas
  2. from karel_asset import * # https://git.h0v1n8.nl/Stanford/karel_asset
  3. from time import sleep
  4. import asyncio
  5. # Constants
  6. CANVAS_WIDTH = 400
  7. CANVAS_HEIGHT = 400
  8. canvas = Canvas(CANVAS_WIDTH, CANVAS_HEIGHT)
  9. """ This causes too much flashing, as the Karels are not drawn in sync, and overlap differently on updates.
  10. async def slide_karel(canvas, delay):
  11. await asyncio.sleep(delay)
  12. karel = generate_outofbounds_random_karel(canvas, "left")
  13. asyncio.sleep(1)
  14. # Slide Karels out of the canvas
  15. if canvas.width < canvas.height:
  16. size = random.randint(1, canvas.width)
  17. else:
  18. size = random.randint(1, canvas.height)
  19. for i in range(int(CANVAS_WIDTH + size * 2.5)):
  20. karel = relative_move_asset(karel, x=+1)
  21. await asyncio.sleep(0.01)
  22. erase_asset(karel)
  23. """
  24. #async def main():
  25. def main():
  26. while True: # Loop forever
  27. background = generate_random_background(canvas)
  28. sleep(0.5)
  29. """ See too much flashing comment above
  30. # Multple simultanious jobs
  31. await asyncio.gather(
  32. slide_karel(canvas, 0),
  33. slide_karel(canvas, 3),
  34. slide_karel(canvas, 7),
  35. slide_karel(canvas, 9),
  36. slide_karel(canvas, 12)
  37. )
  38. sleep(0.5)
  39. """
  40. """ Not random enough, looks a lot better than async Karels.
  41. # Create Karels
  42. karel0 = generate_outofbounds_random_karel(canvas, "left")
  43. karel1 = generate_outofbounds_random_karel(canvas, "left")
  44. karel2 = generate_outofbounds_random_karel(canvas, "left")
  45. karel3 = generate_outofbounds_random_karel(canvas, "left")
  46. karel4 = generate_outofbounds_random_karel(canvas, "left")
  47. # Slide Karels
  48. for i in range(random.randint(1, canvas.width)):
  49. karel0 = relative_move_asset(karel0, x=+random.randint(1, 2))
  50. sleep(0.01)
  51. for i in range(random.randint(1, int(canvas.width / 2))):
  52. karel0 = relative_move_asset(karel0, x=+random.randint(1, 2))
  53. karel1 = relative_move_asset(karel1, x=+2)
  54. sleep(0.01)
  55. for i in range(random.randint(1, int(canvas.width / 3))):
  56. karel0 = relative_move_asset(karel0, x=+random.randint(1, 2))
  57. karel1 = relative_move_asset(karel1, x=+2)
  58. karel2 = relative_move_asset(karel2, x=+random.randint(1, 7))
  59. sleep(0.01)
  60. for i in range(random.randint(1, int(canvas.width / 3))):
  61. karel0 = relative_move_asset(karel0, x=+random.randint(1, 2))
  62. karel1 = relative_move_asset(karel1, x=+2)
  63. karel2 = relative_move_asset(karel2, x=+random.randint(1, 7))
  64. karel3 = relative_move_asset(karel3, x=+3)
  65. sleep(0.01)
  66. for i in range(canvas.width):
  67. karel0 = relative_move_asset(karel0, x=+random.randint(1, 2))
  68. karel1 = relative_move_asset(karel1, x=+2)
  69. karel2 = relative_move_asset(karel2, x=+random.randint(1, 7))
  70. karel3 = relative_move_asset(karel3, x=+3)
  71. karel4 = relative_move_asset(karel4, x=+4)
  72. sleep(0.01)
  73. # Erase Karels
  74. erase_asset(karel0)
  75. erase_asset(karel1)
  76. erase_asset(karel2)
  77. erase_asset(karel3)
  78. erase_asset(karel4)
  79. """
  80. # Set up asset stack
  81. amount = random.randint(3, 10) # Pick random amount of assets
  82. stack = {} # Create stack dictionary
  83. for _ in range(amount): # Create the amount of assets
  84. asset = generate_outofbounds_random_asset(canvas, "left", karel_prevelance=6) # Generate asset
  85. delay = random.randint(0, int(canvas.width * 2)) # Set random delay of a maximum of two canvas widths
  86. speed = random.choice((1, 2, 3)) # Set random speed
  87. name = "karel_" + str(_) # Set dictionary key
  88. stack.update({name: [asset, delay, speed]}) # Append entry to dictionary
  89. # Slide assets
  90. for i in range(canvas.width * 3): # Slide for three canvas widths
  91. for key, value in stack.items(): # Loop over asset dictionary
  92. if value[1] < i: # If delay has passed
  93. asset = relative_move_asset(value[0], x=+value[2]) # Move the Karel
  94. stack.update({key: [asset, value[1], value[2]]}) # Update the dictionary
  95. sleep(0.01) # Wait shortly so the sliding is not CPU speed based
  96. # Erase assets in asset stack
  97. for value in stack.values():
  98. erase_asset(value[0])
  99. # Erase background for in the next loop a new one will be created
  100. canvas.delete(background)
  101. if __name__ == '__main__':
  102. #await (main())
  103. main()