我一直在网站上搜索这个问题的可能答案,虽然它们都很相似,但它们似乎与我的问题完全不同,这就是我被迫打开这个问题的原因。题。所以我需要制作一个骰子游戏,该游戏应该是从2个掷骰子的2个骰子,并且用户应该猜测这个数字是多少。如果猜测的值不是2个骰子的实际值,程序则输出骰子的值并重新进行重新剔除。如果是,则程序停止滚动模具并告诉您模具达到猜测值所需的卷数。
出于某种原因,我的程序不停地滚动骰子而不停止,我不确定为什么。我尝试在一个单独的程序中测试它,并且更加困惑的是为什么我仍然无法获得不同的值,即使srand()在main的开头只被调用一次。(我意识到,在其他一些问题中函数throwCalc1和不必要的throwCalc2有什么问题。如果我尝试将rand()放在变量之外,我得到不同的值,但如果我把它放在一个变量中,值保持不变。我已经尝试使变量成为一个函数,它仍然不起作用,因为编译器给我一个错误说“初始化从没有强制转换的整数生成指针”
test function:
int main(void)
{
srand(time(NULL));
int i;
int *throwCalc = rand() % 6 + 1;
for(i = 0; i < 6; i++) {
printf("value is: %d\n", *throwCalc);
}
return 0;
}
原创节目:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define _CRT_SECURE_NO_WARNINGS
#define MIN 2
#define MAX 12
int getInt(int min, int max) {
int retry = 1;
int value;
char after;
int cc;
do {
printf("Enter total sought \n"
"Range must be within [%d - %d]", min, max);
cc = scanf("%d%c", &value, &after);
if(cc == 0) {
printf("bad char or 0 input, please re-enter input");
clear();
} else if (after != '\n') {
printf("Error:Trailing characters, please re-ente input");
clear();
} else if (value < min || value > max) {
printf("Error: value outside of range, please re-enter input");
clear();
} else {
retry = 0;
}
} while(retry == 1);
return value;
}
void clear() {
while (getchar() != '\n') {
; //intentional empty statement
}
}
int throwCalc1() {
int a = 1, b = 6, n;
srand(time(NULL));
n = a + rand() % (b + 1 - a);
return n;
}
int throwCalc2() {
int a = 1, b = 6, n;
srand(time(NULL));
n = a + rand() % (b + 1 - a);
return n;
}
int throwResult(int input, int getcalc1, int getcalc2) {
int i = 0;
do {
throwCalc1();
throwCalc2();
printf("Result of throw %d : %d + %d", i, getcalc1, getcalc2);
i++;
} while(input != getcalc1 + getcalc2);
printf("You got your total in %d throws!\n", i);
return 0;
}
int main(void)
{
int input = getInt(MIN, MAX);
int getCalc1 = throwCalc1();
int getCalc2 = throwCalc2();
printf("Game of Dice\n");
printf("============\n");
printf("hi number is: %d", input);
throwResult(input, getCalc1, getCalc2);
return 0;
}
答案 0 :(得分:2)
你在main的顶部执行一次:
int getCalc1 = throwCalc1();
int getCalc2 = throwCalc2();
然后期望通过调用throwCalc1()&amp;更新值来更新。再次2。
除了修复srand()之外,还有throwCalc1&amp; 2将值返回到局部变量而不是传递内容。
答案 1 :(得分:1)
现在您在循环中调用throwCalc1()
和throwCalc2()
,但丢弃结果。您需要将这些结果保存在一对变量中:
do {
getcalc1 = throwCalc1();
getcalc2 = throwCalc2();
printf("Result of throw %d : %d + %d", i, getcalc1, getcalc2);
i++;
} while(input != getcalc1 + getcalc2);
完成此操作后,您可能会注意到getcalc
和getcalc2
不需要是该函数的参数 - 它们只能是throwResult()
中的局部变量。< / p>
此外,您的throwCalc1()
和throwCalc2()
功能相同,因此您可以删除其中的一个,然后只拨打剩余的两次。
您的测试功能应如下所示:
int main(void)
{
srand(time(NULL));
int i;
int throwCalc;
for(i = 0; i < 6; i++) {
throwCalc = rand() % 6 + 1;
printf("value is: %d\n", throwCalc);
}
return 0;
}