我创造了一款Rock Scissor Paper游戏。我已经做到这一点,所以前10场比赛是用计算机响应随机移动(基于0-100落在等分范围内的随机数)。
然而,在第二组10场比赛中,我希望根据球员对前10场比赛的反应加权计算机的响应。 我在下面写了这个,但它适用了100%的重量。
我想仅对该范围应用50%的权重,对于实现此目的最简单的方法有什么想法吗?
这是我编写的一个函数,因此只是代码的一部分
int z;
float range[5];
float player_r, player_s, player_p, games;
player_r = (float)playertotal_R;
player_s = (float)playertotal_S;
player_p = (float)playertotal_P;
games = (float)totalgames;
z = rand() % 101;
range[0] = player_s / games * 101.0;
range[1] = range[0] + 0.1;
range[2] = (range[0]) + (player_p / games * 100.0);
range[3] = range[2] + 0.1;
range[4] = 100.0;
if (z <= range[0]) {
strcpy(compresponse[w], "r");
computertotal_R++;
} else if ((z >= range[1]) && (z <= range[2])) {
strcpy(compresponse[w], "s");
computertotal_S++;
} else if ((z >= range[3]) && (z <= range[4])) {
strcpy(compresponse[w], "p");
computertotal_P++;
}
答案 0 :(得分:2)
对现有代码的一些观察:
由于您的范围是有理数,因此最好不要生成0到99范围内的整数,而是生成0到1之间的随机浮点数(仅限):
z = rand() / (1.0 + RAND_MAX);
如果您有三个结果,则不需要五个限制。足以找到岩石和纸张以及纸和剪刀之间的中间限制。您也不需要检查范围的两侧,因为else
已经处理了下方:
double prob_rock = 1.0 / 3.0;
double prob_paper = 2.0 / 3.0;
if (z < prob_rock) {
// Rock
} else if (z < prob_paper) {
// Paper
} else {
// Scissors
}
至于你想要的分布:
您可以通过分配概率来调整您的范围,以便只有一半的时间考虑玩家之前的动作:
p[move] = 0.5 * p[countermove] + 0.5 * p[regular]
或在上面的示例中:
double prob_rock = 0.5 * npaper / games + 0.5 / 3.0;
double prob_paper = 0.5 * nscissors / games + 1.0 / 3.0;
实现这一目标的另一种可能性是首先投掷硬币(几率为50%),然后使用头上的常规分布以及对玩家统计数据的反对(如代码中所示)。
< / LI>如果到目前为止你保留了一系列玩家的动作,你可以选择一个过去的动作并为其选择正确的对策。