Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: ASCII -pelit

Sivun loppuun

AdeRide [07.07.2004 12:09:28]

#

OK... Oon tässä kauan jo miettinyt kuinka ne ascii pelit tehdään, kun sellainen ovela kuva kerrallaan tapahtuva kova töinen piirtely ei voi olla se oikea vaihtoehto. Voisiko joku, joka on joskus tehnyt ASCII -pelin antaa jotain oivallisia vinkkejä?

Ois kiva joskus vääntää sellainen ASCII -peli.

Kiitos vastauksista jo etukäteen.

Kieli oli tosissaan C++.

Aruviel [07.07.2004 15:12:03]

#

En ole koskaan tehnyt ASCII-graafista peliä ja vähän hämärän peitossa näiden teko on minullekin.

*NIX-puolella kannattaa selvästikin tarkastaa ncurses-kirjasto. Windows-puolesta en tiedä, mutta olen sellaisen kuvan tässä viime päivinä saanut, että conio.h:lla pystyy joitain tuollaisia juttuja tekemään? Ja jos tarkoitat ASCII-peleillä esim. Adomia tai Nethackia, niin ehkäpä kannattaa vilkuilla nethackin lähdekoodia?

Nethackin kotisivut latauslinkkeineen löytyvät osoitteesta: http://www.nethack.org

AdeRide [07.07.2004 16:32:35]

#

Tarkoitan juuri sellaisia NetHack tyylisiä.

Kiitos vinkistä.

hunajavohveli [07.07.2004 16:57:56]

#

Eipä noissa ASCII-peleissä mitään ihmeellisempää vaikeutta pitäisi olla. Tarkistukset ja muut tehdään ihan samalla tavalla kuin tile-grafiikka-peleissä, paitsi että "tilet" ovat vain ASCII-merkkejä. Nehän saa yksinkertaisesti piirrettyä vaikka coutilla ja tarkan paikan voi määrittää conio.h:sta löytyvällä gotyxy(x,y)-komennolla. Jonkinlaista kokemusta tile-pelien ohjelmoinnista yleensäkin pitäisi silti olla, jos jotain Adomin, tai Nethackin tapaista yrittää tehdä. Olen huomannut, että ihan perusmoottorikin vaatii monesti yllättävän paljon.

AdeRide [11.07.2004 16:52:42]

#

En saanut toimimaan tuota gotoxy() -funktioo vaikka laittoinkin sen conio.h otsikkotiedoston. Oisko tuo mahdollista, että se ei toimi kun mun kääntäjä on Microsoft Visual C++ 6.0.

hunajavohveli [11.07.2004 17:12:45]

#

Joo, näinhän se on:

Borland C++ 5.0 Help kirjoitti:

Note: Do not use this function for Win32s or Win32 GUI applications.

Eli jos VC++ on olipohjainen(?), ja pitäisi piirtää formille, niin sitten ei pelaa, sillä gotoxy() toimii kai ainoastaan konsolissa, tai miksi sitä nyt sanotaan.

thefox [13.07.2004 00:12:32]

#

Kyllä VC++:lla voi tehdä myös ei-oliopohjaisia sovelluksia sekä konsoliohjelmia. Konsoliohjelmat voivat olla myös oliopohjaisia.

gotoxy() ei toimi MSVC++:ssa siitä yksinkertaisesta syystä että MSVC++:n conio ei tuota funktiota sisällä.

Deewiant [16.07.2004 13:37:58]

#

Aruviel kirjoitti:

*NIX-puolella kannattaa selvästikin tarkastaa ncurses-kirjasto. Windows-puolesta en tiedä, mutta olen sellaisen kuvan tässä viime päivinä saanut, että conio.h:lla pystyy joitain tuollaisia juttuja tekemään?

Conio.h:n ongelmana on se, että suurin osa sen oikeasti kätevästi funktioista löytyy ainoastaan Borlandin versiosta. Mainitsemasi ncurses on todellakin kätevä, ja siitä löytyy jonkinlainen versio Windowsillekin, nimittäin PDCurses, eli Public Domain Curses.

Itse teen sillä juuri jonkinlaista pelintynkää, josta pitäisi joskus ehkä tullakin jotain. Lopputuloksen on tarkoitus olla kuitenkin graafinen, mutta voin tehdä perusenginen ja muun sälän näin aluksi PDCursesia käyttämällä.

[offtopic]Lisäetuna on myös se, että voin työstää projektiani kesämökillä 486- (vai 386-?) läppärilläni, joka ei todellakaan pyörittäisi mitään DirectX-vermeitä nykivällä Windows 95:llaan.[/offtopic]

Aruviel [16.07.2004 19:27:46]

#

