Losowanie pytań z pliku

0

Witam, jak ma wyglądać plik tekstowy z pytaniami dla tego kodu i czy jest dobrze napisane losowanie poszczególnych pytań i odpowiedzi właśnie z tego pliku? Nie jest to mój kod.

#include "milionerzy.h"

void odczytPliku(string&, string&, string&, string&, string&, int&, int&);
char pobierzZnak();
void koniecGry(Portfel, bool);
bool wczytajOdpowiedz(Pytanie, Portfel, int&, int);
void zmianaPytania(Pytanie&, int);
void pokazKolaRatunkowe();

int main()
{
	
	Portfel portfel1(0, 0, 0);

	
	for (int i = 0; i < 9; i++) {
		if (etap > 1) Sleep(1500);
		system("CLS");

		
		portfel1.zmienStan(etap);
		portfel1.wyswietlStan();

		
		if (fiftyFiftyB == false && zmianaPytaniaB == false && przyjacielB == false) cout << "\nBrak dostepnych kol ratunkowych\n";
		else {
			cout << "\nDostepne kola ratunkowe:\n";
			pokazKolaRatunkowe(); 
		}

		
		string pytanie, odpA, odpB, odpC, odpD;
		int poprawna, nrPytania;

		
		odczytPliku(pytanie, odpA, odpB, odpC, odpD, poprawna, nrPytania);
		
		
		Pytanie pytanie1(pytanie, odpA, odpB, odpC, odpD, poprawna);
		pytanie1.mieszajOdpowiedzi();
		pytanie1.wyswietlPytanie();

		
		cout << "\nWpisz poprawna odpowiedz, numer kola ratunkowego lub R aby zrezygnowac: ";
		if (!wczytajOdpowiedz(pytanie1, portfel1, etap, nrPytania)) return 0;
	}

	return 0;
}

void odczytPliku(string& pytanie, string& odpA, string& odpB, string& odpC, string& odpD, int& poprawna, int& nrPytania)
{
	
	string nazwa = "C:\\Users\\Mateusz\\Desktop\\studia XD\\ppk\\github\\lab\\Projekt Gra Milionerzy\\etap" + to_string(etap) + ".txt";

	
	ifstream plik(nazwa);

	
	srand(time(0));
	nrPytania = (rand() % 6);

	
	string wiersz;

	
	if (plik.is_open()) {
		int licznikWierszy = 0;
		while (getline(plik, wiersz)) {

			
			licznikWierszy++;

			
			if (licznikWierszy == 1 + (5 * nrPytania)) {
				pytanie = wiersz;
			}

			
			else if (licznikWierszy == 2 + (5 * nrPytania)) {
				odpA = wiersz;
				if (odpA[0] == '*') poprawna = 65;
			}
			else if (licznikWierszy == 3 + (5 * nrPytania)) {
				odpB = wiersz;
				if (odpB[0] == '*') poprawna = 66;
			}
			else if (licznikWierszy == 4 + (5 * nrPytania)) {
				odpC = wiersz;
				if (odpC[0] == '*') poprawna = 67;
			}
			else if (licznikWierszy == 5 + (5 * nrPytania)) {
				odpD = wiersz;
				if (odpD[0] == '*') poprawna = 68;
			}
		}
	}
	plik.close();
	return;
}

char pobierzZnak() {
	
	char znak;
	cin >> znak;
	znak = toupper(znak);

	
	while (znak != 'A' && znak != 'B' && znak != 'C' && znak != 'D' && znak != 'R' && znak != '1' && znak != '2' && znak != '3') {
		cout << "Wpisz poprawna odpowiedz: ";
		cin >> znak;
		znak = toupper(znak);
	}

	
	return znak;
}

void koniecGry(Portfel portfel1, bool rezygnacja) {
	cout << "Koniec gry!\n";
	
	if (rezygnacja) cout << "Wygrales: " << portfel1.stan << " zl.";

	
	else cout << "Wygrales: " << portfel1.bezpiecznaSuma << " zl.";

}

