interface.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. import pygame
  2. import time
  3. import datetime
  4. import os.path
  5. from pygame.locals import *
  6. from simulation.board import Board
  7. class Interface:
  8. FOOD_COLOR = (244, 210, 128) # (0, 150, 0)
  9. TOUCHED_COLOR = (218, 196, 136) # (50, 50, 0)
  10. BLOB_LOWER_COLOR = (206, 182, 86) # (255, 255, 0)
  11. BLOB_HIGHER_COLOR = (162, 106, 59) # (255, 0, 0)
  12. BACKGROUND = (120, 120, 120)
  13. def __init__(self, board, player, blob, scale, save_dir):
  14. """
  15. :type board: Board
  16. :type player: Player
  17. :type blob: Blob_Manager
  18. :type scale: float
  19. :type save_dir: str
  20. """
  21. pygame.init()
  22. # pygame.key.set_repeat(5, 50)
  23. self.board = board
  24. self.player = player
  25. self.blob = blob
  26. self.scale = scale
  27. self.save_dir = save_dir
  28. self.debug_mode = False
  29. self.play = False
  30. self.do_step = False
  31. self.show_ants = True
  32. width = self.board.width * scale
  33. height = self.board.height * scale
  34. self.window = pygame.display.set_mode((width, height))
  35. cross_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), "cross.png")
  36. discovered_food = pygame.image.load(cross_file).convert()
  37. discovered_food.set_colorkey((255, 255, 255))
  38. self.discovered_food = pygame.transform.scale(discovered_food, (scale, scale))
  39. def draw(self):
  40. width = self.board.width * self.scale
  41. height = self.board.height * self.scale
  42. game_surface = pygame.Surface((self.board.width, self.board.height))
  43. pixel_array = pygame.PixelArray(game_surface)
  44. for x in range(self.board.width):
  45. for y in range(self.board.height):
  46. pixel_array[x, y] = Interface.BACKGROUND
  47. if self.board.has_food(x, y):
  48. pixel_array[x, y] = Interface.FOOD_COLOR
  49. if self.board.is_touched(x, y):
  50. pixel_array[x, y] = Interface.TOUCHED_COLOR
  51. val = self.board.get_blob(x, y)
  52. if val != Board.MIN_BLOB:
  53. val = (val - Board.MIN_BLOB) / (Board.MAX_BLOB - Board.MIN_BLOB)
  54. red = (Interface.BLOB_HIGHER_COLOR[0] - Interface.BLOB_LOWER_COLOR[0]) * val + \
  55. Interface.BLOB_LOWER_COLOR[0]
  56. green = (Interface.BLOB_HIGHER_COLOR[1] - Interface.BLOB_LOWER_COLOR[1]) * val + \
  57. Interface.BLOB_LOWER_COLOR[1]
  58. blue = (Interface.BLOB_HIGHER_COLOR[2] - Interface.BLOB_LOWER_COLOR[2]) * val + \
  59. Interface.BLOB_LOWER_COLOR[2]
  60. pixel_array[x, y] = (red, green, blue)
  61. if self.show_ants:
  62. for scouter in self.blob.scouters:
  63. pixel_array[scouter.x, scouter.y] = (255, 255, 255)
  64. del pixel_array
  65. game_window = pygame.transform.scale(game_surface, (width, height))
  66. pygame.draw.line(game_window, (125, 125, 125), (0, height / 2), (width, height / 2))
  67. self.window.blit(game_window, (0, 0))
  68. for food in self.blob.knowledge['food']:
  69. self.window.blit(self.discovered_food, (food[0] * self.scale, food[1] * self.scale))
  70. pygame.display.flip()
  71. def save(self):
  72. ts = datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d_%H.%M.%S')
  73. print("Data saved at " + ts)
  74. f = open(self.save_dir + ts + ".board", 'w')
  75. f.write(self.board.save())
  76. f.close()
  77. f = open(self.save_dir + ts + ".blob.json", 'w')
  78. f.write(self.blob.save())
  79. f.close()
  80. f = open(self.save_dir + ts + ".player.json", 'w')
  81. f.write(self.player.save())
  82. f.close()
  83. pygame.image.save(self.window, self.save_dir + ts + ".jpg")
  84. def event_listener(self, event):
  85. # ADMIN ACTIONS
  86. if event.type == KEYDOWN and event.key == 100: # D Letter
  87. self.debug_mode = not self.debug_mode
  88. print("Debug Mode: " + str(self.debug_mode))
  89. elif event.type == KEYDOWN and event.key == K_UP:
  90. Board.DECREASE_BLOB += 0.1
  91. print("Pheromone evaporation : " + str(Board.DECREASE_BLOB))
  92. elif event.type == KEYDOWN and event.key == K_DOWN:
  93. Board.DECREASE_BLOB -= 0.1
  94. print("Pheromone evaporation : " + str(Board.DECREASE_BLOB))
  95. elif event.type == KEYDOWN and event.key == K_SPACE:
  96. self.show_ants = not self.show_ants
  97. elif event.type == KEYDOWN and event.key == 115: # S Letter
  98. self.save()
  99. # DEBUG ACTIONS
  100. elif self.debug_mode and event.type == MOUSEBUTTONDOWN and event.button == 1: # Right Click
  101. x = int(pygame.mouse.get_pos()[0] / self.scale)
  102. y = int(pygame.mouse.get_pos()[1] / self.scale)
  103. self.board.update_blob(x, y, 10)
  104. # PLAYER ACTIONS
  105. elif event.type == MOUSEBUTTONDOWN and event.button == 1: # Right Click
  106. x = int(pygame.mouse.get_pos()[0]/self.scale)
  107. y = int(pygame.mouse.get_pos()[1]/self.scale)
  108. if self.board.has_food(x, y):
  109. self.player.remove_food(x, y)
  110. else:
  111. self.player.set_food(x, y)
  112. elif event.type == KEYDOWN and event.key == 99: # C Letter
  113. self.player.clean_board()
  114. elif event.type == KEYDOWN and event.key == 114: # R Letter
  115. self.player.set_random_food(10, not self.player.clean_top)
  116. elif event.type == KEYDOWN and event.key == 104: # H Letter
  117. up_size_percent, down_size_percent = self.player.check_blob_cover()
  118. print("Blob covering:")
  119. print("\t{:.2f}% of the board.".format((up_size_percent + down_size_percent)/2))
  120. print("\t{:.2f}% of the upper board.".format(up_size_percent))
  121. print("\t{:.2f}% of the lower board.".format(down_size_percent))
  122. # BLOB ACTIONS
  123. elif event.type == KEYDOWN and event.key == 112: # P Letter
  124. self.play = not self.play
  125. elif event.type == KEYDOWN and event.key == K_RETURN:
  126. self.do_step = True
  127. elif event.type == KEYDOWN and event.key == 107: # K Letter
  128. if self.blob.knowledge['min_scouters'] > 0:
  129. self.blob.knowledge['min_scouters'] -= 1
  130. print("New minimal scouters : " + str(self.blob.knowledge['min_scouters']) + " - Currently : " + str(len(self.blob.scouters)))
  131. elif event.type == KEYDOWN and event.key == 113: # A letter
  132. self.blob.knowledge['min_scouters'] += 1
  133. print("New minimal scouters : " + str(self.blob.knowledge['min_scouters']) + " - Currently : " + str(len(self.blob.scouters)))
  134. elif event.type == KEYDOWN:
  135. print("Unrecognised key code : " + str(event.key))