Example #1
0
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
Example #2
0
 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)
Example #3
0
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
Example #4
0
 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
Example #5
0
 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
Example #6
0
 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
Example #7
0
 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
Example #8
0
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
Example #9
0
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