因此我必须编写一个完整的程序,要求用户输入金额并将其存储在变量名称余额中,然后询问用户下注金额。如果金额小于或等于余额,则掷骰子。如果总和为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?");
}
答案 0 :(得分:1)
这里有点不对。
balance
和sum
未初始化为零
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
仔细看看,如果您有任何其他问题我可以帮助您。