【c++】关于游戏中宝石合成规律的算法实现问题

weixin_42798042 2018-08-11 01:34:41
rt,
初学者在实践过程中遇到一个自己模拟了一个问题,在网上没有找到合适的答案,所以在这里求解:

算法要求:根据某游戏宝石合成规律(如下),得出各个方案的需求总体宝石数量。

*合成规律:宝石从低到高分为1~6级,
10个1级合成1个2级成功率为100%,9个1级合成1个2级成功率为90%....2个1级合成1个2级成功率为20%。
合成成功时,得到一个2级宝石,合成失败时,保留1个1级宝石;
10个2级合成1个3级成功率为100%,9个2级合成1个3级成功率为90%....2个2级合成1个3级成功率为20%。
合成成功时,得到一个3级宝石,合成失败时,保留1个2级宝石;
合成4~6级以此类推。

*方案1:每次强化使用8颗宝石(如8颗1级升2级,用8颗2级升3级。。。以此类推)。
*方案2:每次强化使用9颗宝石(规律同上)

关于这个问题,我先试着用递归算法(按1到6级写了5层递归),但是感觉循环控制不知道怎么写,而且开销很大;除此之外没有想到好的体现成功率的算法。
求问大神这个算法要怎么实现以及用什么语句?最好能贴一些代码。或者如果有类似已解答的问题还请告知,谢谢!
...全文
640 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
donjin9 2018-08-15
  • 打赏
  • 举报
回复
成功率和数量一致,失败还保留一个。感觉用成功率越低的越划算啊。
smwhotjay 2018-08-15
  • 打赏
  • 举报
回复
2012年搞网游,分析过游戏宝石合成代码。无非if switch 随机数rand <几率 等等
赵4老师 2018-08-11
  • 打赏
  • 举报
回复
//根据某游戏宝石合成规律(如下),得出各个方案的需求总体宝石数量。
//
//*合成规律:宝石从低到高分为1~6级,
//10个1级合成1个2级成功率为100%,9个1级合成1个2级成功率为90%....2个1级合成1个2级成功率为20%。
//合成成功时,得到一个2级宝石,合成失败时,保留1个1级宝石;
//10个2级合成1个3级成功率为100%,9个2级合成1个3级成功率为90%....2个2级合成1个3级成功率为20%。
//合成成功时,得到一个3级宝石,合成失败时,保留1个2级宝石;
//合成4~6级以此类推。
//
//*方案1:每次强化使用8颗宝石(如8颗1级升2级,用8颗2级升3级。。。以此类推)。
//*方案2:每次强化使用9颗宝石(规律同上)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define S 8 //每次强化使用8颗宝石
int m[6+1];//各级宝石数量
int y[6+1];//各级宝石合成成功次数
int n[6+1];//各级宝石合成失败次数
int syn(int lv,int num) {//合成lv级num个
int i;

if (num<=0) return 1;
if (num==1) {
if (lv==2) {
if (rand()%10<S) {//成功
m[1]-=S;
m[2]+=1;
y[2]++;
return 1;
} else {//失败
m[1]+=1;
n[2]++;
return 0;
}
} else {//lv>1
while (1) {
if (syn(lv-1,S-m[lv-1])) break;//合成lv-1级宝石S-m[lv-1]个直到成功
}
if (rand()%10<S) {//成功
m[lv-1]-=S;
m[lv ]+=1;
y[lv ]++;
return 1;
} else {//失败
m[lv-1]+=1;
n[lv ]++;
return 0;
}
}
} else {//num>1
for (i=0;i<num-m[lv];i++) {
while (1) {
if (syn(lv,1)) break;//合成lv级宝石1个直到成功
}
}
return 1;
}
}
int main() {
int L;

srand(time(NULL));
for (L=1;L<=6;L++) {m[L]=0;y[L]=0;n[L]=0;}
while (1) {
if (syn(6,1)) break;//合成6级宝石1个直到成功
}
for (L=1;L<=6;L++) printf("L m,y,n:%d %d %d %d\n",L,m[L],y[L],n[L]);
return 0;
}
//L m,y,n:1 -13111 0 0
//L m,y,n:2 -4 1693 433
//L m,y,n:3 -2 218 47
//L m,y,n:4 -3 28 4
//L m,y,n:5 -4 4 1
//L m,y,n:6 1 1 0

赵4老师 2018-08-11
  • 打赏
  • 举报
回复
16:int m[S+1];//各级宝石数量
应改为
16:int m[6+1];//各级宝石数量
赵4老师 2018-08-11
  • 打赏
  • 举报
回复
不一定对,也没实际编译链接调试,仅供参考:
//根据某游戏宝石合成规律(如下),得出各个方案的需求总体宝石数量。
//
//*合成规律:宝石从低到高分为1~6级,
//10个1级合成1个2级成功率为100%,9个1级合成1个2级成功率为90%....2个1级合成1个2级成功率为20%。
//合成成功时,得到一个2级宝石,合成失败时,保留1个1级宝石;
//10个2级合成1个3级成功率为100%,9个2级合成1个3级成功率为90%....2个2级合成1个3级成功率为20%。
//合成成功时,得到一个3级宝石,合成失败时,保留1个2级宝石;
//合成4~6级以此类推。
//
//*方案1:每次强化使用8颗宝石(如8颗1级升2级,用8颗2级升3级。。。以此类推)。
//*方案2:每次强化使用9颗宝石(规律同上)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define S 8 //每次强化使用8颗宝石
int m[S+1];//各级宝石数量
int syn(int lv,int num) {//合成lv级num个
int i;

if (num<=0) return 1;
if (num==1) {
if (lv==1) {
if (rand()%10<S) {//成功
m[1]-=S;
m[2]+=1;
return 1;
} else {//失败
m[1]+=1;
return 0;
}
} else {//lv>1
while (1) {
if (syn(lv-1,S-m[lv-1])) break;//合成lv-1级宝石S-m[lv-1]个直到成功
}
if (rand()%10<S) {//成功
m[lv-1]-=S;
m[lv ]+=1;
return 1;
} else {//失败
m[lv-1]+=1;
return 0;
}
}
} else {//num>1
for (i=0;i<num-m[lv];i++) {
while (1) {
if (syn(lv,1)) break;//合成lv级宝石1个直到成功
}
}
}
}
int main() {
int L;

srand(time(NULL));
for (L=1;L<=6;L++) m[L]=0;
while (1) {
if (syn(6,1)) break;//合成6级宝石1个直到成功
}
for (L=1;L<=6;L++) printf("m[%d]:%d ",L,m[L]);
return 0;
}

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