【发布时间】:2018-10-08 05:40:07
【问题描述】:
我正在为一个任务制作游戏,其中有 2 名玩家,每回合玩家掷 2 颗骰子。当我问玩家是否想再次滚动时,一切都从那里向南。我很困惑,因为即使我将rollAgain 字符更改为'n',它仍然会在我希望它运行的地方播放我的循环,仅当rollAgain 是'y' 或'Y' 时。这是我用 C 编写的第一个程序,我以前只用 Java 编写过。我觉得我一定是在我的 while 循环中错误地检查了逻辑运算符,但我知道我做错了什么,我现在已经多次查看所有代码。
这是我的代码:
#include <stdio.h>
#include <stdlib.h> // NULL constant, srand() & rand() functions
#include <time.h> // access your computer’s clock time
// function prototype statements
int rollDice();
int calcPoints(int die1, int die2);
char checkOne(int die1, int die2);
int main()
{
int p1Score = 0;
int p2Score = 0;
int turnTotal = 0;
char rollAgain = 'Y';
char rolled1 = 'N';
int die1;
int die2;
printf("Welcome to the Pig Game. Each turn the player rolls two dice repeatedly until a single 1 is rolled or the player holds.\n\n");
printf("If a single 1 is rolled all points are lost. If the player holds, all earned points are kept.\n");
printf("If double 1's are rolled 25 points are earned, if any other doubles are rolled the value is doubled.\n");
printf("Player 1 has an advantage because they get to go first, the youngest player gets to be Player 1.\n\n");
printf("First player to 100 points wins, let the games begin!!!\n\n");
do
{
//----------------------P1's turn starts----------------------------------------
while ((rollAgain == 'Y' || rollAgain == 'y') && rolled1 == 'N')
{
die1 = rollDice(); //roll die 1
die2 = rollDice(); //roll die 2
printf("Player 1 rolls %d, and %d\n", die1, die2);
rolled1 = checkOne(die1, die2); //check if turn ending 1 is rolled if they did the below while loop will not run and the current while loop will end.
if(rolled1 == 'N') //if a single 1 wasn't rolled calculate total for the turn
{
turnTotal += calcPoints(die1, die2);
printf("Player 1 your turn total so far is %d. Would you like to roll again?\n", turnTotal);
fflush(stdin);
scanf_s("%c", &rollAgain);
}
}
//-------------------------P1's turn is now over---------------------------------
if (rolled1 == 'Y') //turnTotal isn't added to p1Score
{
printf("Sorry Player 1 your turn is over because you rolled a 1 on a single die :(\n");
printf("Your total score is now: %d.\n", p1Score);
}
else //player1 must have held
{
printf("Congratulations on scoring %d point this turn Player 1!\n", turnTotal);
p1Score += turnTotal;
printf("Your total score is now: %d.\n", p1Score);
}
//reset variables to start p2s turn
turnTotal = 0;
rolled1 = 'N';
rollAgain = 'Y';
//----------------------P2's turn starts----------------------------------------
while ((rollAgain == 'Y' || rollAgain == 'y') && rolled1 == 'N' && p1Score < 100) //player2's turn should not start if player 1 has already won the game so we must check p1's score as well
{
int die1 = rollDice(); //roll die 1
int die2 = rollDice(); //roll die 2
printf("Player 2 rolls %d, and %d\n", die1, die2);
rolled1 = checkOne(die1, die2); //check if turn ending 1 is rolled if it was the below while loop will not run and the current while loop will end.
if(rolled1 == 'N') //if a single 1 wasn't rolled calculate total for the turn
{
turnTotal += calcPoints(die1, die2);
printf("Player 2 your turn total so far is %d. Would you like to roll again?\n", turnTotal);
fflush(stdin);
scanf_s("%c", &rollAgain);
}
}
//-------------------------P2's turn is now over---------------------------------
if (rolled1 == 'Y' && p1Score < 100) //turnTotal isn't added to p1Score
{
printf("Sorry Player 2 your turn is over because you rolled a 1 on a single die :(\n");
printf("Your total score is now: %d.\n", p2Score);
}
if (rolled1 == 'N' && p1Score < 100) //player2 must have held, use an if statement rather than else because we don't want this code to play if p1 has already won
{
printf("Congratulations on scoring %d point this turn Player 2!\n", turnTotal);
p2Score += turnTotal;
printf("Your total score is now: %d.\n", p2Score);
}
//reset variables for p1's turn
turnTotal = 0;
rolled1 = 'N';
rollAgain = 'Y';
//if either player's score is > 100 the game is now over so the game ending code will now play
} while (p1Score < 100 && p2Score < 100);
if (p1Score >= 100) //player 1 has won, congratulate them
printf("Congratulations Player 1, you have won the game! Pat yourself on the back!\n");
else //player 1 didn't win so player 2 must have won since there are no draws
printf("Congratulations Player 2, you have won the game! You are awesome!\n");
return 0; //end main
}
//function rollDice rolles the dice for the player using a random number between 1-6.
int rollDice()
{
// seed the random number generator using the computers clock
srand(time(0));
//generate a random number between 1-6
int num = (rand() % 6) + 1;
return num;
}
//function calcPoints that calculates how many points the player earned.
int calcPoints(int die1, int die2)
{
int points;
if (die1 == die2) //check if doubles were rolled
{
//snake eyes = 25 points
if (die1 == 1)
points = 25;
//regular doubles = the value on the dice *2
else
points = (die1 + die2) * 2;
}
else //doubled weren't rolled
points = die1 + die2;
return points;
}
//function checkOne that checks if the player rolled a single 1 during their turn.
char checkOne(int die1, int die2)
{
if (die1 == 1 && die2 != 1)
return 'Y';
else if (die1 != 1 && die2 == 1)
return 'Y';
else
return 'N';
}
如果掷出一个 1,则玩家回合应该结束。 我真的很感激任何帮助,我不确定我哪里出错了。在询问我是否要再次滚动之后,代码就有了自己的想法。
Player 1 rolls 2, and 2
Player 1 your turn total so far is 8. Would you like to roll again?
y
Player 1 rolls 3, and 3
Player 1 your turn total so far is 20. Would you like to roll again?
Congratulations on scoring 20 point this turn Player 1!
Your total score is now: 20.
Player 2 rolls 3, and 3
Player 2 your turn total so far is 12. Would you like to roll again?
如果我再次同意滚动,这就是我得到的输出。在此输出的末尾,如果我想再次滚动,它允许我输入。
Player 1 rolls 3, and 3
Player 1 your turn total so far is 12. Would you like to roll again?
n
Congratulations on scoring 12 point this turn Player 1!
Your total score is now: 12.
Player 2 rolls 1, and 1
Player 2 your turn total so far is 25. Would you like to roll again?
Congratulations on scoring 25 point this turn Player 2!
Your total score is now: 25.
Player 1 rolls 1, and 1
Player 1 your turn total so far is 25. Would you like to roll again?
如果我再次拒绝滚动,这就是我得到的输出。在此输出的末尾,如果我想再次滚动,它允许我输入。
【问题讨论】:
-
if(rolled1 = 'N')和if(rolled1 = 'Y')你应该在这里使用==运算符 -
oops @RishikeshRaje 我已经习惯了 java 不编译这样的错误。我修复了这些位,但我仍然遇到问题
-
直接将输出粘贴到这里。不要提供指向外部工具的链接。
-
我尝试将其粘贴到此处,但无法弄清楚如何在 StackOverflow 上正确格式化它,这就是我将其放在 pastebin 上的原因。我应该如何发布输出,以免弄乱格式?
-
您有一个外部
do循环(第一行),它没有对应的while。那是用来做什么的,暂时的条件是什么。请编辑代码。
标签: c while-loop logical-operators