需要帮助基于投注的C程序骰子游戏

时间:2017-10-11 06:35:35

标签: c

因此我必须编写一个完整的程序,要求用户输入金额并将其存储在变量名称余额中,然后询问用户下注金额。如果金额小于或等于余额,则掷骰子。如果总和为7或11,则玩家赢得三次下注。否则,玩家输掉赌注。 只要他/她有足够的钱,玩家就应该能够下注。

我真的没有从这里做什么(从下面发布的代码),所以请帮我解决。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <ctype.h>

int balance;
int sum;

int Ask_User_for_Bet(int b);
int Dice_Roll(void);
int Win_or_Lose();

int main()
{
    while(balance>0){
        int Ask_User_for_Bet(int b);
        int rollDice();
        int Win_or_Lose();
    }

    return 0;
}


int Ask_User_for_Bet(int b)
{
    printf("Enter bet amount");
    scanf("%d", b);
}

int rollDice(void) {
    sum=((rand() % 12) + 1);
    return ((rand() % 12) + 1);
}

int Win_or_Lose(){
    if(sum==7 || sum==11)
            printf("You won! Play again?");
    else
        printf("You lost! Play again?");



}

4 个答案:

答案 0 :(得分:1)

这里有点不对。

balancesum未初始化为零

int Ask_User_for_Bet(int *b)
{
    printf("Enter bet amount");
    scanf("%d", b);
// Or don't pass b, declare locally, pass &b then return
    }

你在哪里减少余额?

roll_dice不会同时返回两个骰子。此外,rand()每次都会给你相同的序列。

你没有表现出结果!

代码方面还有一些我要改变的事情

即使是单个陈述,也要使用大括号。

摆脱全球变量balance&amp; sum

答案 1 :(得分:1)

下面:

while(balance>0){
    int Ask_User_for_Bet(int b);
    int rollDice();
    int Win_or_Lose();
}

循环体实际上是空的,因为你没有放置任何语句,而是原型声明。例如:

    int Ask_User_for_Bet(int b);

告诉编译器,函数Ask_User_for_Bet需要int并返回int。这与上面进一步做出的相同声明是等效的(并且是多余的)。

您想要调用功能,所以:

while(balance>0){
    Ask_User_for_Bet(balance);
    rollDice();
    Win_or_Lose();
}

呼叫不包含任何类型信息,只是传递了所需的参数。

(请注意,您将sum设置为除rollDice()中的返回值以外的其他值 - 当您只想将其滚动一次时,您将骰子滚动两次。并且滚动十二面模具曾经不是因为滚动两个六面骰子。你还必须检查余额是否可以保持赌注而你必须做到平衡,以便在某些时候,while条件会变为假。)

答案 2 :(得分:0)

在您的代码中存在许多错误之前由其他人发布。我没有指出它们,而是编写了一些示例代码,您可以使用它(我测试它,它可以工作)来解决您的问题。你可以研究它,看看你哪里错了。例如,你的scanf没有正确写入,他们需要一个&amp;运算符,rand每次都会给你相同的序列,它在开始时需要一个种子。以下是在运行rand之前应该如何在main中使用它:

    #include <stdio.h>
#include <stdlib.h>
#include <math.h>


int Ask_User_for_Balance(void);
int Ask_User_for_Bet(int balance_copy);
int rollDice(void);


int main(void){

    int balance=5; //something more than 0 (not necessary as you input the value later)
    int bet=0;
    int sum=0;  //the roll dice result

    //seed for random function
    int seed = time(NULL);
    srand(seed);

// enter balance    
    balance= Ask_User_for_Balance();

// main game loop

    while(balance>0){       
        bet= Ask_User_for_Bet(balance);
        sum= rollDice();
        printf ("dice roll is: %d\n", sum);

        //win or lose implementation
        if (sum==7 || sum==11){
            balance= balance + (bet*3);
             printf("You won! Current balance: %d \n ",balance);
        }
        else{
            balance=balance - bet;
            printf("You lost! Current balance: %d \n ",balance);

        }
    } // close while

    printf("Game Over...\n");

    return 0;
}