bool wczytajOdpowiedz(Pytanie pytanie1, Portfel portfel1, int& etap, int aktualnePytanie) {
	
	char odpowiedz = pobierzZnak();

	
	if (odpowiedz == 'A' || odpowiedz == 'B' || odpowiedz == 'C' || odpowiedz == 'D') {

		
		if (pytanie1.sprawdzenie(odpowiedz)) {

			
			if (etap == 9) {
				cout << "Gratulacje!!!!!! Zostales Milionerem!!!!";
				return true;
			}

			
			else {
				cout << "Brawo, poprawna odpowiedz!!!\n";
				etap++;
				return true;
			}
		}

		
		else {
			cout << "Niestety, bledna odpowiedz!!!! ";
			koniecGry(portfel1, false);
			return false;
		}
	}

	

	else if (odpowiedz == '1') {
		
		if (!fiftyFiftyB) {
			cout << "Kolo moze zostac uzyte tylko raz!!\n";
			if (!wczytajOdpowiedz(pytanie1, portfel1, etap, aktualnePytanie)) return false;
			return true;
		}
		else {
			pytanie1.fiftyFifty();
			cout << "Podaj odpowiedz: ";
			if (!wczytajOdpowiedz(pytanie1, portfel1, etap, aktualnePytanie)) return false;
			return true;
		}
	}

	else if (odpowiedz == '2') {
		
		if (!przyjacielB) {
			cout << "Kolo moze zostac uzyte tylko raz!!\n";
			if (!wczytajOdpowiedz(pytanie1, portfel1, etap, aktualnePytanie)) return false;
			return true;
		}
		else {
			pytanie1.przyjaciel();
			cout << "Podaj odpowiedz: ";
			if (!wczytajOdpowiedz(pytanie1, portfel1, etap, aktualnePytanie)) return false;
			return true;
		}
	}

	else if (odpowiedz == '3') {
		
		if (!zmianaPytaniaB) {
			cout << "Kolo moze zostac uzyte tylko raz!!\n";
			if (!wczytajOdpowiedz(pytanie1, portfel1, etap, aktualnePytanie)) return false;
			return true;
		}
		else {
			zmianaPytania(pytanie1, aktualnePytanie);
			cout << "Podaj odpowiedz: ";
			if (!wczytajOdpowiedz(pytanie1, portfel1, etap, aktualnePytanie)) return false;
			return true;
		}
	}

	
	else {
		cout << "Rezygnujesz.";
		koniecGry(portfel1, true);
		return false;
	}
}

void zmianaPytania(Pytanie& pytanie1, int aktualnePytanie) {
	
	string nowePytanie, NodpA, NodpB, NodpD, NodpC;
	int nPoprawna;

	
	string nazwa = "C:\\Users\\Mateusz\\Desktop\\studia XD\\ppk\\github\\lab\\Projekt Gra Milionerzy\\etap" + to_string(etap) + ".txt";

	
	ifstream plik(nazwa);

	
	srand(time(0));
	int nrPytania = (rand() % 6);


	while (nrPytania == aktualnePytanie) {
		nrPytania = (rand() % 6);
	}

	
	string wiersz;

	
	if (plik.is_open()) {
		int licznikWierszy = 0;
		while (getline(plik, wiersz)) {

			
			licznikWierszy++;

			
			if (licznikWierszy == 1 + (5 * nrPytania)) {
				nowePytanie = wiersz;
			}
			else if (licznikWierszy == 2 + (5 * nrPytania)) {
				NodpA = wiersz;
				if (NodpA[0] == '*') nPoprawna = 65;
			}
			else if (licznikWierszy == 3 + (5 * nrPytania)) {
				NodpB = wiersz;
				if (NodpB[0] == '*') nPoprawna = 66;
			}
			else if (licznikWierszy == 4 + (5 * nrPytania)) {
				NodpC = wiersz;
				if (NodpC[0] == '*') nPoprawna = 67;
			}
			else if (licznikWierszy == 5 + (5 * nrPytania)) {
				NodpD = wiersz;
				if (NodpD[0] == '*') nPoprawna = 68;
			}
		}
	}
	plik.close();

	
	pytanie1.nadpisz(nowePytanie, NodpA, NodpB, NodpC, NodpD, nPoprawna);
}

void pokazKolaRatunkowe() {
	
	if (fiftyFiftyB) cout << "[1] 50:50\n";
	if (przyjacielB) cout << "[2] Telefon do przyjaciela\n";
	if (zmianaPytaniaB) cout << "[3] Zamiana pytania\n";

}
#pragma once
#include <iostream>
#include <string>
#include <fstream>
#include <ctime>
#include <cstdlib>
#include <iomanip>
#include <windows.h>


int etap = 1;
bool fiftyFiftyB = true;
bool zmianaPytaniaB = true;
bool przyjacielB = true;

using namespace std;

class Pytanie {
public:
	int poprawna;
	string tresc, odpA, odpB, odpC, odpD;

	Pytanie() {
		tresc = "default";
		odpA = "default";
		odpB = "default";
		odpC = "default";
		odpD = "default";
		poprawna = 0;
	}

	Pytanie(string tr, string oA, string oB, string oC, string oD, int po) {
		tresc = tr;
		odpA = oA;
		odpB = oB;
		odpC = oC;
		odpD = oD;
		poprawna = po;
	}

	~Pytanie() {}

