Игра в кости свинья в стек переполнения

Первый раз здесь постер, так что терпите меня. Я также действительно новичок в C ++. Я кодирую эту игру, основанную на игре в кости под названием Свинья. Это близко к правильной работе, но у меня есть некоторые проблемы. Суть игры в том, чтобы набрать 100 очков, но я не уверен, как это закодировать. Я пробовал несколько способов, таких как циклы while или if, но ни один из них не сработал. Я хочу сказать, кто победит, как только выпадет победный кубик. Каков был бы лучший способ сделать это?

У меня также были проблемы с этим циклом правильно. Он должен вернуться к петле игрока после того, как компьютер пройдет, но он хочет просто выйти. Любая помощь приветствуется!

#include <iostream>
#include <cstdlib>
#include <string>

using namespace std;

int main()
{
int die;
int myScore = 95;
int devilScore = 95;
int turnScore = 0;
int myScoretotal = myScore += turnScore;
int devilScoretotal = devilScore += turnScore;
char choice;
bool change = false;cout << "Welcome to Devil's Dice! Please select from the following menu: ";

while(change == false){ //&& devilScoretotal < 100 && myScoretotal < 100){
cout << "\nRoll [r], Pass [p], or Quit [q].";
cin >> choice;

if(choice == 'r'){
die=(rand() % 6 + 1); //Number generator for die

if(die > 1){
cout << "You rolled a " << die << "." << endl;
turnScore += die;
cout << "You will add " << turnScore << " points if you pass now. ";}
else{
cout << "You rolled a 1. You lose your points and your turn ends." << endl;
change = true;
turnScore = 0;
}
}

if(choice == 'p')
{myScore += turnScore;
cout << "Your score is now " << myScore << "." << endl;
turnScore = 0;
change = true; }  //needs to go to Devil nowif(choice == 'q')
{cout << "\n\tThanks for playing! ";
return 0; }

else if(choice > 'r' || choice < 'p')
{cout << "Please select from the choices listed."; }

}

while(change == true){// && devilScoretotal < 100 && myScoretotal < 100){ //The Devil's actions

if(myScore > devilScore && turnScore < 17 || devilScore > myScore && turnScore < 12 || devilScore > 84){

choice='r';
cout << "The Devil rolls! " << endl;

if(choice == 'r'){
die=(rand() % 6 + 1); //Number generator for die
if(die > 1){

cout << "The Devil rolls a " << die << "." << endl;
turnScore += die;
}else{
cout << "The Devil rolls a 1. He loses his points and now it's your turn!" << endl;
turnScore = 0;
change = false;
}

}else{

cout << "The Devil chooses to pass. ";
devilScore += turnScore;
choice='p';
turnScore = 0;
cout << "He has " << devilScore << " points. " << endl;
cout << "The Devil now has " << devilScore << " points." << endl;
change = false;
}
}
}
}

0

Решение

Кажется, проблема зацикливания в вашем коде возникает из-за того, что весь код не зацикливается, в результате чего происходит только одна итерация игры. Вы должны поместить код от хода игрока до конца хода дьявола в цикл с условием примерно так

while (hasSomeoneWonYet == false) {code}

это будет поддерживать чередование поворотов, пока кто-то не станет истинным

Что касается того, как проверять условия выигрыша, то я бы сделал заявление, проверяющее, были ли выполнены условия выигрыша в конце хода каждого игрока. что-то вроде следующего:

if (winConditionsMet) {hasSomeoneWonYet = true;}

замените условия победы, удовлетворяющие фактическим условиям, и это должно работать лучше.

2

Другие решения

Вот некоторый псевдокод, который поможет вам:

turn = player
winner = false
rolled_1 = false
pass = false

while !winner

if turn == player

show the player options (roll, pass, or quit)

respond to player's choice

else if turn == computer
logic for what computer does for its roll

respond to computer's choice

check for winner

if winner
announce winner
else
if rolled 1 or pass was chosen
if turn == computer
turn = player
else
turn = computer

(winner became true, so the while loop is exited, and the program finishes)

Используйте отступ, чтобы знать, где поставить фигурные скобки. У многих IDE есть какой-то помощник формата или отступа.

Кроме того, поскольку значение turn содержит только два значения, вы можете изменить его на логическое значение, например is_computer_turn,

Надеюсь, это поможет.

0

Задача 1. У вас есть два цикла, контролирующие ход каждого игрока, но они не заключены во внешний цикл, который будет повторять ходы до тех пор, пока не будет выполнено условие (условие выигрыша).

Задача 2: Вы должны проверить условие выигрыша, когда число бросков + число ходов + общее количество очков> = 100. В этом случае вы можете просто напечатать заявление о выигрыше и вернуться.

Возможное решение (я использую бесконечные циклы и разрывы, не очень элегантно, но оно должно делать):

#include <iostream>
#include <cstdlib>
#include <string>

using namespace std;

int main()
{
int die;
int myScore = 0;
int devilScore = 0;
int turnScore = 0;
char choice;
bool change = false;

bool weHaveAWinner = false;
cout << "Welcome to Devil's Dice! Please select from the following menu: ";

//Enclosing infinite loop, only can exit on return
while (true) {
//Player turn loop, can exit with breaks to main loop
while (true){
cout << "\nRoll [r], Pass [p], or Quit [q].";
cin >> choice;

if(choice == 'r'){
die=(rand() % 6 + 1); //Number generator for die

if(die > 1){
cout << "You rolled a " << die << "." << endl;
turnScore += die;
if (turnScore + myScore >=100) {
cout << "You win!" << endl;
//Winning condition met. Game over and return.
return 0;
}
cout << "You will add " << turnScore << " points if you pass now. ";}
else{
cout << "You rolled a 1. You lose your points and your turn ends." << endl;
turnScore = 0;
//End turn. Breaks secondary loop.
break;
}
}

if(choice == 'p')   {
myScore += turnScore;
cout << "Your score is now " << myScore << "." << endl;
turnScore = 0;
change = true;
//End turn. Breaks secondary loop.
break;
}  //needs to go to Devil nowif(choice == 'q')
{cout << "\n\tThanks for playing! ";
return 0; }

else if(choice > 'r' || choice < 'p')
{cout << "Please select from the choices listed."; }

}

while (true){
//Devil's turn loop, can exit with breaks to main loop
if(myScore > devilScore && turnScore < 17 || devilScore > myScore && turnScore < 12 || devilScore > 84){

choice='r';
cout << "The Devil rolls! " << endl;

if(choice == 'r'){
die=(rand() % 6 + 1); //Number generator for die
if(die > 1){
cout << "The Devil rolls a " << die << "." << endl;
turnScore += die;
if (turnScore + devilScore >=100) {
//Winning condition met. Game over and return.
cout << "The Devil wins!" << endl;
return 0;
}
}else{
cout << "The Devil rolls a 1. He loses his points and now it's your turn!" << endl;
turnScore = 0;
change = false;
//End turn. Breaks secondary loop.
break;
}

}
}else{

cout << "The Devil chooses to pass. ";
devilScore += turnScore;
choice='p';
turnScore = 0;
cout << "He has " << devilScore << " points. " << endl;
cout << "The Devil now has " << devilScore << " points." << endl;
change = false;
//End turn. Breaks secondary loop.
break;
}
}
}
}
0
По вопросам рекламы [email protected]