Вопрос или проблема
Я работаю над заданием, математической игрой «Обратный отсчет». Игра работает так, как предполагается, но не совсем так, как хочет автопроверка. Числа выводятся в другом порядке, чем требуется автопроверкой. Пожалуйста, помогите. Я пытался исправить это, но не могу найти решение.
Ввод:
27
1
5-1
100 * 4
7*10
400-70
Мой вывод:
Введите случайное число:
Давайте играть в Обратный отсчет!
Сколько больших чисел вы бы хотели (0-4)?
Ваши числа: 100 5 5 10 1 7
Цель: 330
Введите расчет (или 0 для выхода):
5 - 1 = 4
Ваши числа: 100 5 10
4 7
Цель: 330
Введите расчет (или 0 для выхода):
100 * 4 = 400
Ваши числа: 5 10
400 7
Цель: 330
Введите расчет (или 0 для выхода):
7 * 10 = 70
Ваши числа:
5
70
400
Цель: 330
Введите расчет (или 0 для выхода):
400 - 70 = 330
Вы выиграли!
Ожидаемый вывод:
Введите случайное число:
Давайте играть в Обратный отсчет!
Сколько больших чисел вы бы хотели (0-4)?
Ваши числа: 100 5 5 10 1 7
Цель: 330
Введите расчет (или 0 для выхода):
5 - 1 = 4
Ваши числа: 100
4
5 10
7
Цель: 330
Введите расчет (или 0 для выхода):
100 * 4 = 400
Ваши числа:
400
5 10
7
Цель: 330
Введите расчет (или 0 для выхода):
7 * 10 = 70
Ваши числа:
400
70
5
Цель: 330
Введите расчет (или 0 для выхода):
400 - 70 = 330
Вы выиграли!
Код:
#include <iostream>
#include <sstream>
#include <string>
#include <iomanip>
#include "mersenne-twister.h"
int chooseRandomNumber(int min, int max);
using namespace std;
int num1 , num2 , num3 , num4 , num5 , num6;
int countRemainingNumbers(){
int count = 0;
if(num1 != 0) count ++;
if(num2 != 0) count ++;
if(num3 != 0) count ++;
if(num4 != 0) count ++;
if(num5 != 0) count ++;
if(num6 != 0) count ++;
return count;
}
void printRemainingValues(int t2){
cout << "Ваши числа: ";
if (num1 != 0) cout << num1 << " ";
if (num2 != 0) cout << num2 << " ";
if (num3 != 0) cout << num3 << " ";
if (num4 != 0) cout << num4 << " ";
if (num5 != 0) cout << num5 << " ";
if (num6 != 0) cout << num6 << " " << endl;
cout << "Цель: " << t2 << endl;
}
bool calculations(int t1){
char op;
int n1,n2;
double result;
std::cout << "Введите расчет (или 0 для выхода): " << std::endl;
std::cin >> n1 ;
std::cin >> op;
std::cin >> n2;
if (n1 == 0){
exit(0);
}
switch(op){
case '+':
result = n1 + n2;
break;
case '-':
result = n1 - n2;
break;
case '*':
result = n1 * n2;
break;
case "https://stackoverflow.com/":
result = n1 / n2;
break;
}
bool found_n1 = false, found_n2 = false;
if (n1 == num1 && !found_n1) {num1 = 0; found_n1 = true;}
else if (n1 == num2 && !found_n1) {num2 = 0; found_n1 = true;}
else if (n1 == num3 && !found_n1) {num3 = 0; found_n1 = true;}
else if (n1 == num4&& !found_n1) {num4 = 0;found_n1 = true;}
else if (n1 == num5&& !found_n1) {num5 = 0;found_n1 = true;}
else if (n1 == num6&& !found_n1) {num6 = 0;found_n1 = true;}
if(n2 == num1 && !found_n2) {num1 = result; found_n2 = true;}
else if (n2 == num2 && !found_n2) {num2 = result; found_n2 = true;}
else if (n2 == num3&& !found_n2) {num3 = result; found_n2 = true;}
else if (n2 == num4&& !found_n2) {num4 = result; found_n2 = true;}
else if (n2 == num5&& !found_n2) {num5 = result; found_n2 = true;}
else if (n2 == num6&& !found_n2) {num6 = result; found_n2 = true;}
std::cout << n1<<" "<< op<< " " << n2 << " " << '=' << " " << result << std::endl;
cout << "\n";
if (result == t1){
cout << "Вы выиграли!" << endl;
return true;
}
printRemainingValues(t1);
return false;
}
int main()
{
int randSeed = 0;
cout << "Введите случайное число: ";
cin >>randSeed;
seed(randSeed);
cout <<endl;
int bigN;
cout << "Давайте играть в Обратный отсчет!" << endl;
cout << "Сколько больших чисел вы бы хотели (0-4)? "<<endl;
cout << "\n";
cin >> bigN;
cout << "Ваши числа: ";
switch (bigN){
case 1:
num1 = chooseRandomNumber(1,4) * 25;
num2 = chooseRandomNumber(1,10);
num3 = chooseRandomNumber(1,10);
num4 = chooseRandomNumber(1,10);
num5 = chooseRandomNumber(1,10);
num6 = chooseRandomNumber(1,10);
break;
case 2:
num1 = chooseRandomNumber(1,4) * 25;
num2 = chooseRandomNumber(1,4) * 25;
num3 = chooseRandomNumber(1,10);
num4 = chooseRandomNumber(1,10);
num5 = chooseRandomNumber(1,10);
num6 = chooseRandomNumber(1,10);
break;
case 3:
num1 = chooseRandomNumber(1,4) * 25;
num2 = chooseRandomNumber(1,4) * 25;
num3 = chooseRandomNumber(1,4) * 25;
num4 = chooseRandomNumber(1,10);
num5 = chooseRandomNumber(1,10);
num6 = chooseRandomNumber(1,10);
break;
case 4:
num1 = chooseRandomNumber(1,4) * 25;
num2 = chooseRandomNumber(1,4) * 25;
num3 = chooseRandomNumber(1,4) * 25;
num4 = chooseRandomNumber(1,4) * 25;
num5 = chooseRandomNumber(1,10);
num6 = chooseRandomNumber(1,10);
break;
}
cout << num1 << " " << num2 << " " << num3 << " " << num4 << " " << num5 << " " << num6 << " " <<endl;
int targetNumber = chooseRandomNumber(101,999);
cout << "Цель: " << targetNumber<<endl;
bool d1;
do{
if (countRemainingNumbers() == 1){
cout << "Вы проиграли." << endl;
break;
}
d1 = calculations(targetNumber);
}
while (!d1);
return 0;
}
int chooseRandomNumber(int min, int max) {
return rand_u32() % (max + 1 - min) + min;
}
Я пытался изменить операторы if в функции calculations(), но это, похоже, не работает. Я не могу понять логику.
Ответ или решение
Для того чтобы исправить порядок печати результатов в вашей игре, вам необходимо внести изменения в функцию printRemainingValues
. В текущей реализации вы просто печатаете оставшиеся числа по порядку, и они выводятся в том виде, в котором вы обрабатываете введенные пользователем числа. Чтобы добиться ожидаемого вывода, вам нужно добавить дополнительную логику для форматирования оставшихся чисел.
Вот как вы можете изменить вашу функцию printRemainingValues
:
void printRemainingValues(int t2) {
cout << "Your numbers are: ";
bool printed = false; // Флаг для отслеживания, было ли напечатано хотя бы одно число
// Печатаем оставшиеся числа, обрабатывая их в порядке, который ожидается
if(num1 != 0) {
cout << num1 << endl;
printed = true;
}
if(num2 != 0) {
if (printed) cout << " ";
cout << num2 << endl;
printed = true;
}
if(num3 != 0) {
if (printed) cout << " ";
cout << num3 << endl;
printed = true;
}
if(num4 != 0) {
if (printed) cout << " ";
cout << num4 << endl;
printed = true;
}
if(num5 != 0) {
if (printed) cout << " ";
cout << num5 << endl;
printed = true;
}
if(num6 != 0) {
if (printed) cout << " ";
cout << num6 << endl;
}
cout << "The target is: " << t2 << endl;
}
Кроме этого, необходимо внести изменения в функцию calculations
, чтобы гарантировать, что после обработки операции числа правильно обрабатываются и печатаются. Ваша текущая реализация перезаписывает числа на 0 и может не учитывать порядок печати остатков. Вот возможная модификация:
bool calculations(int t1) {
char op;
int n1, n2;
double result;
std::cout << "Enter a calculation (or 0 to quit): " << std::endl;
std::cin >> n1;
if (n1 == 0) {
exit(0);
}
std::cin >> op >> n2;
switch(op) {
case '+':
result = n1 + n2;
break;
case '-':
result = n1 - n2;
break;
case '*':
result = n1 * n2;
break;
case '/':
if (n2 != 0) {
result = static_cast<double>(n1) / n2;
} else {
std::cout << "Cannot divide by zero!" << std::endl;
return false;
}
break;
default:
std::cout << "Invalid operator." << std::endl;
return false;
}
// Проверяем, где нужно обновить значения
bool found_n1 = false, found_n2 = false;
if (n1 == num1 && !found_n1) { num1 = 0; found_n1 = true; }
else if (n1 == num2 && !found_n1) { num2 = 0; found_n1 = true; }
else if (n1 == num3 && !found_n1) { num3 = 0; found_n1 = true; }
else if (n1 == num4 && !found_n1) { num4 = 0; found_n1 = true; }
else if (n1 == num5 && !found_n1) { num5 = 0; found_n1 = true; }
else if (n1 == num6 && !found_n1) { num6 = 0; found_n1 = true; }
if (n2 == num1 && !found_n2) { num1 = result; found_n2 = true; }
else if (n2 == num2 && !found_n2) { num2 = result; found_n2 = true; }
else if (n2 == num3 && !found_n2) { num3 = result; found_n2 = true; }
else if (n2 == num4 && !found_n2) { num4 = result; found_n2 = true; }
else if (n2 == num5 && !found_n2) { num5 = result; found_n2 = true; }
else if (n2 == num6 && !found_n2) { num6 = result; found_n2 = true; }
std::cout << n1 << " " << op << " " << n2 << " = " << result << std::endl;
if (result == t1) {
std::cout << "You win!" << std::endl;
return true;
}
printRemainingValues(t1);
return false;
}
С этими изменениями ваша программа должна печатать результаты в порядке, который ожидает автозагрузчик. Важно также убедиться, что вы правильно управляете состоянием оставшихся чисел для вывода. Это обеспечит правильность всех сохраненных значений.