def alpha_beta(board, depth, player, alpha, beta, maxim): if depth == 0 or utils.lastMove(board, player): return utils.score(board, player), -1 valid = utils.get_moves(board, player) if maxim: v = -99999 for move in valid: (tmp_board, tot) = utils.move(move % 8, int(move / 8), player, copy.deepcopy(board)) v = max( alpha_beta(tmp_board, depth - 1, utils.opponent(player), alpha, beta, False)[0], v) alpha = max(alpha, v) if beta <= alpha: break return v, move else: # minimizingPlayer v = 99999 for move in valid: (tmp_board, tot) = utils.move(move % 8, int(move / 8), player, copy.deepcopy(board)) v = min( alpha_beta(tmp_board, depth - 1, utils.opponent(player), alpha, beta, True)[0], v) beta = min(beta, v) if beta <= alpha: break return v, move
def update_and_render(self, user_action='ok'): # Получение данных: self.data_from_server = self.get_data_from_server(user_action) if self.data_from_server != 'Waiting for players': # Распаковка данных: mobs_data, towers_data, bullets_data, sounds_data = self.data_from_server[: 4] p1_main_tower_health = self.data_from_server[4] p2_main_tower_health = self.data_from_server[5] p1_cache = self.data_from_server[6] p2_cache = self.data_from_server[7] # Установка полученных значений: self.main_towers_hp[PLAYER_1] = p1_main_tower_health self.main_towers_hp[PLAYER_2] = p2_main_tower_health self.currency = p1_cache if self.player_index == PLAYER_1 else p2_cache # Если противник поставил башню, то нужно удалить соответствующий плент: free_plants = [plant for plant in self.plants if plant.free] if len(towers_data) != self.total_plants - len(free_plants): towers_positions = [ tower_data[1] for tower_data in towers_data ] for plant in self.plants: for x, y in towers_positions: if plant.free and abs(plant.rect.x - x) <= 20 and abs( plant.rect.y - y) <= 100: plant.free = False plant.image = load_image( os.path.join('sprites', 'nothing.png')) # Отрисовка полученных объектов: self.screen.fill('black') self.screen.blit(MULTIPLAYER_MAP_IMAGE, (0, 0)) self.render_main_towers() for mob_data in mobs_data: self.draw_mob(*mob_data) for tower_data in towers_data: self.draw_tower(*tower_data) for bullet_data in bullets_data: self.draw_bullet(*bullet_data) self.plants.draw(self.screen) self.add_tower_menus.draw(self.screen) for add_tower_menu in self.add_tower_menus: add_tower_menu.draw_buttons(self.screen) self.render_currency() self.spawn_mob_menu.draw(self.screen) self.pause.render() for sound in sounds_data: SOUNDS[sound].play() # Проверка на выигрыш/проигрыш: if self.main_towers_hp[self.player_index] <= 0: raise Lose elif self.main_towers_hp[opponent(self.player_index)] <= 0: raise Win else: self.screen.blit(WAITING_PLAYERS_SCREEN, (0, 0)) self.buttons.draw(self.screen)
def min_max(board, depth, player, maxim): if depth == 0 or utils.lastMove(board, player): return utils.score(board, player) valid = utils.get_moves(board, player) if maxim: bestValue = -99999 for move in valid: (tmp_board, tot) = utils.move(move, player, copy.deepcopy(board)) v = min_max(tmp_board, depth - 1, utils.opponent(player), False) bestValue = max(bestValue, v) # print(np.array(tmp_board).reshape((8,8))) return bestValue else: # minimizingPlayer bestValue = 99999 for move in valid: (tmp_board, tot) = utils.move(move, player, copy.deepcopy(board)) v = min_max(tmp_board, depth - 1, utils.opponent(player), True) bestValue = min(bestValue, v) # print(np.array(tmp_board).reshape((8,8))) return bestValue
def update(self): if not self.reloading: for mob in self.mobs[opponent(self.player)]: if mob.state != 'death': distance = calculate_distance_between_points(*self.coords, *mob.coords) if distance <= self.shooting_range: self.bullets.append(Bullet(self.coords, self.damage, 'arrow', 600, mob, distance)) self.game_sounds_query.append('bow_shot') self.reloading = self.time_to_reload return else: self.reloading -= 1
def update(self): if not self.reloading: for mob in self.mobs[opponent(self.player)]: if mob.state != 'death': distance = calculate_distance_between_points(*self.coords, *mob.coords) if distance <= self.shooting_range: self.bullets.append(HomingBullet(self.coords, self.damage, 'sphere', 300, mob)) self.game_sounds_query.append('crystal_shot') self.reloading = self.time_to_reload return else: self.reloading -= 1 self.animation_index = (self.animation_index + 0.3) % self.animation_length
def update(self): if not self.reloading: for mob in self.mobs[opponent(self.player)]: if mob.state != 'death': distance = calculate_distance_between_points(*self.coords, *mob.coords) if distance <= self.shooting_range: bullet = Bullet(self.coords, self.damage, 'shell', 1200, mob, distance) self.bullets.append(bullet) self.game_sounds_query.append('cannon_shot') self.animation_index = round(bullet.angle / (math.pi / 8)) % self.animation_length self.reloading = self.time_to_reload return else: self.reloading -= 1
def handle_player_action(self, player, action, data): if action == 'spawn_mob': mob_type = data[0] road_index = int(data[1]) coords = tuple(map(int, data[2].split(';'))) mob = Mob(player, mob_type, road_index, coords, self.main_towers[opponent(player)], self.sounds_query) if self.players_cache[player] >= mob.cost: if (player == PLAYER_1 and coords[0] < WIDTH / 4) or (player == PLAYER_2 and coords[0] > WIDTH / 4 * 3): self.mobs[player].append(mob) self.players_cache[player] -= mob.cost elif action == 'spawn_tower': tower_type = data[0] coords = tuple(map(int, data[1].split(';'))) tower = {'bow': BowTower, 'cannon': CannonTower, 'crystal': CrystalTower}[tower_type] towers = self.towers[player] for i in range(len(towers)): if calculate_distance_between_points(*coords, *towers[i].get_coords()) <= 142: if towers[i].cost < tower.cost: towers[i] = tower(player, coords, self.mobs, self.bullets, self.sounds_query) else: break else: towers.append(tower(player, coords, self.mobs, self.bullets, self.sounds_query)) self.players_cache[player] -= tower.cost
def nightblade(game, trigger, id): if trigger[0] == 'battlecry' and trigger[1] == id: game.add_event(events.deal_damage, (utils.opponent(game, game.minion_pool[id].owner).board[0].minion_id, 3)) return True
def leper_gnome(game, trigger, id): if trigger[0] == 'kill_minion' and trigger[1] == id: game.add_event(deal_damage, (utils.opponent(game, game.minion_pool[id].owner).board[0].minion_id, 2)) return True