前面的课程中我们谈智能合约,谈前端开发,谈数据存储,谈如何开始游戏如何出牌,还没有谈我们的对手--AI是如何出牌的,我们今天来看看AI出牌策略的制定和执行。
在元素战争游戏中,AI共有四种出牌策略,每局游戏AI将从这四种策略中随机的选择一种,这样就增加了游戏的不可预测性以及可玩性。每个策略都将计算可能的出牌顺序的组合,应用加权机制来确定最后要出哪张牌。我们来看以下四种策略:
我们接下来一个个来看:
AI最可能赢策略包含有以下要素:
其代码实现如下:
int cardgame::ai_best_card_win_strategy(const int ai_attack_point, const int player_attack_point) {
eosio::print("Best Card Wins");
if (ai_attack_point > player_attack_point) return 3;
if (ai_attack_point < player_attack_point) return -2;
return -1;
}
下面图片显示了16种可能出现的情况:
而在元素战争这个游戏中输的代价很惨重,因此我们还有最不可能输策略,其策略具有以下要素:
其代码实现如下:
int cardgame::ai_min_loss_strategy(const int ai_attack_point, const int player_attack_point) {
eosio::print("Minimum Losses");
if (ai_attack_point > player_attack_point) return 1;
if (ai_attack_point < player_attack_point) return -4;
return -1;
}
下面图片显示了16种可能出现的情况:
而第三种AI积分策略则强调可以对玩家造成最大的伤害值,该策略包含有以下要素:
(玩家卡牌伤害值 + 元素兼容性)- (AI卡牌伤害值 + 元素兼容性)。
其代码实现如下:
int cardgame::ai_points_tally_strategy(const int ai_attack_point, const int player_attack_point) {
eosio::print("Points Tally");
return ai_attack_point - player_attack_point;
}
下面图片显示了16种可能出现的情况:
而阻止AI输掉游戏的策略则最大限度的强调从该游戏中生存下来,因此这个策略并不适合于所有的血量值的AI,只有当AI玩家的血量值小于或者等于2的时候这个策略才会被选择,因此该策略包含有以下要素:
其代码实现如下:
int cardgame::ai_loss_prevention_strategy(const int8_t life_ai, const int ai_attack_point, const int player_attack_point) {
eosio::print("Loss Prevention");
if (life_ai + ai_attack_point - player_attack_point > 0) return 1;
return 0;
}
下面图片显示了16种可能出现的情况:
说完了AI出牌的四种策略,我们来看AI出牌是如何选择策略的,他同样使用了我们上一节内容中说到的随机数的生成方法,但是如上面所说当血量小于等于2的时候将不会选择第四种策略。一旦AI的策略选定,我们将会使用calculate_ai_card_score计算玩家和AI手中持有的卡牌的的总分值:
int cardgame::calculate_ai_card_score(const int strategy_idx,
const int8_t life_ai,
const card& ai_card,
const vector<uint8_t> hand_player) {
int card_score = 0;
for (int i = 0; i < hand_player.size(); i++) {
const auto player_card_id = hand_player[i];
const auto player_card = card_dict.at(player_card_id);
int ai_attack_point = calculate_attack_point(ai_card, player_card);
int player_attack_point = calculate_attack_point(player_card, ai_card);
// Accumulate the card score based on the given strategy
switch (strategy_idx) {
case 0: {
card_score += ai_best_card_win_strategy(ai_attack_point, player_attack_point);
break;
}
case 1: {
card_score += ai_min_loss_strategy(ai_attack_point, player_attack_point);
break;
}
case 2: {
card_score += ai_points_tally_strategy(ai_attack_point, player_attack_point);
break;
}
default: {
card_score += ai_loss_prevention_strategy(life_ai, ai_attack_point, player_attack_point);
break;
}
}
}
return card_score;
}
到这里我们就完成了AI选择出牌策略的介绍。
本文介绍了我们的对手--AI选择出牌的四种策略以及如何选择出牌,对于不熟悉游戏规则的玩家也可以来参考下,看看如何机智的斩AI于马下。