int Ask_User_for_Balance(void){

    int balance_temp;
    printf("Enter Balance\n");
    scanf("%d", &balance_temp);

    return balance_temp;

}

int Ask_User_for_Bet(int balance_copy){
    int bet_temp=0;

    //do not let the player bet more than his balance
    do{
        printf("Enter bet amount\n");
        scanf("%d", &bet_temp);
        if(bet_temp>balance_copy){
            printf("Please bet less than your balance\n");
        }
    }while (bet_temp>balance_copy);

    return bet_temp;
}


int rollDice(void) {
    int sum_temp;
    sum_temp=((rand() % 12) + 1);
    return sum_temp;
}

下面是代码

return get(/databases/$(database)/documents/test/$(testId)).id == "SRJKCxU4HVDBdB3qyfzG" || get(/databases/$(database)/documents/test/$(testId)).data.id == "SRJKCxU4HVDBdB3qyfzG"

答案 3 :(得分:0)

您的代码中存在大量逻辑和语法错误。始终使用编译器警告启用进行编译(将-Wall -Wextra添加到gcc编译字符串,或将/W3添加到cl.exe(VS)编译中字符串)。

阅读并修复所有警告。在没有任何警告的情况下,在完全编译之前,切勿接受代码。

通过检查scanf(或任何输入功能)的返回来验证所有用户输入。您可以进一步验证收到的任何输入都在预期值范围内。

订购代码,使您的函数在逻辑上协同工作,并使用函数返回。当它们可以作为参数传递时,不要声明全局变量。

完全放弃,你可以调整你的代码,类似于以下内容:

#include <stdio.h>
#include <stdlib.h>

int get_user_bet (void);
int dice_roll (void);
int win_or_lose (int roll, int bet);

int main (void)
{
    int balance = 0, previous = 0, bet = 0, roll = 0, ch = 0;
    char c = 0;

    printf ("enter opening balance: $");
    if (scanf ("%d", &balance) != 1) {
        fprintf (stderr, "error: invalid input - balance.\n");
        return 1;
    }

    if (balance <= 0) {
        fprintf (stderr, "error: balance 0 or negative.\n");
        return 1;
    }

    while (c != 'n' && c != 'N' && balance > 0) {
        previous = balance;     /* save starting balance as previous */
        bet = get_user_bet();   /* get user bet */

        balance -= bet;         /* subtract from balance (at risk) */
        roll = dice_roll();     /* roll the dice */
        balance += win_or_lose (roll, bet); /* update bal. with win */

        printf ("bal. before: %d  bal. after: %d\n", previous, balance);
        if (balance > previous)
            printf ("\nYou won! Play again? "); /* display win */
        else
            printf ("\nYou lost Play again? "); /* display loss */

        if (scanf (" %c", &c) != 1) {   /* get answer to play again */
            fprintf (stderr, "error: user canceled.\n");
            break;
        }
        /* note you should clear any remaining chars from stdin here */
        for (ch = getchar(); ch != '\n' && ch != EOF; ch = getchar()) {}
    }

    return 0;
}

int get_user_bet()
{
    int b = 0;

    printf ("Enter bet amount: ");
    if (scanf ("%d", &b) != 1)
        return 0;

    return b;
}

int dice_roll (void)
{
    return rand() % 12 + 1;
}

int win_or_lose (int roll, int bet)
{
    printf ("roll was: %d\n", roll);

    if (roll == 7 || roll == 11)
        return bet + 3 * bet;

    return 0;
}

示例使用/输出

$ >bin\diceroll.exe
enter opening balance: $30
Enter bet amount: 10
roll was: 6
bal. before: 30  bal. after: 20

You lost Play again? y
Enter bet amount: 10
roll was: 12
bal. before: 20  bal. after: 10

You lost Play again? y
Enter bet amount: 10
roll was: 11
bal. before: 10  bal. after: 40

You won! Play again? y
Enter bet amount: 10
roll was: 5
bal. before: 40  bal. after: 30

You lost Play again? n

仔细看看,如果您有任何其他问题我可以帮助您。