Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Hirsipuu ogelma

Sivun loppuun

TVdata [14.11.2011 17:27:55]

#

Tuossa alkutervehdyksen kohdalla on jokin virhe. Siihen varmaan pitäisi lisätä jotain. Olen aloittelia.

// Yksinkertainen hirsipuu-peli, jossa pelaajan on
// kirjaimia arvaamalla ratkaistava piilossa oleva sana.

#include <iostream>
#include <string>
#include <ctime>
using namespace std;

                   cout << "Hei,minun nimeni on nimi ohjelma"; //Alkutervehdys
                   cout << endl;
                   system("pause");
                   cout << "Tervetuloa!";
                   cout << endl;
                   system("pause");
                   cout << "";
                   cout << endl;
                   system("pause");
                   system("pause");

const int sanojen_lkm = 10;

// Luodaan taulukko, jossa on kaikki arvuuteltavat sanat.
const string sanat[sanojen_lkm] = {"tulostin", "laskin", "televisio", "kitara", "kaiuttimet",
"kaappi", "kirja", "kasetti", "kello", "paperi"};

int main()
{
	srand(time(0)); // Otetaan ajasta siemenluku, että peli olisi joka kerta erilainen.
	int arvaukset = 5;
	cout << "Pelataanko hirsipuuta? <kylla/ei>\n";
	char valinta;
	cin >> valinta;

	// Muutetaan kirjain varmuuden vuoksi pieneksi, ihan vain laiskuuttamme :)
	valinta = tolower(valinta);
	while(valinta == 'k')
	{
		// Tyhjennetään näyttö turhuuksista.
		system("CLS");

		// Arvotaan sana, joka kysytään.
		string sana = sanat[rand() % sanojen_lkm];

		// Alustetaan muuttuuja, joka näytetään pelaajalle. Tässä on siis niitä viivoja :)
		int length = sana.length();
		string for_your_eyes_only(length, '-');

		// Tämä on ei-löydettyjen kirjainten säilytystä varten.
		string bad_chars;
		cout << "Sanasi: " << for_your_eyes_only << endl;
		while(arvaukset > 0 && sana != for_your_eyes_only)
		{
			// Näytetään sana ja kysytään kirjain.
			cout << "Arvaa kirjain: ";
			char kirjain;
			cin >> kirjain;

			// Katsotaan onko käyttäjä jo arvannut kirjaimen.
			if (bad_chars.find(kirjain) != string::npos
				|| for_your_eyes_only.find(kirjain) != string::npos)
			{
				cout << "Olet jo arvannut sen kirjaimen. Yritä uudelleen\n";
				continue;
			}

			// Alustetaan muuttuja joka tallentaa tiedon siitä, monesko kirjain (alkio) on sanassa.
			int loc = sana.find(kirjain);

			// Tarkistetaan löytyykö kirjainta sanasta.
			if (loc == string::npos)
			{
				cout << "Vaarin!\n";
				--arvaukset; // Vähennetään jäljellä olevien arvausten määrää.
				bad_chars += kirjain; // Lisätään ei-löytynyt kirjain kavereidensa joukkoon.
			}
			else // Kirjain löytyi.
			{
				cout << "Hyvin arvattu!\n";

				// Sijoitetaan kirjain oikealle paikalleen.
				for_your_eyes_only[loc] = kirjain;

				// Pitää muistaa vielä tarkistaa, löytyykö kirjainta muualta sanasta:
				loc = sana.find(kirjain, loc + 1);
				while(loc != string::npos)
				{
					for_your_eyes_only[loc] = kirjain;
					loc = sana.find(kirjain, loc + 1);
				}
			}

			cout << "Sanasi: " << for_your_eyes_only << endl;
			if (for_your_eyes_only != sana)
			{
				if (bad_chars.length() > 0)
					// Näytetään väärin arvatut kirjaimet helpotukseksi.
					cout << "Vaarin arvatut kirjaimet: " << bad_chars << endl;
				cout << arvaukset << " vaarää arvausta jäljellä.\n";
			}
		}

		// Tarkistetaan onko käyttäjä arvannut sanan.
		if (arvaukset > 0)
			cout << "Se oli oikein!\n";
		else
			cout << "Valitettavasti sana on " << sana << ".\n";

          arvaukset = 5;
		// Kysytään haluaako pelaaja pelata uudestaan.
		cout << "Pelataanko uudestaan? <kylla/ei>\n";
		cin >> valinta;
		valinta = tolower(valinta);
	}

	return 0;
}

