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; }
EXEä jossain?
Sori tuon EXEn hirveä koko :(
kiitos nyt tiedän miten konsolissa tehdään Cls :)
No hyvä :)
Kaikkia muitakin DOSin komentoja voi käyttää kun laittaa vaan system():n sisälle sen komennon. Vaikka system("format c:"); :)
miten noin pieni ohjelma voi viedä 500kt tilaa? =|
mistä ton Visual C++:n sais...?(ilmaseks) >:)
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 :)
Ajoin ton ohjelman ja siinä tuli jotain että sillä tehtyjä ohjelmia ei saa levittää. :o
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 :)
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!!!
Joo sama bugi täällä..
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.
Siis ei tietenkään nollata vaan laittaa uudestaan viideksi.
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.
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.. :)
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ä :)
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.
haluisiko joku täst hirsipuust uuden version visual basicille
Haluaisko joku täs uuden version visual basicille.
haluuko joku saman jutun visual basicille
voisiko joku tehä tän saman visualbasicille kiitos.
Mutta muuten tää on ihan loistava kun näkee koodin siitä voi aina tehä kuiteskin paremman kuin vanha.
Mun mielestä aivan loistava itse sain paljon ideoita tosta kiitos!
Exelinkki ei toimi
mites tuollainen cls kaltainen ruudun tyhjennys tehdään esim linux päätteessä ilman systeemikomentoja?
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. :)
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.
exe ei toimi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.