	void mieszajOdpowiedzi() {
		
		string temp;
		if (char(poprawna) == 'A') temp = odpA;
		else if (char(poprawna) == 'B') temp = odpB;
		else if (char(poprawna) == 'C') temp = odpC;
		else temp = odpD;
	
		string temp2;
		srand(time(0));
		int losowanie = rand();
		if (losowanie % 3 == 0) {
			temp2 = odpA;
			odpA = odpC;
			odpC = temp2;
		}
		else if (losowanie % 3 == 1) {
			temp2 = odpB;
			odpB = odpD;
			odpD = temp2;
		}
		
		if (temp == odpA) poprawna = 65;
		else if (temp == odpB) poprawna = 66;
		else if (temp == odpC) poprawna = 67;
		else poprawna = 68;
	}

	void wyswietlPytanie() {
		cout << "\n" << tresc << endl;
		cout << "A) " << odpA << endl;
		cout << "B) " << odpB << endl;
		cout << "C) " << odpC << endl;
		cout << "D) " << odpD << endl;
	}

	bool sprawdzenie(char odpowiedz) {
		if (odpowiedz == char(poprawna)) return true;
		return false;
	}

	void fiftyFifty() {
	
		string temp;
		if (char(poprawna) == 'A') temp = odpA;
		else if (char(poprawna) == 'B') temp = odpB;
		else if (char(poprawna) == 'C') temp = odpC;
		else temp = odpD;
		
		string wylosowana1, wylosowana2;
		int wylosowanych = 0, losowanie;
		srand(time(0));
		
		while (wylosowanych < 1) {
			losowanie = rand();
			
			if (losowanie % 4 == 0) {
				if (odpA != temp) {
					wylosowana1 = "A";
					wylosowanych++;
				}
			}
			else if (losowanie % 4 == 1) {
				if (odpB != temp) {
					wylosowana1 = "B";
					wylosowanych++;
				}
			}
			else if (losowanie % 4 == 2) {
				if (odpC != temp) {
					wylosowana1 = "C";
					wylosowanych++;
				}
			}
			else {
				if (odpD != temp) {
					wylosowana1 = "D";
					wylosowanych++;
				}
			}
		}
		
		while (wylosowanych < 2) {
			losowanie = rand();
			if (losowanie % 4 == 0) {
				if (odpA != temp && wylosowana1 != "A") {
					wylosowana2 = "A";
					wylosowanych++;
				}
			}
			else if (losowanie % 4 == 1) {
				if (odpB != temp && wylosowana1 != "B") {
					wylosowana2 = "B";
					wylosowanych++;
				}
			}
			else if (losowanie % 4 == 2) {
				if (odpC != temp && wylosowana1 != "C") {
					wylosowana2 = "C";
					wylosowanych++;
				}
			}
			else {
				if (odpD != temp && wylosowana1 != "D") {
					wylosowana2 = "D";
					wylosowanych++;
				}
			}
		}
		cout << "2 bledne odpowiedzi to: " << wylosowana1 << " oraz " << wylosowana2 << endl;
		
		fiftyFiftyB = false;
	}

	void nadpisz(string tr, string oA, string oB, string oC, string oD, int po) {
		
		tresc = tr;
		odpA = oA;
		odpB = oB;
		odpC = oC;
		odpD = oD;
		poprawna = po;
	
		cout << "\nNowe pytanie:";
		wyswietlPytanie();
		
		zmianaPytaniaB = false;
	}

	void przyjaciel() {
		
		string temp, wylosowana;
		if (char(poprawna) == 'A') temp = odpA;
		else if (char(poprawna) == 'B') temp = odpB;
		else if (char(poprawna) == 'C') temp = odpC;
		else temp = odpD;
		
		bool znaleziono = false;
		int losowanie;
		srand(time(0));
		while (!znaleziono) {
			losowanie = rand();
			if (losowanie % 4 == 0) {
				if (odpA != temp) {
					wylosowana = "A";
					znaleziono = true;
				}
			}
			else if (losowanie % 4 == 1) {
				if (odpB != temp) {
					wylosowana = "B";
					znaleziono = true;
				}
			}
			else if (losowanie % 4 == 2) {
				if (odpC != temp) {
					wylosowana = "C";
					znaleziono = true;
				}
			}
			else {
				if (odpD != temp) {
					wylosowana = "D";
					znaleziono = true;
				}
			}
		}
		cout << "Przyjaciel mowi ze poprawna jest odpowiedz " << char(poprawna) << " lub " << wylosowana << endl;
		
		przyjacielB = false;
	}

};

class Portfel {
public:
	int stan, nastepnaSuma, bezpiecznaSuma;

	Portfel() {
		stan = 0;
		nastepnaSuma = 0;
		bezpiecznaSuma = 0;
	}

	Portfel(int su, int nS, int bS) {
		stan = su;
		nastepnaSuma = nS;
		bezpiecznaSuma = bS;
	}