Halleluja ja aivan valtaisat kiitokset sinulle! Minä olinkin jo ehtinyt surra sitä, että ncursesia ei ole Windowsille ollenkaan. Voin portata näitä omia purkkaviritelmiäni kaverille näytettäväksi ;). (Hän ihan itse pyysi saada nähdä niitä).

Oletko miten pitkällä jo enginen teossa? Minullakin on ollut sellainen vähän erilainen engine (ei sisältänyt edes sitä merkkigrafiikkaa, mutta komentoja ja taistelua jne), mutta nyt kun löysin ncursesin, taidankin alkaa vääntämään jotain merkkigraafista hökötystä. Kiinnostaisi siis tietää:

1) Luolastogeneraattori. Onko tällaisen luomiseen jonkinlaista pientä tutoriaalia? Olen tällä hetkellä aivan pihalla, millä tavalla näitä voisi generoida. Tavoitteena siis olisi satunnaisuutta, mutta luolastot kuitenkin olisivat kohtalaisen loogisia rakenteeltaan. (Adom/Nethack) Tämä on ehkä se kaikkein suurin ongelma, joka minun päätäni on vaivannut näiden ASCII-pelien kanssa.

No, ei nyt sitten tullutkaan kuin yksi kysymys :).

Metabolix [16.07.2004 19:39:38]

#

Olen tuollaista generaattoria tuossa taannoin väsännyt, ihan ilman tutoriaaleja. Siksi se ei varmaan onnistunutkaan. Kuitenkin hyvä lähtökohta on aloittaa siitä, mistä luolaan tullaan. Ensin voi vaikkapa tehdä pelkästään systeemin, joka tekee tyhjää luolastoa sopivasti haaraillen ja sopivan levyisenä, esim. että valitsee suunnan ja tekee tietyn levyistä käytävää sinne päin jonkin matkaa. Sitten vasta myöhemmin asettelee ovet, pylväät yms. Voi olla hyvä myös tehdä joistakin rakenteista prototyyppejä, joita voi sitten heivata sinne tänne.

Jotenkin noin se kai Diablo ykkösessä toimii, koska sali on aina samanlainen ja välillä näkee vierekkäin oven ja holvikaaren tms. :D

Deewiant [17.07.2004 15:24:14]

#

Aruviel kirjoitti:

Oletko miten pitkällä jo enginen teossa?

Vasta aloittelen, projekti on nääs aika uusi, ja toimii samalla minulle C:n/C++:n opetteluna. Primitiivistä menua olen työstänyt varmaan kaksi viikkoa, ja hion sitä vieläkin :D

lainaus:

1) Luolastogeneraattori. Onko tällaisen luomiseen jonkinlaista pientä tutoriaalia? Olen tällä hetkellä aivan pihalla, millä tavalla näitä voisi generoida. Tavoitteena siis olisi satunnaisuutta, mutta luolastot kuitenkin olisivat kohtalaisen loogisia rakenteeltaan. (Adom/Nethack) Tämä on ehkä se kaikkein suurin ongelma, joka minun päätäni on vaivannut näiden ASCII-pelien kanssa.

Sinun pitäisi varmaankin lukea Nethackin sourcea. Itselläni ei tuota ongelmaa ole, ensinnäkin siksi, että kuten jo kerroin, lopputuloksen tulisi olla graafinen, ja lisäksi ajattelin piirtää levelit itse. Muistin tosin Gametutorialsissa nähneeni jonkin tällaisen, ja siinähän se on (kohta "Maze"). Generoi tosin ihan perus-luolaston, jossa on joko tyhjää tilaa tai seinä, ja kaiken lisäksi käyttää Windows-funktioita. Ehkä se kuitenkin auttaa sinua.

hunajavohveli [17.07.2004 19:47:54]

#

lainaus:

1) Luolastogeneraattori. Onko tällaisen luomiseen jonkinlaista pientä tutoriaalia? Olen tällä hetkellä aivan pihalla, millä tavalla näitä voisi generoida. Tavoitteena siis olisi satunnaisuutta, mutta luolastot kuitenkin olisivat kohtalaisen loogisia rakenteeltaan. (Adom/Nethack) Tämä on ehkä se kaikkein suurin ongelma, joka minun päätäni on vaivannut näiden ASCII-pelien kanssa.

Ei luolastogeneraattorin tekeminen kovin vaikeaa pitäisi olla. Minä ainakin sain ihan kunnollisen kehitettyä ilman tutoriaaleja. Periaatteenani oli siis että arvoin ensin suurempia huoneita, jonka jälkeen arvoin käytäviä huoneesta toiseen, joista osa tietysti päättyi umpikujaan. Sanoisin, että tuollainen kannattaa tehdä alusta alkaen itse. Itse ainakin olen vakaasti päättänyt olla katsomatta mitään pelimekaniikkaan liittyviä ohjeita, niin olen oppinutkin ohjelmoimaan paljon paremmin.

