Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C++: Hirsipuu

Sivun loppuun

AK [24.07.2003 21:07:32]

#

Kyseessä on siis klassinen hirsipuu-peli, jossa pelaajan tulee kirjaimia arvaamalla ratkaista arvuuteltava sana.

Tämä ohjelma valitsee sattumanvaraisesti kymmenestä eri sanasta yhden ja kysyy sitä niin kauan että käyttäjä on joko arvannut sanan, arvaukset ovat loppuneet tai käyttäjä päättää lopettaa pelin.

Ohjelma ei kuitenkaan tässä versiossa piirrä hirressä roikkuvaa ukkoa :)

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

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

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? <k/e>\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 << "Väärin!\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 << "Väärin arvatut kirjaimet: " << bad_chars << endl;
				cout << arvaukset << " väärää 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? <k/e>\n";
		cin >> valinta;
		valinta = tolower(valinta);
	}

	return 0;
}

Gwaur [25.07.2003 00:36:45]

#

EXEä jossain?

AK [25.07.2003 10:41:27]

#

Jep, http://koti.mbnet.fi/akoskela/Hirsipuu.exe

AK [25.07.2003 10:41:50]

#

Sori tuon EXEn hirveä koko :(

kaviaari [25.07.2003 16:29:27]

#

kiitos nyt tiedän miten konsolissa tehdään Cls :)

AK [25.07.2003 18:52:57]

#

No hyvä :)

Kaikkia muitakin DOSin komentoja voi käyttää kun laittaa vaan system():n sisälle sen komennon. Vaikka system("format c:"); :)

T.M. [26.07.2003 15:04:19]

#

miten noin pieni ohjelma voi viedä 500kt tilaa? =|
mistä ton Visual C++:n sais...?(ilmaseks) >:)

AK [26.07.2003 19:20:24]

#

En nyt muista miten Visual C++:n saa tekemään pienempiä exejä asetuksia muuttamalla, tuon pitäs viedä KORKEINTAAN n. 30 kt jos sitäkään. Sattusko kukaan tietämään miten?

Visual C++:sta on olemassa Introductory Edition, jolla tehtyjä ohjelmia ei saa myydä Sen saa vaikka jonkun kirjan mukana. Huono puoli on se että se laittaa aina ohjelman alkuun tuon ilmotuksen mitä tuossa mulla näkyykin.

Ja waretuksesta ei tällä sivulla puhettakaan :)

Gwaur [27.07.2003 17:20:54]

#

Ajoin ton ohjelman ja siinä tuli jotain että sillä tehtyjä ohjelmia ei saa levittää. :o

AK [27.07.2003 18:59:06]

#

Voisin varmaan kirjottaa koodin VC++:lla ja kääntää vaikka Dev-C++:llä niin pääsis siitä viestistä eroon.

Tai (hyi!) ostaa se ohjelmisto melkosella setelitukolla :)

RautaNokka [30.07.2003 14:52:51]

#

Minulla tuo tekee niin, että kun olen ensimmäisen kerran pelannut, ja uudestaa peluussa tulee koko ajan näin :

Sanasi : ------(jonkun verran noita)
Valitettavasti sana on (esim. kitara)
Pelataanko uudestaan?<k/e>

BUGI!!!

odys [30.07.2003 17:03:51]

#

Joo sama bugi täällä..

AK [31.07.2003 19:38:54]

#

Oho... Tosi tyhmä virhe, tietenkin arvaukset-muuttuja pitää nollata. Muuten tuo silmukka on aina true ensimmäisen kerran jälkeen ja siirtyy suoraan loppuun. Sori.

AK [31.07.2003 20:12:07]

#

Siis ei tietenkään nollata vaan laittaa uudestaan viideksi.

progo [05.08.2003 10:28:00]

#

Toi system(); funktion käyttö on nykyään erittäin arveluttavaa sillä uudet käyttöjärjestelmät karsivat komentopohjaisia toimintoja pois. Parasta on että itse vaivautuisi etsimään conio.h:sta sopivan prototyypin mutta näköjään siirrettävyydellä ei ole merkitystä uusien ohjelmoijien keskuudessa.

progo [05.08.2003 10:30:53]

#

