C语言实现明日方舟2024夏活小游戏宝石铭刻最优解计算器

前言

8月1号粥粥夏活开了,笔者玩了一下小游戏,觉得挺有东西的,心血来潮想用C语言写一个最优解计算器,实现这一功能:在所有铭刻工艺都升到满级的前提下,按序输入四种初始宝石的数目后,程序能打印输出能取得最高分的铭刻工艺的排列组合和对应分数。个人水平有限,程序简陋,还望包涵。

在编写代码过程中笔者遇到不少麻烦,主要麻烦有:

  • 许多铭刻工艺的功能描述缺少详细的数据,比如草叶伊纳的相关工艺额外产出的沙伊纳数目未知
  • 铭刻工艺更新宝石数目时,数据向上向下取整的标准不统一
  • 部分铭刻工艺描述与实际功能略有不符,比如天空伊纳的各工艺有平分宝石的机制,但是平分宝石的前提是要平分的两种宝石数目都大于0,否则将不平分宝石也不生成更高级的宝石

程序输出的最优解中“红”代表火焰伊纳工艺,“黄”代表沙伊纳工艺,“蓝”代表天空伊纳工艺,“绿”代表草叶伊纳工艺,罗马数字Ⅰ,Ⅱ,Ⅲ,Ⅳ代表铭刻工艺等级。该最优解计算器有个小缺点是只能计算有6个操作台时的最优解,如果操作台数目小于6个,则需要在源码中更改宏定义#define SIZE 6中的数字6(该数字表示可使用的操作台数目)。值得一提的是,该计算器计算的最优工艺组合几乎都是 [绿Ⅰ] [黄Ⅰ] [黄Ⅱ] [黄Ⅲ] [蓝Ⅱ] [蓝Ⅰ] ,这与前面提到的平分宝石的机制有一定。

总的来说笔者感觉这个小游戏还是挺有趣的,仔细分析能挖出许多原理,但是数值设计的不太合理,铭刻工艺的实际机制与描述不太相符,导致在6个操作台下的最优工艺组合就那一种,缺乏变化,笔者感觉这是一大败笔。话说回来,这数值设计不太合理、实际机制与描述不符的特性好像也是你游的一贯作风,属于是游戏特色了。笔者编写的程序兴许还有诸多漏洞,可优化处也有不少,个人仅将此当作爱好产物留作纪念。

以下是程序源码:

代码部分

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdbool.h>
    #define SIZE 6
    #define MAX_VALUE 11

    void generateOrders(int order[], int index);    //生成全部排列组合
    bool isrepeat(int order[], int index);  //判断同一排列组合中是否有重复工艺
    void maps(int order[]); //对排列组合进行映射分析
    int myceil(double num); //向上取整
    int score_count();  //分数结算
    void bluejudge();   //判断当次排列组合是否只有天空伊纳Ⅲ一种宝石
    void compare_result();  //与目前最优解进行比较,更新最优解
    void initdata();    //重置数据
    void result_print();    //打印输出结果
    void clear_input_buffer();  //清空缓冲区


    //全局变量声明与初始化
    int order[SIZE]={0};    //存储工艺顺序
    int redtemp = 0, yellowtemp = 0, greentemp = 0, bluetemp = 0;//存储当次宝石原材料数目
    int red[5] = {0},yellow = 0, green[4] = {0}, blue[4] = {0};//用数组存储各类宝石数目
    char current_order[100] = "";   //当次工艺顺序
    char best_order[100] = "";  //最优工艺顺序
    int current_score &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值