前言
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 &