Niin, ja Visual C++ tekee yleensä kyllä ihan 20-50kt ohjelmia, varsinkin ton kokoisista konsolisöherryksistä. Ellei sitten ole menty ru(n)kkaamaan asetuksia ja esim. käännetty O3 nopeuden toivossa. Sanottakoon että mihin hirsipuupelissä tarvitaan sitä prkl nopeutta. Anteeksi tämä kärttyisyys mutta nykyajan.. no jääköön loppu vain mun korvien väliin.. :)

AK [05.08.2003 21:52:27]

#

Ja system() on vielä kaiken lisäksi järjestelmä-riippuvainen. Eli tuota ei niin vain Linuxille käännetä.

Olen eri mieltä, nopeus on todella oleellinen asia hirsipuu-pelissä :)

thefox [06.08.2003 01:50:34]

#

Binäärin suuri koko johtunee tuosta introduction editionista. system-funktion käyttö ruudun tyhjentämiseen on melko typerä teko, tuosta ruudun tyhjentämisestä ei ole käyttäjälle oikeastaan mitään hyötyä joten sen olisi voinut jättää kokonaan pois. proguru: conio.h ei ole sen siirrettävämpi kuin "cls":n kutsuminen system-funktiolla (joka on standardifunktio). Ja vaikka tuon kääntäisikin nopeuden optimoiden ei koko paljoa tuosta 20-50kt:sta heittelisi :)

Ok, sekavaa tekstiä, kirjoittelin vain kaiken mikä tuli mieleen samaan läjään.

sami kauppinen [12.04.2004 18:16:48]

#

haluisiko joku täst hirsipuust uuden version visual basicille

sami kauppinen [12.04.2004 18:20:48]

#

Haluaisko joku täs uuden version visual basicille.

sami kauppinen [14.04.2004 17:30:46]

#

haluuko joku saman jutun visual basicille

Gary534 [08.05.2005 21:55:42]

#

voisiko joku tehä tän saman visualbasicille kiitos.

Gary534 [08.05.2005 21:57:11]

#

Mutta muuten tää on ihan loistava kun näkee koodin siitä voi aina tehä kuiteskin paremman kuin vanha.

aloitteleva [22.06.2005 21:38:59]

#

Mun mielestä aivan loistava itse sain paljon ideoita tosta kiitos!

Tontttu [03.03.2006 17:32:58]

#

Exelinkki ei toimi

nublol [26.11.2007 18:24:59]

#

mites tuollainen cls kaltainen ruudun tyhjennys tehdään esim linux päätteessä ilman systeemikomentoja?

Rock4Life [31.01.2008 19:02:52]

#

Huomasin että moni ihmettelee käännetyn ohjelman suurta kokoa.
Selitys siihen löytyy iostream tiedostosta. Siinä on kaikenlaista rojua jotka tulee käännöksen aikana mukaan ohjelmaan. Muistaakseni joitain standardi juttuja joista ei pääse eroon vaikka haluaisikin. :(

Niille ketkä haluaa pienemmän ohjelmatiedoston on pari vaihtoehtoa:

-Käyttää cstdio otsikkotiedostoa jolloin cout ja cin vaihtuu printf:ksi ja scanf:ksi.

-Pakkaa lopullisen ohjelmatiedoston esim. UpxFrontend ohjelmalla.


Eli vertailun vuoksi mitä olen huomannut helloworld ohjelmassa:

-iostream otsikkotiedoston vaihto cstdio tiedostoon, niin saadaan kutistettua ohjelman koko 250kt -> 6kt.

-Lopullisen ohjelmatiedoston pakkaus UpxFrontend ohjelmalla(huom. iostream otsikkotiedosto käytössä) saadaan kutistettua ohjelman koko 250kt -> 72kt

Homma menee suunnilleen noin. :)

MIB [15.09.2009 19:40:29]

#

Tuossa kun määritetään sanojen lukema, niin eikös voisi käyttää jotain valmisfuktiota laskemiseen, kuten length tuolla jossain älynnyt katsoa? En tiedä kyllä, että päteekö tämä arrayn pituuteen, mutta kommentoimpas vaan.

Nettimato [14.03.2010 09:15:06]

#

exe ei toimi.


Sivun alkuun

Vastaus

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

Tietoa sivustosta