	~Portfel() {}

	void wyswietlStan() {
		
		cout << "Stan konta: " << stan << " zl";
		cout << setw(23) << "Grasz o " << nastepnaSuma << " zl";
		cout << setw(33) << "Gwarantowana suma: " << bezpiecznaSuma << " zl" << endl;
	}

	void zmienStan(int aktualnyEtap) {
		
		switch (aktualnyEtap) {
		case 1:
			stan = 0;
			nastepnaSuma = 1000;
			bezpiecznaSuma = 0;
			break;
		case 2:
			stan = 1000;
			nastepnaSuma = 5000;
			bezpiecznaSuma = 0;
			break;
		case 3:
			stan = 5000;
			nastepnaSuma = 15000;
			bezpiecznaSuma = 5000;
			break;
		case 4:
			stan = 15000;
			nastepnaSuma = 40000;
			bezpiecznaSuma = 5000;
			break;
		case 5:
			stan = 40000;
			nastepnaSuma = 70000;
			bezpiecznaSuma = 5000;
			break;
		case 6:
			stan = 70000;
			nastepnaSuma = 125000;
			bezpiecznaSuma = 70000;
			break;
		case 7:
			stan = 125000;
			nastepnaSuma = 250000;
			bezpiecznaSuma = 70000;
			break;
		case 8:
			stan = 250000;
			nastepnaSuma = 500000;
			bezpiecznaSuma = 70000;
			break;
		case 9:
			stan = 500000;
			nastepnaSuma = 1000000;
			bezpiecznaSuma = 70000;
			break;
		default:
			stan = 0;
			nastepnaSuma = 0;
			bezpiecznaSuma = 0;
			break;
		}
	}
};
1

Popatrzyłem tylko na ten fragment kodu:

void odczytPliku(string& pytanie, string& odpA, string& odpB, string& odpC, string& odpD, int& poprawna, int& nrPytania)
{

    string nazwa = "C:\\Users\\Mateusz\\Desktop\\studia XD\\ppk\\github\\lab\\Projekt Gra Milionerzy\\etap" + to_string(etap) + ".txt";

    ifstream plik(nazwa);

    srand(time(0));
    nrPytania = (rand() % 6);

    string wiersz;

    if (plik.is_open()) {
        int licznikWierszy = 0;
        while (getline(plik, wiersz)) {

            licznikWierszy++;

            if (licznikWierszy == 1 + (5 * nrPytania)) {
                pytanie = wiersz;
            }

            else if (licznikWierszy == 2 + (5 * nrPytania)) {
                odpA = wiersz;
                if (odpA[0] == '*') poprawna = 65;
            }
            else if (licznikWierszy == 3 + (5 * nrPytania)) {
                odpB = wiersz;
                if (odpB[0] == '*') poprawna = 66;
            }
            else if (licznikWierszy == 4 + (5 * nrPytania)) {
                odpC = wiersz;
                if (odpC[0] == '*') poprawna = 67;
            }
            else if (licznikWierszy == 5 + (5 * nrPytania)) {
                odpD = wiersz;
                if (odpD[0] == '*') poprawna = 68;
            }
        }
    }
    plik.close();
    return;
}

i to jest totalny chaos, który nie ma sensu.
Ten kod wczytuje tylko ostatnie pytanie.

0

@MarekR22: A jakby to dało się przekształcić albo jak napisać kod, który losuje pytanie i odpowiedź z pliku?

3
struct Question {
    std::string question;
    std::vector<std::string> answears;
    size_t validAnswearIndex;
};

bool startsWith(const std::string& s, const std::string& prefix)
{
    return prefix.size() <= s.size() && std::equal(prefix.begin(), prefix.end(), s.begin());
}

bool isWhiteStr(const std::string& s)
{
    return std::all_of(s.begin(), s.end(), [](char ch) { return std::isspace(ch); });
}

std::istream& operator>>(std::istream& in, Question& question)
{
    if (std::getline(in, question.question)) {
        std::string answear;
        while (std::getline(in, answear) && !isWhiteStr(answear)) {
            if (startsWith(answear, "* ")) {
                answear = answear.substr(2);
                question.validAnswearIndex = question.answears.size();
            }
            question.answears.push_back(answear);
        }
    }
    return in;
}

std::istream& operator>>(std::istream& in, std::vector<Question>& questions)
{
    Question q;
    while (in >> q)
        questions.push_back(q);
    return in;
}

std::vector<Question> loadQuestions(const std::filesystem::path& p)
{
    std::vector<Question> questions;
    std::ifstream f { p };
    f >> questions;
    return questions;
}

https://wandbox.org/permlink/UmUFfSMPJjpF37ne

1 użytkowników online, w tym zalogowanych: 0, gości: 1