Первый раз здесь постер, так что терпите меня. Я также действительно новичок в 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;
}
}
}
}
Кажется, проблема зацикливания в вашем коде возникает из-за того, что весь код не зацикливается, в результате чего происходит только одна итерация игры. Вы должны поместить код от хода игрока до конца хода дьявола в цикл с условием примерно так
while (hasSomeoneWonYet == false) {code}
это будет поддерживать чередование поворотов, пока кто-то не станет истинным
Что касается того, как проверять условия выигрыша, то я бы сделал заявление, проверяющее, были ли выполнены условия выигрыша в конце хода каждого игрока. что-то вроде следующего:
if (winConditionsMet) {hasSomeoneWonYet = true;}
замените условия победы, удовлетворяющие фактическим условиям, и это должно работать лучше.
Вот некоторый псевдокод, который поможет вам:
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
,
Надеюсь, это поможет.
Задача 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;
}
}
}
}