Olen tekemässä c++ kielellä tekstiseikkailua (Ensimmäistäni) ja minulle on tullut kinkkinen ongelma, näytän sen pätkän koodia:
// case 'b': cout<<endl; int hajosi=0; if(hajosi==0) { cout<<"\a\a\aTietokone hajosi...\a"<<endl; hajosi=+1; cout<<hajosi<<endl; Desktop(); } if(hajosi==1) { cout<<"Tietokone on rikki..."<<endl; Desktop(); } break;
Miten voisin totteuttaa kyseisen koodin muuten?
"Pelin" koko koodin saa täältä http://vehkis.100free.com/content/main.html
(Mod. Edit. Kooditagit.)
Mikä on ongelmana? Varmaankin ajat takaa, miten saisit muuttujan arvon säilymään. Muuttuja pitää määritellä joko static-avainsanan kanssa, jolloin se on paikallinen (funktion sisäinen) ja säilyy, tai globaalina muuttujana eli funktioiden ulkopuolella.
static int hajosi; // Alustusta ei tarvita, static on automaattisesti nolla if (hajosi == 0) { hajosi = 1; cout << "Hajotit.\n"; } else { // Muutenhan se on varmasti jo rikki cout << "Hajosi jo!\n"; }
Muistahan myös se, että funktioita ei kuulu kutsua sisäkkäin rajattomassa määrin. Oikea tapa tilasta toiseen siirtymiselle ei siis ole aina vain yhä uusien ja uusien funktioiden kutsuminen. Tilanne vastaa hieman tätä:
main: funktio(); ....funktio: toinen_funktio(); ........toinen_funktio: Desktop(); ............Desktop: hajota(); ................hajota: ...
Kuten näet, rivi vain pitenee ja pitenee. Tähän tapaan muistia kuluu jatkuvasti lisää, jos mikään funktio ei etene loppuun asti (return-lauseeseen tai sulkevaan aaltosulkuun).
Joo kiitos, huomasin kanssa ite tuon funktio jutun... ;)
Mutta kun en ole pahemmin ohjelmoinut tän tyylisiä ohjelmia.
Niin ja kyllä nyk. ajan koneissa muistia riittää... ;)
Mikä se toinen vaihtoehto on tuohon funktio juttuun?
Tuolta osoitteesta saa muuten aina päivitetyn koodin: http://vehkis.100free.com/content/main.html...
Oknko kellään ideiota, miten saisin tehtyä funktion, että "pelissä" voisi kerätä esineitä. Yritin itse tehdä Class tsydeemillä jotain, muktu ei toiminu niin poistin sen...
Yksi ratkaisu on määritellä koodin alussa taulukko, johon tallennetaan pelaajan omistuksessa olevat esineet. Seuraavassa esimerkissä on kolme esinettä, kirja, miekka ja lapio. Taulukossa esinemaarat lukee, kuinka monta mitäkin esinettä pelaajalla on. Alussa pelaajalla on yksi lapio eikä mitään muuta. Esineisiin viitataan kokonaisluvuilla nollasta alkaen, ja taulukosta esinenimet pystyy selvittämään kunkin esineen nimen.
// esineiden yhteismäärä int esineet = 3; // pelaajan esineet int esinemaarat[] = {0, 0, 1}; // esineiden nimet char* esinenimet[] = {"kirja", "miekka", "lapio"};
Tässä on funktio, joka listaa kaikki pelaajan esineet:
void esinelista(void) { int i; cout << "Sinulla on seuraavat esineet:" << endl; for (i = 0; i < esineet; i++) { if (esinemaarat[i] > 0) { cout << esinenimet[i] << " ("; cout << esinemaarat[i] << " kpl)" << endl; } } }
Pelin sisälle tuleva koodi näyttää sitten tältä:
esinelista(); cout << "Löysit maasta kaksi kirjaa!" << endl; esinemaarat[0]++; esinemaarat[0]++; esinelista();
kiitos neuvosta. Tulen taas kysymään jos tarvitsen apua.
Pitäisikö minun "linkittää" tuo funktio jokaiseen pelin funktioon?
http://vehkis.100free.com/content/main.html
Neuvvoja...
Oletko huomannut tuota Muokkaa-linkkiä edellisen viestin yläkulmassa?
Koodisi on aivan käsittämätöntä luettavaa, voisit hieman panostaa sen järkevään sisentämiseen.
Mitään ei pidä tehdä, jos ei ole mitään tarvetta, mutta miten muutenkaan saisit esinelistan tulostettua kuin tulostamalla esinelistan? Eli jos haluat tulostaa sen, niin tietenkin silloin tarvitset esimerkiksi tuollaista funktiota, ja jos haluat lisätä esineen, niin tietenkin joudut tekemään sen kuten yllä.
No joo tiedän , mutta jos sisennän koodia vielä vähän , niin se ei mahdu näyttöön...;)
Miulla on jo toi yllä oleva koodi testissä pelissä. Pitäisikö minun tehdä jokaiselle tavaralle oma luokka tsydeemi?
Onko koodi muuten ihan ok, jos sisennyksiä ei lasketa mukaan?
Muokkattu:
täältä saa myös .exe tiedoston: http://vehkis.100free.com/content/Agent001alfa.
vehkis91 kirjoitti:
No joo tiedän , mutta jos sisennän koodia vielä vähän , niin se ei mahdu näyttöön...;)
Ei se määrästä ole kiinni vaan asettelusta. Olet sisentänyt ihan miten sattuu. Katsopa tästä mallia:
int main(void) { if (jotain) { tee_jotain(); // Kommentti tee_jotain_muuta(); while (ehto) { // Sisennetään lisää switch (muuttuja) { case 1: taas_jotain(); break; case 2: break; } } // Ja palataan takaisin samaan sisennystasoon } // Ja iffin ulkopuolella on taas sama taso kuin alussa. return 0; }
Nyt koodista näkee suoraan, missä vaikkapa while
-silmukka loppuu: se loppuu, kun palataan samaan sisennystasoon, josta while
alkaa.
vehkis91 kirjoitti:
Onko koodi muuten ihan ok, jos sisennyksiä ei lasketa mukaan?
Oikeasti ei ole järkevää koodata pelin juonta tuolla tavalla. Ennemmin kannattaa tehdä toimiva moottori, joka lukee tarvittavat tiedot tiedostosta. Tällöin tarvitsee koodata vain kerran erilaiset tilanteen näyttämiseen ja vastauksen pyytämiseen liittyvät funktiot.
En oikein tiedä miten tommonen pelimoottori tehdään, olisin muuten tehnyt sellaisen alunperinkin... ja tarvitseeko tehdä class juttut jokaisesta tavarasta erikseen, että voin myös käyttää niitä tavaroita?
Mietin vaan tässä, että pitäisikö aloittaa koko "projekti" alusta, koska en suunitellut sitä kunnolla niin nyt alkaa tuleen niitä virheitä...
Eli jos joku vois antaa pientä vinkkiä siitä pelimoottorista niin olisin kiitollinen...
Aihe on jo aika vanha, joten et voi enää vastata siihen.