前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于eos的Dapp开发--元素战争(六)

基于eos的Dapp开发--元素战争(六)

作者头像
用户2569546
发布2021-11-23 10:41:42
2770
发布2021-11-23 10:41:42
举报
文章被收录于专栏:eosfanseosfans

前面的课程中我们谈智能合约,谈前端开发,谈数据存储,谈如何开始游戏如何出牌,还没有谈我们的对手--AI是如何出牌的,我们今天来看看AI出牌策略的制定和执行。

在元素战争游戏中,AI共有四种出牌策略,每局游戏AI将从这四种策略中随机的选择一种,这样就增加了游戏的不可预测性以及可玩性。每个策略都将计算可能的出牌顺序的组合,应用加权机制来确定最后要出哪张牌。我们来看以下四种策略:

  • AI最可能赢策略。
  • AI最不可能输策略。
  • AI积分出牌策略。
  • 阻止AI输策略。

我们接下来一个个来看:

AI最可能赢策略包含有以下要素:

  1. 当AI的伤害值大于玩家的伤害值的时候使用3。
  2. 当AI的伤害值小于玩家的伤害值的时候使用-2。
  3. 当AI的伤害值等于玩家的伤害值的时候使用-1。

其代码实现如下:

代码语言:javascript
复制
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种可能出现的情况:

而在元素战争这个游戏中输的代价很惨重,因此我们还有最不可能输策略,其策略具有以下要素:

  1. 当AI的伤害值大于玩家的伤害值的时候使用1。
  2. 当AI的伤害值小于玩家的伤害值的时候使用-4。
  3. 当AI的伤害值等于玩家的伤害值的时候使用-1。

其代码实现如下:

代码语言:javascript
复制
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卡牌伤害值 + 元素兼容性)。

其代码实现如下:

代码语言:javascript
复制
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的时候这个策略才会被选择,因此该策略包含有以下要素:

  1. AI剩1滴血的时候可以不输掉游戏。
  2. AI剩0滴血的时候输掉游戏。

其代码实现如下:

代码语言:javascript
复制
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手中持有的卡牌的的总分值:

代码语言:javascript
复制
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于马下。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 eosfans 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档