Aruviel [17.07.2004 19:52:52]

#

Graafinen lopputuloshan ei myöskään pakota ennaltamääriteltyyn luolastoon, joten ymmärsin asian väärin. Kiitoksia tuosta linkistä, kävin tsekkaamassa asian. Ensimmäinen maze näytti ainakin kuvan perusteella täysin randomilta, jollaisen minäkin olen tehnyt (Jossa vieläpä ilkeä G jahtaa pelaajaa jääräpäisesti ;). Seuraava maze-tuto näytti lukevan tiedostosta tuon luolaston.

Taidan kuitenkin lähteä näin aluksi keksimään pyörää uudestaan, Metabolixin vinkki sai aivot raksuttamaan ja eräänlainen idea minulla onkin jo, kiitos siitä.

Ja lisäksi: Tarkoitin luolaston loogisuudella sitä, että ne käytävät menisivät kohtalaisen johdonmukaisesti sinne-tänne. Eli ei "hirveitä mutkia ja yllättäen umpikuja" labyrinttihirvityksiä, jos ymmärrätte mitä tarkoitan. En ollutkaan vielä miettinyt näitä ovia ja muita sellaisia, mutta se tuntuisi nyt olevan aika vähäpätöinen ongelma. Ilmoittelen, jos saan homman toimimaan ja jaan tietouteni teidän kanssa ;).

Deewiant [17.07.2004 20:05:04]

#

Aruviel kirjoitti:

Graafinen lopputuloshan ei myöskään pakota ennaltamääriteltyyn luolastoon, joten ymmärsin asian väärin.

Huomasin tuon itsekin, kun luin viestäni uudelleen. Eihän se, että teen homman lopuksi graafiseksi tarkoita, etten voisi/aio tehdä levelini satunnaisesti.

lainaus:

Ja lisäksi: Tarkoitin luolaston loogisuudella sitä, että ne käytävät menisivät kohtalaisen johdonmukaisesti sinne-tänne. Eli ei "hirveitä mutkia ja yllättäen umpikuja" labyrinttihirvityksiä, jos ymmärrätte mitä tarkoitan.

Kaipa tuon voi tehdä aika helpostikin, eli vaikkapa niin, että käytävä generoidaan vain, jos sillä tai viereisellä rivillä/sarakkeella, jota generaattori käy läpi, on kaksi huonetta. Ja sitten tehdään vain mahdollisimman suora viiva.

Tai, näin jälkeenpäin ajatellen, eihän niiden tarvitse olla edes samoilla riveillä/sarakkeilla. Generaattorin tulee vain valita kaksi huonetta, joiden välissä ei ole muita huoneita, ja sitten piirtää niiden välille suoran käytävän. Tai vaikka mutkaavankin.

Kuitenkin, pointtini oli suurinpiirtein se, etteivät ne generaattorit tee mitään satunnaisia umpikujia ellei niitä käsketä, kuten olisit varmaan voinut itsekin päätellä :)

hunajavohveli [17.07.2004 20:12:55]

#

Deewiant kirjoitti:

Kaipa tuon voi tehdä aika helpostikin, eli vaikkapa niin, että käytävä generoidaan vain, jos sillä tai viereisellä rivillä/sarakkeella, jota generaattori käy läpi, on kaksi huonetta. Ja sitten tehdään vain mahdollisimman suora viiva.

Tai, näin jälkeenpäin ajatellen, eihän niiden tarvitse olla edes samoilla riveillä/sarakkeilla. Generaattorin tulee vain valita kaksi huonetta, joiden välissä ei ole muita huoneita, ja sitten piirtää niiden välille suoran käytävän. Tai vaikka mutkaavankin.

Kuitenkin, pointtini oli suurinpiirtein se, etteivät ne generaattorit tee mitään satunnaisia umpikujia ellei niitä käsketä, kuten olisit varmaan voinut itsekin päätellä :)

Joo, en usko tuollaisten lisäysten luomisen olevan kovin vaikeaa, ja C:llä kaikki tapahtuu eittämättä niin nopeastikin, ettei käyttäjä ehdi huomatakaan.

Aruviel [20.07.2004 17:24:26]

#

Olen tässä jo päässyt puun juurelta matkaan(Häh?), ja päädyin ainakin aluksi ennaltamääriteltyyn maailmaan. Ja se siitä sitten.

Jos joku asiasta kiinnostunut ei ole sattunut huomaamaan tai jotain muuta vastaavaa, niin tällainen sivusto tarjoaa paikoitellen aika mainioitakin artikkeleita liittyen roguelikejen tai vastaavien tekoon:

http://roguelikedevelopment.org/

hunajavohveli [20.07.2004 17:36:13]

#

