diff --git a/AZUL/randomPlayer.py b/AZUL/randomPlayer.py new file mode 100644 index 0000000000000000000000000000000000000000..c10e8e861ad59cb9869f25ac629b7acdb47d85fc --- /dev/null +++ b/AZUL/randomPlayer.py @@ -0,0 +1,99 @@ +import time +from collections import defaultdict + +from model import * +from state_monitor import set_search_time +from utils import * + +class RandomPlayer(Player): + def __init__(self, _id): + super().__init__(_id) + + def SelectMove(self, moves, game_state): + #print(game_state) + start= time.time() + move = self.select_randomMove(game_state) + set_search_time('random', time.time()-start) + return move + + + + def select_randomMove(self, game_state): + player_state = game_state.players[self.id] + tile_type_required = {} + for i in range(player_state.GRID_SIZE): + if player_state.lines_number[i] == i + 1: + continue + if player_state.lines_tile[i] != -1 and player_state.lines_number[i]<i+1: + + if tile_type_required.get(player_state.lines_tile[i]) is not None: + tile_type_required[player_state.lines_tile[i]].add(i) + else: + tile_type_required[player_state.lines_tile[i]] = {i} + + else: + for j in range(5): + if player_state.grid_state[i][j] == 0: + tile_type = int(numpy.where(player_state.grid_scheme[i] == j)[0]) + if tile_type_required.get(tile_type) is not None: + tile_type_required[tile_type].add(i) + else: + tile_type_required[tile_type] = {i} + tile_possess_dict ={} + for fd in game_state.factories: + for t,n in fd.tiles.items(): + if tile_possess_dict.get(t) is not None: + tile_possess_dict[t].append(n) + else: + tile_possess_dict[t] = [n] + for t, n in game_state.centre_pool.tiles.items(): + tile_possess_dict[t].append(n) + + available_tile = [t for t in tile_possess_dict.keys() if t in tile_type_required.keys() and sum(tile_possess_dict[t])>0] + # print(available_tile) + + if len(available_tile)>0: + + + #print('available') + #print(available_tile) + + tile = random.choice(available_tile) + #print('colordict') + #print(tile_possess_dict[tile]) + + #print('fid') + f_id = random.choice([i for i in range(6) if tile_possess_dict[tile][i]>0]) + + + number = tile_possess_dict[tile][f_id] + tg = TileGrab() + tg.number = number + tg.tile_type = tile + tg.pattern_line_dest = random.choice(list(tile_type_required[tile])) + #print('dest') + #print(tg.pattern_line_dest) + slots_free = (tg.pattern_line_dest + 1) - player_state.lines_number[tg.pattern_line_dest] + tg.num_to_pattern_line = min(number, slots_free) + tg.num_to_floor_line = tg.number - tg.num_to_pattern_line + + if f_id == 5: + move=(Move.TAKE_FROM_CENTRE, -1, tg) + else: + move=(Move.TAKE_FROM_FACTORY, f_id, tg) + return move + else: + available_type = [t for t in tile_possess_dict.keys() if sum(tile_possess_dict[t])>0] + tile = random.choice(available_type) + # print(tile_possess_dict[tile]) + f_id = random.choice([i for i in range(6) if tile_possess_dict[tile][i]>0]) + number = tile_possess_dict[tile][f_id] + tg = TileGrab() + tg.number = number + tg.tile_type = tile + tg.num_to_floor_line = tg.number + if f_id == 5: + move= (Move.TAKE_FROM_CENTRE, -1, tg) + else: + move=(Move.TAKE_FROM_FACTORY, f_id, tg) + return move