在骰子游戏中的srand()

时间:2013-11-27 04:30:01

标签: c dice srand

我一直在网站上搜索这个问题的可能答案,虽然它们都很相似,但它们似乎与我的问题完全不同,这就是我被迫打开这个问题的原因。题。所以我需要制作一个骰子游戏,该游戏应该是从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;
}

2 个答案:

答案 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);

完成此操作后,您可能会注意到getcalcgetcalc2不需要是该函数的参数 - 它们只能是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;
}