Iltaa kaikille,
Olen uusi ohjelmointiputkan jäsen ja ajattelin aloittaa heti ensimmäisillä kysymyksilläni, että mikä on tekstiseikkailussa (QBasic) paras tapa järjestää tavarat, eli miten voi tehdä niin että yhdessä huoneessa on 1kpl tavaroita, poimittuasi sen sen menee inventoryysi ja sen jälkeen sitä ei enää ole kyseisessä huoneessa.
Alla on pelin koodi - mikäli joku osaisi korjata pelin ja saisisi sen toimimaan olisin ikionnellinen.
DIM vastaus AS STRING DIM pNIMI AS STRING DIM tpmViesti AS STRING GOTO ALKURUUTU '------------------------------------------------------------------------------- ALKURUUTU: COLOR 15, 0 Vaihtoehtoja = 5 CLS PRINT "*****************************************************************************************" PRINT "* HAUNTED CASTLE - Version 0.1 Beta *" PRINT "*****************************************************************************************" PRINT "" PRINT "" PRINT PRINT 1. New Game PRINT 2. Help PRINT 3. Story PRINT 4. Exit PRINT 5. Credits IF Vaihtoehtoja THEN INPUT "?", vastaus numero = VAL(vastaus) IF numero <= 0 OR numero > Vaihtoehtoja THEN GOTO ALKURUUTU SELECT CASE numero CASE 1 GOTO GAME CASE 2 GOTO HELP CASE 3 GOTO STORY CASE 4 END CASE 5 GOTO CREDITS END SELECT ELSE SLEEP GOTO ALKURUUTU END IF '------------------------------------------------------------------------------- BUSHES: COLOR 15, 0 Vaihtoehtoja = 3 CLS PRINT "You are standing at some huge and dark bushes." PRINT "" PRINT "What would you like to do?" PRINT PRINT 1. Walk straight into the bushes. PRINT 2. Go back to the garden. PRINT 3. Show inventory. IF Vaihtoehtoja THEN INPUT "?", vastaus numero = VAL(vastaus) IF numero <= 0 OR numero > Vaihtoehtoja THEN GOTO BUSHES SELECT CASE numero CASE 1 GOTO SCARED CASE 2 GOTO GAME CASE 3 GOSUB tpmNaytaTavarat END SELECT GOTO BUSHES ELSE SLEEP GOTO BUSHES END IF '------------------------------------------------------------------------------- CREDITS: COLOR 15, 0 Vaihtoehtoja = 0 CLS PRINT "Credits:" PRINT "" PRINT "Programming and original idea: Kim Lindqvist" PRINT "Ideas: Samu Auranen" PRINT " Jarkko Kiiski" PRINT IF Vaihtoehtoja THEN INPUT "?", vastaus numero = VAL(vastaus) IF numero <= 0 OR numero > Vaihtoehtoja THEN GOTO CREDITS SELECT CASE numero END SELECT GOTO CREDITS ELSE SLEEP GOTO CREDITS END IF '------------------------------------------------------------------------------- ENTRANCE: COLOR 15, 0 Vaihtoehtoja = 0 CLS PRINT "To be continued.." PRINT IF Vaihtoehtoja THEN INPUT "?", vastaus numero = VAL(vastaus) IF numero <= 0 OR numero > Vaihtoehtoja THEN GOTO ENTRANCE SELECT CASE numero END SELECT GOTO ENTRANCE ELSE SLEEP GOTO ENTRANCE END IF '------------------------------------------------------------------------------- FOUNTAIN: COLOR 15, 0 Vaihtoehtoja = 3 CLS PRINT "You start walking towards the fountain. You reach the fountain." PRINT "The water is pitch black and slimey. You almost throw up when the smell coming from" PRINT "the fountain reaches your nose. Something is shining brightly in the water." PRINT "" PRINT "What do you want to do?" PRINT PRINT 1. Stick your hand in the water. PRINT 2. Walk back to the garden. PRINT 3. Show inventory. IF Vaihtoehtoja THEN INPUT "?", vastaus numero = VAL(vastaus) IF numero <= 0 OR numero > Vaihtoehtoja THEN GOTO FOUNTAIN SELECT CASE numero CASE 1 invKEY = invKEY + 1 GOTO KEYS CASE 2 GOTO GAME CASE 3 GOSUB tpmNaytaTavarat END SELECT GOTO FOUNTAIN ELSE SLEEP GOTO FOUNTAIN END IF '------------------------------------------------------------------------------- GAME: COLOR 15, 0 Vaihtoehtoja = 5 CLS PRINT "You are in the castle garden. It looks quite pretty allthough" PRINT "it is very dark and scary. A fountain is sprinkling somewhere -" PRINT "you can hear it. You can see some bushes a bit from here. In front" PRINT "of you you can see the huge castle. There is an enormous gate at the" PRINT "stone wall. A torch is burning at the gate. It spreads a warm beam" PRINT "of light into the area." PRINT PRINT 1. Walk to the bushes. PRINT 2. Start walking towards the fountain. PRINT 3. Walk to the castle gates. PRINT 4. Jump into your car and drive away. PRINT 5. Show inventory IF Vaihtoehtoja THEN INPUT "?", vastaus numero = VAL(vastaus) IF numero <= 0 OR numero > Vaihtoehtoja THEN GOTO GAME SELECT CASE numero CASE 1 GOTO BUSHES CASE 2 GOTO FOUNTAIN CASE 3 GOTO GATES CASE 4 SLEEP 3 END CASE 5 GOSUB tpmNaytaTavarat END SELECT GOTO GAME ELSE SLEEP GOTO GAME END IF '------------------------------------------------------------------------------- GATES: COLOR 15, 0 Vaihtoehtoja = 4 CLS PRINT "You walk towars the castle gates. They are dark brown coloured." PRINT "You see a torch a little above your head. You also see a hole" PRINT "in the door. There are two lit torches burning at both sides of the gates." PRINT "" PRINT "What would you like to do?" PRINT PRINT 1. Stick your fingers into the tiny hole. PRINT 2. Open door with the keys. PRINT 3. Walk back to the garden. PRINT 4. Show inventory IF Vaihtoehtoja THEN INPUT "?", vastaus numero = VAL(vastaus) IF numero <= 0 OR numero > Vaihtoehtoja THEN GOTO GATES SELECT CASE numero CASE 1 GOTO HOLE CASE 2 CASE 3 GOTO GAME CASE 4 GOSUB tpmNaytaTavarat END SELECT GOTO GATES ELSE SLEEP GOTO GATES END IF '------------------------------------------------------------------------------- HELP: COLOR 15, 0 Vaihtoehtoja = 1 CLS PRINT "This is a text based adventure game. You can control the character by giving the " PRINT "numbers to the actions. These actions are located on your screen." PRINT PRINT 1. Start Playing IF Vaihtoehtoja THEN INPUT "?", vastaus numero = VAL(vastaus) IF numero <= 0 OR numero > Vaihtoehtoja THEN GOTO HELP SELECT CASE numero CASE 1 GOTO ALKURUUTU END SELECT ELSE SLEEP GOTO HELP END IF '------------------------------------------------------------------------------- HOLE: COLOR 15, 0 Vaihtoehtoja = 1 CLS PRINT "You stick your fingers deep into the hole. Suddenly a stream of" PRINT "pain runs through your body - then everything is back to normal" PRINT "you pull your finger back out. You look at your hand and notice that" PRINT "a finger is missing. Immideatly when you start screaming in your" PRINT "pains the door slams wide open. A demon steps out and slashes you into" PRINT "a little pile of bone and flesh. You are dead. Please try again." PRINT PRINT 1. Try again. IF Vaihtoehtoja THEN INPUT "?", vastaus numero = VAL(vastaus) IF numero <= 0 OR numero > Vaihtoehtoja THEN GOTO HOLE SELECT CASE numero CASE 1 SLEEP 3 GOTO ALKURUUTU END SELECT ELSE SLEEP GOTO HOLE END IF '------------------------------------------------------------------------------- KEYS: COLOR 15, 0 Vaihtoehtoja = 2 CLS PRINT "You now got a shiny golden key!" PRINT "" PRINT "What would you like to do?" PRINT PRINT 1. Go back. PRINT 2. Show inventory. IF Vaihtoehtoja THEN INPUT "?", vastaus numero = VAL(vastaus) IF numero <= 0 OR numero > Vaihtoehtoja THEN GOTO KEYS SELECT CASE numero CASE 1 GOTO FOUNTAIN CASE 2 GOSUB tpmNaytaTavarat END SELECT GOTO KEYS ELSE SLEEP GOTO KEYS END IF '------------------------------------------------------------------------------- SCARED: COLOR 15, 0 Vaihtoehtoja = 1 CLS PRINT "A huge demon attacks you in the darkness! It rips you into small slices! At last there is" PRINT "only a tiny pile of bone and flesh left on the ground. Oh dear, you seem to have gotten" PRINT "yourself killed." PRINT PRINT 1. Try again. IF Vaihtoehtoja THEN INPUT "?", vastaus numero = VAL(vastaus) IF numero <= 0 OR numero > Vaihtoehtoja THEN GOTO SCARED SELECT CASE numero CASE 1 GOTO ALKURUUTU END SELECT ELSE SLEEP GOTO SCARED END IF '------------------------------------------------------------------------------- STORY: COLOR 15, 0 Vaihtoehtoja = 1 CLS PRINT "Your grandfathers father has recently died at a high age." PRINT "During his long life he became famous and rich - and insane." PRINT "He had a huge castle in Transsylvania.Transsylvania is especially " PRINT "known for all those spooky tales,demonic inhabitants and other " PRINT "wierd and fascinating things. The old castle built in the 16th " PRINT "century is located deep inside a forest far away from civilization." PRINT PRINT 1. Start playing IF Vaihtoehtoja THEN INPUT "?", vastaus numero = VAL(vastaus) IF numero <= 0 OR numero > Vaihtoehtoja THEN GOTO STORY SELECT CASE numero CASE 1 GOTO ALKURUUTU END SELECT ELSE SLEEP GOTO STORY END IF '------------------------------------------------------------------------------- UNLOCKED: COLOR 15, 0 Vaihtoehtoja = 3 CLS PRINT "The gates are now unlocked." PRINT "" PRINT "What would you like to do?" PRINT PRINT 1. Step inside. PRINT 2. Show inventory. PRINT 3. Quit. IF Vaihtoehtoja THEN INPUT "?", vastaus numero = VAL(vastaus) IF numero <= 0 OR numero > Vaihtoehtoja THEN GOTO UNLOCKED SELECT CASE numero CASE 1 GOTO ENTRANCE CASE 2 GOSUB tpmNaytaTavarat CASE 3 END END SELECT ELSE SLEEP GOTO UNLOCKED END IF END.
Kiitos.
Ihan offtopicina, plussat hyvästä otsikosta sekä asiallisesti ja kohteliaasti muotoillusta viestistä. Tervetuloa putkaan :)
Edit: paitsi meinasin myös kirjottaa, että liian usein uudet keskustelijat pasteevat tänne virityksensä ilman kooditageja ja kysyvät MIKÄ TÄSSÄ ON VIKANA!!11 :P
Edit2: no tulihan ne kooditagit sieltä :)
Kiitos, PS. Käytin kyseistä ohjelmaa tehtäessa apuna Tekstipeli MAKER- editoria, vaikka olisin samaan Qbasicillä pystynyt - tosin tuntikaupalla hitaammassa ajassa.
Eli idea pelissä olisi tähän asti se, että ensin etsittäisiin avain suihkulähteestä, jonka jälkeen sillä voisi avata oven.
Tee vaikka taulukko, jossa on kaikki peliin kuuluvat tavarat. Jokaisen tavaran yhteydessä on tieto, missä huoneessa se on tai onko pelaaja jo saanut sen. Oma muuttujatyyppi (TYPE-määrityksellä) soveltuu tämmöiseen taulukkoon hyvin. Pelin laajentamisen kannalta olisi kyllä parempi, jos tapahtumat eivät olisi suoraan koodissa vaan ne ladattaisiin erillisestä tiedostosta. Nyt koodi paisuu suotta ja on täynnä samanlaisia osuuksia.
Huomenta,
Anteeksi että olen näin vajaaälyinen, mutta tämä on toinen Qbasic ohjelmani, silti olen siinä aika pitkälle päässyt, mutta en valitettavasti ymmärrä yhtään mitään taulukosta. :'( Voisikohan joku neuvoa?
Kiitos.
Dareon kirjoitti:
Anteeksi että olen näin vajaaälyinen
Tuskimpa... :)
Dareon kirjoitti:
mutta en valitettavasti ymmärrä yhtään mitään taulukosta. :'( Voisikohan joku neuvoa?
Ensihätään voisit lukea vaikkapa putkan oppaat-osion kolme QB opasta 1 2 3
Edit:
Taulukot ovat vain ryhmä samanlaisia muuttujia.
DIM Taulukko(10) AS INTEGER 'Luodaan yksitoista(0,1,2,3...9,10) INTEGER-tyypin muuttujaa, jotka ovat taulukossa.
'Taulukkoa käytetään sitten tähän tapaan Taulukko(4) = 8 'Asetetaan taulukon viidennen alkion arvoksi 8 PRINT Taulukko(4) 'Tulostetaan Taulukon viides alkio (Tulostaa: 8) PRINT Taulukko(2) 'Tulostetaan Taulukon kolmas alkio (Tulostaa: 0, sillä emme ole asettaneet taulukon kolmannelle alkiolle arvoa)
Lisää taulukoiden luomisesta ja käytöstä löytyy yllämainituista oppaista.
Huomenta taas,
Olen kyllä lukenut kyseiset oppaat, mutta niissähän ei mainita niin erityisesti taulukoista. Tarvitsisin myös sillaisen mahdollisuuden, että tavarat voisi esim. tiputtaa huoneeseen ja huonetta katsottaessa, kuvaus lisäisi mukaan tavaran, tämä alkaa mennä jo niin sotkuiseksi, että ehkä olisi parempi hankkia visual basic.
...tai java.
Dareon kirjoitti:
tämä alkaa mennä jo niin sotkuiseksi, että ehkä olisi parempi hankkia visual basic.
Ei Visual Basiciin siirtyminen kyllä tässä asiassa mitään auta. Parempi olisi, jos koodaisit alusta alkaen itse tuon, ja jättäisit pois kaikki Tekstipeli MAKERit sun muut, sillä näyttää syntyvän aika huonoa koodia minun mielestäni. Tuosta Gaxxin koodista voit ottaa mallia taulukoiden käyttöön.
Jeps, taidanpa tehdä ensin jotain vähän yksinkertaisempaa ennen kuin hyppään suoraan tällaisen projektin kimppuun, muuten mitä käytännön hyötyä tuosta taulukosta sitten olisi? Pitäisikö minun tehdä huoneetkin tuolla taulukkomuodolla, jotta saisin tavarat jotenkin heitettyä huoneeseen.. huoh.. taidan aloittaa todellakin jostain aivan perusohjelmasta.
Kiitos kuitenkin kaikille!
Dareon kirjoitti:
muuten mitä käytännön hyötyä tuosta taulukosta sitten olisi?
Pieni esimerkki taulukoiden kätevyydestä:
Jos sinun pitää tarkistaa, mitkä joistakin tietyistä muuttujista ovat arvoltaan esimerkiksi 4, voit tehdä tämän yksinkertaisesti, jos nämä muuttujat ovat kaikki saman taulukon alkioita.
Esim:
DIM Arvot(100) As INTEGER DIM C AS INTEGER DIM ArvojenMaara AS INTEGER Arvot(1) = 5 Arvot(4) = 4 Arvot(68) = 13 Arvot(98) = 4 Arvot(99) = 8 FOR C = 0 TO 100 IF Arvot(C) = 4 THEN 'Jos muuttujan arvo on 4 ArvojenMaara = ArvojenMaara + 1 'Kasvatetaan löydettyjen arvojen määrää yhdellä END IF NEXT C PRINT ArvojenMaara 'Tulostaa: 2
Saattaa tuntua hieman teennäiseltä esimerkiltä, mutta en keksinyt tähän hätään parempaakaan.
Tuollainen ei olisi mahdollista tehdä, jos käyttäisit vain muuttujia.
Moniulotteiset taulukot ovat käteviä myös karttojen/kenttien tallennukseen.
Taulukkoja käyttämällä riittää, että kirjoitat tietyn koodinpätkän kerran. Muuttujien kanssa jokaista muuttujaa kohden pitää kirjoittaa oma koodi. Jos vaikka haluat listata pelaajalla olevat tavarat, taulukkototeutus menisi suurinpiirtein näin:
FOR i% = 0 to tmaara% IF tavarat(i%).pelaajalla THEN PRINT "Pelaajalla on " + tavarat(i%).nimi END IF NEXT
Muuttujilla koodia pitäisi täydentää jatkuvasti, kun peliin tulee uusia tavaroita, ja se venyisi vaikka kuinka pitkäksi.
IF avain.pelaajalla THEN PRINT "Pelaajalla on avain" END IF IF kyna.pelaajalla THEN PRINT "Pelaajalla on kynä" END IF IF pyssy.pelaajalla THEN PRINT "Pelaajalla on pyssy" END IF ' jne.
mikeful kirjoitti:
Moniulotteiset taulukot ovat käteviä myös karttojen/kenttien tallennukseen.
Miten niitä kenttiä/karttoja voi tehdä taulukkoon?
No kätevin tapa on lukea tiedostosta, jossa ne on tallennettu jotenkin sopivasti, esim:
0001100 0011020 0011000 0110200 0110000
Tuossa voisi olla vaikka 0 = ruohoa, 1 = vettä ja 2 = puu
Blaze kirjoitti:
No kätevin tapa on lukea tiedostosta, jossa ne on tallennettu jotenkin sopivasti, esim:
0001100 0011020 0011000 0110200 0110000
Paitsi että et saa kuin 9:än esinettä :) ja sitten tuloo vaikeemmaksi tai siis vaikeammaksi ja vaikemmaksi miten sen nyt sitten ottaa ..
No tuo nyt oli esimerkki. Ajattelin, että pointti selviäisi paremmin tuollaisen yksinkertaisen esimerkin kautta. Saman voi toki vaikka tehdä binäärimoodissa, jolloin saa 256 erilaista palikkaa. Tai sitten tallentaa useammalla numerolla kaikki luvut, jolloin taivas on rajana.
qwauk kirjoitti:
Paitsi että et saa kuin 9:än esinettä :) ja sitten tuloo vaikeemmaksi tai siis vaikeammaksi ja vaikemmaksi miten sen nyt sitten ottaa ..
No saahan Integer taulukkoon niin monta eri palikkaa (arvoa) kun Integer muuttuja antaa myöten (en muista nyt mikä oli suurin luku).
eli siis yks taulukon solu vastaa yhtä ruutua kentällä:
Yhtä solua voidaan ajatella myös yhdeksi erilliseksi muuttujaksi.
Esim:
Dim mappi(10,10) as Integer Mappi(0,0) = 32000 Mappi(0,1) = 0 Mappi(0,2) = -9 ... Mappi(10,10)=59 For x = 0 to 10 For y = 0 to 10 if mappi(x,y) = 0 then Piirretään joku esine end if next y next x
Et semmosta
[muoks] Itse pää asia jäi ;D
Niin siis tiedostosta ladattaessa tai tallennettaessa on kaksi vaihtoehtoa (tai on vaarmaan useempikin mut..). joko jokainen solu ladataan ja tallennetaan omalla Input #1, mappi(x,y)/Print #1, mappi(x,y) komennoilla for next silmukassa. (tiedoston kaksi ekaa "kenttää" voisi olla vaikka kartan koko). Tai sit tallettaa pötköön käyttäen jotain välimerkkiä. (mut tässä tapauksessa joutuu käyttämään parseria)
Aihe on jo aika vanha, joten et voi enää vastata siihen.