Problema joculet C++ #2

So… am facut un joc gen Akinator (akinator.com). Ideea e ca am doua probleme cu el:

  1. Nu stiu cum sa-l fac sa se repete la infinit jocul (adica dupa ce Akinator ghiceste cine e) sa inceapa iar. Am incercat cu do while… nu a iesit bine, dupa ce completam prima tura, era spammata consola cu toate intrebarile de-odata (cred ca v-ati prins).

  2. La final, cand Akinator nu ghiceste, acesta te intreaba cum il cheama pe prietenul tau… ideea e ca nu poti introduce numele, deoarece consola se termina de executat.

/**
*    Akinator, C++ version @ Tudor Micu
*/

#include <iostream>
using namespace std;

int main() {
    const int max_Friends = 500;

    const int friend_Gender = 0;
    const int friend_Age = 1;
    const int friend_Months = 2;
    const int friend_Nationality = 3;
    const int friend_Dead = 4;

    int saveTemporaryData[6];
    int friend_Data[max_Friends][5];

    char friend_Name[max_Friends][124];

    cout << "Akinator, C++ version @ Tudor Micu." << "\n" << "Can Akinator guess your friends?" << "\n\n"
         << "You need to know: You need to fill first Akinator's data about your friends, before test him.";

    cout << "\n\n" << "Akinator says: First question. What's your friend gender?" << "\n" << "1) Male, 2) Female" << "\n\n";
     cin >> saveTemporaryData[friend_Gender];

    switch(saveTemporaryData[friend_Gender]) {
        case 1: saveTemporaryData[friend_Gender] = 1; break;

        case 2: saveTemporaryData[friend_Gender] = 2; break;

        default: {
            cout << "\n" << "Akinator says: Invalid option. I'm repeating question. What's your friend gender?" << "\n"
                 << "1) Male, 2) Female" << "\n\n";
             cin >> saveTemporaryData[friend_Gender];
        }
    }

    cout << "\n" << "Akinator says: Okey, next question. How old is your friend?" << "\n\n";
     cin >> saveTemporaryData[friend_Age];

    switch(saveTemporaryData[friend_Age]) {
        case 0: {
            cout << "\n" <<"Akinator says: Okey, your friend is a baby. How much months have your friend?" << "\n\n";
                 cin >> saveTemporaryData[friend_Months];
            break;
        }

        default: break;
    }

    cout << "\n" << "Akinator says: Okey, next question. Your friend is Romanian?" << "\n" << "1) Yes, 2) No"
         << "\n\n";
    cin  >> saveTemporaryData[friend_Nationality];

    switch(saveTemporaryData[friend_Nationality]) {
        case 1: saveTemporaryData[friend_Nationality] = 1; break;

        case 2: saveTemporaryData[friend_Nationality] = 2; break;

        default: {
            cout << "\n" << "Akinator says: Invalid option. I'm repeating question. Your friend is Romanian?" << "\n"
                 << "1) Yes, 2) No" << "\n\n";
             cin >> saveTemporaryData[friend_Nationality];
        }
    }

    cout << "\n" << "Akinator says: Okey, next question. Your friend is dead?" << "\n" << "1) Yes, 2) No"
         << "\n\n";
    cin  >> saveTemporaryData[friend_Dead];

    switch(saveTemporaryData[friend_Dead]) {
        case 1: saveTemporaryData[friend_Dead] = 1; break;

        case 2: saveTemporaryData[friend_Dead] = 2; break;

        default: {
            cout << "\n" << "Akinator says: Invalid option. I'm repeating question. Your friend is dead?" << "\n"
                 << "1) Yes, 2) No" << "\n\n";
             cin >> saveTemporaryData[friend_Dead];
        }
    }

    for( int i = 0;  i <= max_Friends; i++ ) {
        if(saveTemporaryData[friend_Gender] == friend_Data[i][friend_Gender]) {
            if(saveTemporaryData[friend_Age] == friend_Data[i][friend_Age]) {
                if(saveTemporaryData[friend_Months] == friend_Data[i][friend_Months]) {
                    if(saveTemporaryData[friend_Nationality] == friend_Data[i][friend_Nationality]) {
                        if(saveTemporaryData[friend_Dead] == friend_Data[i][friend_Dead]) {
                            cout << "Akinator says: I think you are talking about " << friend_Name << ".";
                            break;
                        }
                        else {
                            cout << "\n" << "Akinator says: I can't guess who is your friend.. can you help me by typing his name below." << "\n\n";
                            cin.get(friend_Name[i], 124);
                            break;
                        }
                    }
                    else {
                        cout << "\n" << "Akinator says: I can't guess who is your friend.. can you help me by typing his name below." << "\n\n";
                        cin.get(friend_Name[i], 124);
                        break;
                    }
                }
                else {
                    cout << "\n" << "Akinator says: I can't guess who is your friend.. can you help me by typing his name below." << "\n\n";
                    cin.get(friend_Name[i], 124);
                    break;
                }
            }
            else {
                cout << "\n" << "Akinator says: I can't guess who is your friend.. can you help me by typing his name below." << "\n\n";
                cin.get(friend_Name[i], 124);
                break;
            }
        }
        else {
            cout << "\n" << "Akinator says: I can't guess who is your friend.. can you help me by typing his name below." << "\n\n";
            cin.get(friend_Name[i], 124);
            break;
        }
    }

    return 0;
}

