123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- import pygame
- import argparse
- import time
- from os.path import exists, join, splitext
- import os
- import json
- from pygame.locals import QUIT, KEYDOWN, K_ESCAPE
- from simulation.interface import Interface
- from simulation.board import Board
- from simulation.player import Player
- from simulation.logic.blob_manager import BlobManager
- HIDE_GUI = 0
- WINDOW_GUI = 1
- BORDERLESS_GUI = 2
- FULLSCREEN_GUI = 3
- SCREEN_RESOLUTION = (1920, 1080)
- DEFAULT_DIR = "simulation/default"
- def main():
- parser = argparse.ArgumentParser()
- parser.add_argument('--height', type=int, default=40,
- help='New game board height resolution (default: 40)')
- parser.add_argument('--width', type=int, default=100,
- help='New game board width resolution (default: 100)')
- parser.add_argument('-i', '--input', type=str,
- help='Initialize game from a save. Overwrite height and width parameters. '
- 'Pass the board filename as input (.board extension)')
- parser.add_argument('-s', '--scale', type=int, default=10,
- help='Scales board resolution by this factor (default: x10)')
- parser.add_argument('--save', type=str, default="save/",
- help="Pass the directory where saves are stored. (default: save/)")
- parser.add_argument('--computing_ratio', type=int, default=1,
- help='how many times computing loop is done before drawing GUI')
- parser.add_argument('--auto_loops', type=int, default=-1,
- help='set number of loops needed before saving and closing automatically')
- parser.add_argument('--display', type=int, default=WINDOW_GUI,
- help="Set to '{}' to display as centered window, "
- "'{}' to display as centered window with no border, "
- "'{}' to display as fullscreen, "
- "'{}' to hide display (only if auto_loops is set correctly)"
- .format(WINDOW_GUI, BORDERLESS_GUI, FULLSCREEN_GUI, HIDE_GUI))
- parser.add_argument('--init_foods', type=int, default=0,
- help='Starts the game by initializing a certain quantity of foods in one of the half-board')
- args = parser.parse_args()
- player_file = join(DEFAULT_DIR, "player.json")
- blob_file = join(DEFAULT_DIR, "blob.json")
- gui_file = join(DEFAULT_DIR, "interface.json")
- results = dict()
- if args.input is not None:
- assert exists(args.input)
- root_name = splitext(args.input)[0]
- results['From'] = root_name
- board = Board(args.width, args.height)
- board.load(args.input)
- if exists(root_name + ".player.json"):
- player_file = root_name + ".player.json"
- if exists(root_name + ".blob.json"):
- blob_file = root_name + ".blob.json"
- else:
- board = Board(args.width, args.height)
- blob = BlobManager(board, blob_file)
- player = Player(board, blob, player_file)
- if args.init_foods > 0:
- results['Init_foods'] = player.set_random_food(args.init_foods, not player.clean_top)
- mode = 0
- window_x = int((SCREEN_RESOLUTION[0] - board.width * args.scale) / 2)
- window_y = int((SCREEN_RESOLUTION[1] - board.height * args.scale) / 2)
- os.environ['SDL_VIDEO_WINDOW_POS'] = str(window_x) + "," + str(window_y)
- if args.display == BORDERLESS_GUI:
- mode = mode | pygame.NOFRAME
- elif args.display == FULLSCREEN_GUI:
- mode = mode | pygame.FULLSCREEN
- elif args.display == HIDE_GUI:
- if args.auto_loops <= 0:
- args.display = WINDOW_GUI
- gui = Interface(board, player, blob, args.scale, args.save, mode, args.display == HIDE_GUI, gui_file)
- if args.auto_loops > 0:
- results['Loops'] = args.auto_loops
- gui.play = True
- init_counter = 100
- timer = time.time()
- counter = init_counter
- init_computing_ratio = args.computing_ratio
- ended = False
- while not ended and args.auto_loops != 0:
- computing_ratio = init_computing_ratio
- while computing_ratio > 0 and args.auto_loops != 0:
- if gui.play or gui.do_step:
- blob.move()
- gui.do_step = False
- if args.auto_loops > 0:
- args.auto_loops -= 1
- for event in pygame.event.get():
- if event.type == QUIT or event.type == KEYDOWN and event.key == K_ESCAPE:
- ended = True
- else:
- used = gui.event_listener(event)
- # Quit automatic mode if user had interactions
- if used and args.auto_loops != -1:
- args.auto_loops = -1
- print("User interaction detected ! \n\t --- Automatic mode stopped.")
- computing_ratio -= 1
- if args.display != HIDE_GUI:
- gui.draw()
- pygame.time.wait(10)
- counter -= 1
- if counter == 0:
- timing = time.time() - timer
- print("Loop mean time : {:.3f}s per iteration".format(timing / init_counter))
- counter = init_counter
- timer = time.time()
- if args.auto_loops == 0:
- name = gui.save()
- up_size_percent, down_size_percent = player.check_blob_cover()
- results['Covering'] = dict()
- results['Covering']['Total'] = (up_size_percent + down_size_percent)/2
- results['Covering']['Top'] = up_size_percent
- results['Covering']['Bottom'] = down_size_percent
- results['To'] = args.save + name
- with open(args.save + name + ".results.json", 'w') as file:
- json.dump(results, file, indent=4, sort_keys=True)
- if __name__ == "__main__":
- main()
|