Kyllähän tuolta pari kiintoisaa vinkkiä voisi saadakin, mutta itse jatkan kuitenkin edelleen sillä linjalla, että keksin kaiken itse alusta alkaen.

Aruviel [20.07.2004 19:07:40]

#

Ihan kunnioitettava asenne. Mutta miksi keksiä pyörää uudeestaan? Lopulta se toteuttamainen kuitenkin jää omiin käsiin, ja siinä ne asiat tulevat opittua. Tietenkin se oivaltamisen ilo ja sitä kautta eri kykyjen (Asioiden soveltaminen jne jaddajadda) mahdollinen kehittyminen voi olla eri luokkaa. Itse kuitenkin tunnen saavani kaikkein eniten irti näistä asioista, jos joku selostaa niitä minulle, minkä jälkeen voin itse soveltaa ja käyttää niitä käytännössä. Ja tuolla en viittaa itselleni helppoihin asioihin, vaan niihin vaikeisiin. "Helpot" asiat keksitään itse, jos nyt sitten tiedät, mitä minä tarkoitan ;).

hunajavohveli [20.07.2004 21:26:31]

#

No saapahan ainakin jälkeenpäin sanoa, että teki kaiken alusta alkaen itse, eikä ottanut mallia mistään valmiista moottoreista. Eikä minulla sitä paitsi siinä keksimisässä kulu aikaa juuri ollenkaan. Koodinkirjoitus on oikeastaan melkeinpä ainoa asia, josta koituu tekemistä. Enkä oikein viitsi kopioida mitään valmistakaan koodia, joten näin ollen minulla ei ohjeille ole käyttöä.

lainaus:

oivaltamisen ilo ja sitä kautta eri kykyjen (Asioiden soveltaminen jne jaddajadda) mahdollinen kehittyminen

On tietysti yksi syy siihen, miksi teen kaiken itse. Kaikeen ei löydy valmista koodia ja ohjeita, joten on hyvä oppia älymään itse, ettei jatkuvasti tarvitse olla lukemassa manuaalia. Sitä paitsi saman asian tekemiseen on useita eri tapoja. Ja olen huomannut, että oma tapa on usein se paras tapa. Ei välttämättä siksi, että se olisi toimivin, tai nopein, mutta oman koodin toimintaperiaatteen ainakin ymmärtää täysin, ja sitä on helpoin soveltaa.

Aruviel [20.07.2004 22:06:38]

#

Jokainen tallaa tyylillään.

Manuaalin lukeminen on opittu hyve. Asioiden tekemiseen on todellakin monta tapaa, ja tämän takia yksi pienoinen selostus yhdestä vaihtoehdosta tekee vain hyvää natiseville rattaille päässä. Tietty silloine ei voi enää sanoa tehneensä sen 100% itse, mutta koodi on kuitenkin omalle ohjelmalleen räätälöityä ja muotoiltua. Siispä omasta tavasta olet hyvinkin oikeassa.

Eli yritän kai viestittää, että teen itsekin työstäni kaiken *itse*. Minä vain pidän siitä, että joku on jo kehittänyt esimerkiksi paremman line of sight-algoritmin, joka on ihan yleisessä käytössä monissa ohjelmissa ja minä yritän oivaltaa, miten se teoriassa toimii. Vaikka tietäisi suunnilleen sen toimintaperiaatteen, niin se ei tarkoita automaattisesti, että olet jotenkin väkisin saanut itsesi painamaan muistiin jotain, ymmärtämättä asiasta mitään. Asioita on todellakin hyvä älytä itse. Esimerkiksi roguelikedevelopment.org:n artikkelit eivät todellakaan ole mitään "valmiita moottoreita", vaan juuri jonkinlaisia vaihtoehtoja ja ratkaisun malleja/pohjia. Ja niiden tieto ei ole valmiiksi pureskeltua, joten se täytyy vielä itse onnistua ymmärtämään, omaksumaan, käyttämään ja soveltamaan. Toki sellaisen pystyy itsekin kehittämään, mutta se vaatii jo ihan jotain muuta, eikä välttämättä se oma ajattelukaan riitä. Ja monestikaan oma ei ole, kuten sanoit, niin tehokas kuin nämä jo hyviksi todetut algoritmit. Manuaali on sellainen, missä kerrotaan kädestä pitäen, miten kaikki toimii, miksi ja heitetään yks-kaks täydellistä esimerkkiä siihen päälle. (Tai muuten se ei ole manuaali ;)

No, minun ajatukset eivät varmasti pysyneet tarpeeksi hyvin kasassa tätä kirjoittaessani, pahoittelen sekavaa rakennetta.

Mutta kuten sanoin, jokainen tyylillään. :)


Sivun alkuun

Vastaus

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

Tietoa sivustosta