Multumesc anticipat!

Hehe, cum ziceam intr-un alt post, asta nu e C++, e un fel de C cu std::cout :slight_smile: Nu reusesti sa faci ce vrei pentru ca e foarte rau structurat. Daca folosesti o structura ca sa descrii prietenul si incapsulezi in structura aia si functiile necesare citirii datelor va fi infinit mai usor de inteles. Uite cum as vedea eu rezolvarea:

/**
*    Akinator, C++ version @ Tudor Micu
*/

#include <list>
#include <iostream>
using namespace std;


struct Friend {
	std::string name;
	int is_male;
	bool is_romanian;
	int age;
	int months;
	bool is_dead;
	
	bool operator==(const Friend &other) const
	{
		return other.is_male == is_male &&
			other.is_romanian == is_romanian &&
			other.age == age &&
			other.months == months &&
			other.is_dead == is_dead;
	}
	
	bool inputYesNo(const std::string &question)
	{
		cout << "\n" << "Akinator says: Okey, next question. " << question << "\n" << "1) Yes, 2) No" << "\n\n";

		for(;;)
		{
    			int yes_no;
    			cin  >> yes_no;

			switch(yes_no)
			{
				case 1:
					return true;
					
				case 2:
					return false;
				
				default:
					cout << "\n" << "Akinator says: Invalid option. I'm repeating question. " << question << "\n"
                 				<< "1) Yes, 2) No" << "\n\n";
			}
    		}
	}
	
	void inputGender()
	{
		cout << "\n\n" << "Akinator says: First question. What's your friend gender?" << "\n" << "1) Male, 2) Female" << "\n\n";
		
		for(bool we_are_ok = false; !we_are_ok;)
		{
			int gender;
			cin >> gender;
			
			switch(gender)
			{
				case 1:
					is_male = true;
					we_are_ok = true;
					break;
				
				case 2:
					is_male = false;
					we_are_ok = true;
					break;
				
				default:
					cout << "\n" << "Akinator says: Invalid option. I'm repeating question. What's your friend gender?" << "\n"
                 				<< "1) Male, 2) Female" << "\n\n";
			}
		}
	}
	
	void inputAge()
	{
		cout << "\n" << "Akinator says: Okey, next question. How old is your friend?" << "\n\n";
     		cin >> age;

		if(0 == age)
		{
			cout << "\n" <<"Akinator says: Okey, your friend is a baby. How much months have your friend?" << "\n\n";
                 	cin >> months;
		}
		else
		{
			months = 0;
		}
	}
	
	void inputIfIsRomanian()
	{
		is_romanian = inputYesNo("Your friend is Romanian?");
	}
	
	void inputIfIsDead()
	{
		is_dead = inputYesNo("Your friend is dead?");
	}
	
	void inputName()
	{
		cin >>  name;
	}
};

int main()
{
	std::list<Friend> friends;

	for(;;)
	{
		Friend new_friend;
		
		new_friend.inputGender();
		new_friend.inputAge();
		new_friend.inputIfIsRomanian();
		new_friend.inputIfIsDead();
		
		bool found_friend = false;
		
		for(const Friend &old_friend : friends)
		{
			if(old_friend == new_friend)
			{
				cout << "Akinator says: I think you are talking about " << old_friend.name << ".\n\n";
				found_friend = true;
				break;
			}
		}
		
		if(!found_friend)
		{
			cout << "\n" << "Akinator says: I can't guess who is your friend.. can you help me by typing his name below." << "\n\n";
			
			new_friend.inputName();
			friends.push_back(new_friend);
			
			cout << "\n" << "Akinator says: Thank you, your new friend have been added to database." << "\n\n";
		}
	}

	return 0;
}

7 Likes

Ma uitam pe cod, il inteleg, doar ca vroiam sa-l fac ceva mai simplu, mai pe intelesul unui newbie (vreau sa-l prezint la scoala).

+1 pentru cod clar si concis !

Hmm, nu mi se pare deloc simplu sa urmareşti un cârnat de cod extrem de lung. Ca dovada, pana si tu, realizatorului codului, ti-ai prins urechile cand a trebuit sa prinzi tot codul ala intr-o bucla infinita :slight_smile: Iti dai seama ca o alta persoana nu intelege mai nimic, decat un programator foarte experimentat, dar si acela o face cu mari dificultati…

1 Like

@Kingsley s-ar putea să-ți fie util articolul ăsta: Readability Matters More Than Correctness

1 Like