interface.py 5.6 KB

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