Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Tekstiseikkailu (C++)

Sivun loppuun

vehkis91 [25.01.2008 16:55:50]

#

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.)

Metabolix [25.01.2008 17:48:12]

#

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).

vehkis91 [25.01.2008 19:30:27]

#

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...

vehkis91 [26.01.2008 22:06:58]

#

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...

Antti Laaksonen [26.01.2008 23:26:50]

#

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();

vehkis91 [27.01.2008 13:55:16]

#

kiitos neuvosta. Tulen taas kysymään jos tarvitsen apua.

vehkis91 [27.01.2008 14:03:13]

#

Pitäisikö minun "linkittää" tuo funktio jokaiseen pelin funktioon?
http://vehkis.100free.com/content/main.html

Neuvvoja...

Metabolix [27.01.2008 14:13:59]

#

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ä.

vehkis91 [27.01.2008 16:25:17]

#

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.zip

Metabolix [27.01.2008 19:04:14]

#

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.

vehkis91 [27.01.2008 19:12:34]

#

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?

vehkis91 [28.01.2008 19:04:10]

#

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...


Sivun alkuun

Vastaus

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

Tietoa sivustosta