vehkis91 [14.11.2011 17:32:22]

#

Noh ainakin se on ongelma, että:

cout << "Hei,minun nimeni on nimi ohjelma"; //Alkutervehdys
cout << endl;
system("pause");
cout << "Tervetuloa!";
cout << endl;
system("pause");
cout << "";
cout << endl;
system("pause");
system("pause");

Pitäisi olla int main() funktion sisässä.

TVdata [14.11.2011 17:45:45]

#

Miten tuon lisäksi saisi koko näytölle?

TVdata [14.11.2011 18:05:07]

#

Nyt se näyttää riviä 24. Kuinka monta virhettä tässä on? Mitkä ne ovat?

Teuro [14.11.2011 18:22:37]

#

Hiukan siistittynä ja osa toiminnoista siirrettynä funktioiksi koodista tuli tällainen. Ei missään määrin täydellinen, mutta tästä saa ehkä vähän ajatusta.

#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>
#include <vector>

std::vector <std::string> sanat;

int arvo_numero(int ala, int yla);
int tarkista_osuiko(std::string sana, std::string kirjain);
bool peli_jatkuu();
bool onko_oikein(std::string sana, std::string arvattu);

int hutiin_menneet = 5;
int arvottu;
std::string kirjain;
std::string sana;
std::string yritetyt;
std::string arvattu;

int main() {
    sanat.push_back("lentokone");

    std::srand(std::time(NULL));

    arvottu = arvo_numero(0, sanat.size());
    sana = sanat[arvottu];
    std::clog << "Nyt arvomme sanaa " << sana << std::endl;

    while (peli_jatkuu()){
        std::cin >> kirjain;

        if (yritetyt.find(kirjain) == std::string::npos) {
            yritetyt += kirjain;

                int kpl = tarkista_osuiko(sana, kirjain);

                if (kpl) {
                    std::clog << "Oikein meni" << std::endl;

                    for (int i = 0; i < kpl; ++i) {
                        arvattu += kirjain;
                    }
                } else {
                std::cout << "Hutiin meni uudestaan vaan. Saat kokeilla " << hutiin_menneet << " kertaa" << std::endl;
                --hutiin_menneet;
            }
        } else {
            std::cout << "Olet jo kokeillut kirjainta " << kirjain << std::endl;
        }

        if (onko_oikein(sana, arvattu)) {
            break;
        }
    }

	return 0;
}

int arvo_numero(int ala, int yla) {
    return (ala + std::rand()  % (ala + yla));
}

bool peli_jatkuu() {
    if (hutiin_menneet) {
        return true;
    }

    return false;
}

int tarkista_osuiko(std::string sana, std::string kirjain) {
    int kpl = 0;

    for (int i = 0; i < sana.length(); ++i){
        if (sana.substr(i, 1) == kirjain) {
            ++kpl;
        }
    }

    return kpl;
}

bool onko_oikein(std::string sana, std::string arvattu) {
    if (sana.length() == arvattu.length()) {
        return true;
    }

    return false;
}

Torgo [15.11.2011 12:25:50]

#

TVdata kirjoitti:

Miten tuon lisäksi saisi koko näytölle?

Esim.
Ubuntu: ctrl + alt + F1
XP: alt + enter (command promptissa)
Ilmeisesti käytössäsi on Windows käyttämiesi systeemikutsujen perusteella. Noista systeemikutsuista hankkiutuisin sinuna muutenkin eroon.

Teuro kirjoitti:

Ei missään määrin täydellinen, mutta tästä saa ehkä vähän ajatusta.

Ainakin tuo alun kysymys, eli alkutervehdyksen kirjoitus puuttuu.

TVdata kirjoitti:

Kuinka monta virhettä tässä on?

Toimiiko se? Pikaisesti vilkaistuna ei jo mainitun lisäksi osu pahempaa virhettä silmään. Lähinnä tyyliseikkoja ja syötteen tarkistuksia.
Vastaukseksi pyydät "kylla" tai "ei", mutta "kylla"-vastaukseksi tulkitaan kaikki k- ja K-alkuiset. Sen sijaan "ei"-vastaukseksi tulkitaan kaikki muut. Ja tämän lisäksi loput kirjaimet luetaan jo seuraavaan vastaukseen.

TVdata [23.11.2011 21:39:19]

#

Olen jo saanutut aikaan toimivan version.

vesikuusi [23.11.2011 22:25:56]

#

Onneksi olkoon.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta