interface.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. import pygame
  2. import random
  3. import time
  4. import datetime
  5. from pygame.locals import *
  6. from board import Board
  7. from blob.main import Blob_Manager
  8. from player import Player
  9. class Interface:
  10. def __init__(self, board, player, blob, scale, save_dir):
  11. """
  12. :type board: Board
  13. :type player: Player
  14. :type blob: Blob_Manager
  15. :type scale: float
  16. :type save_dir: str
  17. """
  18. pygame.init()
  19. # pygame.key.set_repeat(5, 50)
  20. self.board = board
  21. self.player = player
  22. self.blob = blob
  23. self.scale = scale
  24. self.save_dir = save_dir
  25. self.debug_mode = False
  26. self.play = False
  27. self.do_step = False
  28. self.show_ants = True
  29. width = self.board.width * scale
  30. height = self.board.height * scale
  31. self.window = pygame.display.set_mode((width, height))
  32. discovered_food = pygame.image.load("cross.png").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 event_listener(self, event):
  62. # ADMIN ACTIONS
  63. if event.type == KEYDOWN and event.key == 100: # D Letter
  64. self.debug_mode = not self.debug_mode
  65. print("Debug Mode: " + str(self.debug_mode))
  66. elif event.type == KEYDOWN and event.key == K_UP:
  67. Board.DECREASE_BLOB += 0.1
  68. print("Pheromone evaporation : " + str(Board.DECREASE_BLOB))
  69. elif event.type == KEYDOWN and event.key == K_DOWN:
  70. Board.DECREASE_BLOB -= 0.1
  71. print("Pheromone evaporation : " + str(Board.DECREASE_BLOB))
  72. elif event.type == KEYDOWN and event.key == K_SPACE:
  73. self.show_ants = not self.show_ants
  74. elif event.type == KEYDOWN and event.key == 115: # S Letter
  75. ts = datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d_%H.%M.%S')
  76. print("Data saved at " + ts)
  77. f = open(self.save_dir + ts + ".board", 'w')
  78. f.write(self.board.save())
  79. f.close()
  80. f = open(self.save_dir + ts + ".blob", 'w')
  81. f.write(self.blob.save())
  82. f.close()
  83. f = open(self.save_dir + ts + ".player", 'w')
  84. f.write(self.player.save())
  85. f.close()
  86. pygame.image.save(self.window, self.save_dir + ts + ".jpg")
  87. # DEBUG ACTIONS
  88. elif self.debug_mode and event.type == MOUSEBUTTONDOWN and event.button == 1: # Right Click
  89. x = int(pygame.mouse.get_pos()[0] / self.scale)
  90. y = int(pygame.mouse.get_pos()[1] / self.scale)
  91. self.board.update_blob(x, y, 10)
  92. # PLAYER ACTIONS
  93. elif event.type == MOUSEBUTTONDOWN and event.button == 1: # Right Click
  94. x = int(pygame.mouse.get_pos()[0]/self.scale)
  95. y = int(pygame.mouse.get_pos()[1]/self.scale)
  96. self.player.set_food(x, y)
  97. elif event.type == KEYDOWN and event.key == 110: # N Letter
  98. self.player.clean_board()
  99. elif event.type == KEYDOWN and event.key == 114: # R Letter
  100. self.player.set_random_food(10, not self.player.clean_top)
  101. elif event.type == KEYDOWN and event.key == 104: # H Letter
  102. size_percent = self.player.check_blob_size()
  103. print("Current blob size percent: " + str(size_percent))
  104. # BLOB ACTIONS
  105. elif event.type == KEYDOWN and event.key == 112: # P Letter
  106. self.play = not self.play
  107. elif event.type == KEYDOWN and event.key == K_RETURN:
  108. self.do_step = True
  109. elif event.type == KEYDOWN and event.key == 107: # K Letter
  110. nbr = random.randrange(len(self.blob.scouters))
  111. self.blob.knowledge['max_scouters'] -= 1
  112. del self.blob.scouters[nbr]
  113. print("Scouter killed ! - Total : " + str(len(self.blob.scouters)))
  114. elif event.type == KEYDOWN and event.key == 113: # A letter
  115. self.blob.knowledge['max_scouters'] += 1
  116. self.blob.add_scouter()
  117. print("New scouter ! - Total : " + str(len(self.blob.scouters)))
  118. elif event.type == KEYDOWN:
  119. print("Unrecognised key code : " + str(event.key))