Elikkäs olisin tässä kokeilemassa pikkasen pelin tekoa C++:lla. Täältä näyttää puuttuvan aikalailla ohjeet c++:n käyttöön mutta Qbasicille on oma peliohjelmointi tutoriaali. Aattelin tässä nyt c++ kurssin ohessa kyhätä c++ käännöksen tuosta pelitutoriaalin merkkigrafiikka pelistä ja kaipaisin apua.
Elikkäs homma kulkee kutakuinkin samaa malliin kuin basicilla mutta mitenkä...
-Ruudun leveys? [Width komento on basicissa]
-Locate komennon vastine?
-ilmeisesti C++:ssa ei ole Do-Until loop vaan pelkästään while?
-InKey vastine C++?
Tässä nyt näin aluksi kysymykset. C++:sta on vasta alkeet hallussa mutta tästä se taito lähtee kasvuun kun kokeilee vaan tehdä. Mitenkä on, kannattaako ylipäätään lähteä tekemään tällälailla Basicista kääntäen vai ihan eri malliin? Oliot ovat varmaan oleellisia tälläisissä sitten kun projekti kasvaa mutta noin muuten onko mitään huomioitavaa C++ ja Basicin eroja?
Veikkaanpa, että tarvitsee jotain kirjastoa, kuten PDCureses(Windows), ja NCurses(Linux), jotta tämä onnistuu.
itse olen tehnyt char taulukon jota olen käyttänyt näytön merkkien säilyttämiseen ja sitten piirtänyt sen kerralla tyyliin
char naytto[25][80]; //konsoli on suunnilleen 25 riviä ja 80 merkkiä, mutta kokeile itse void piirra_naytto() //piirtä merkit konsoliin { for(int y=0;y<25;y++){ //käydään jokainen rivi läpi for(int x=0;x<80;x++) //jokainen merkki cout<<naytto[y][x]; //Tulostetaan cout<<endl; //rivin vaihto } } int main() { naytto[10][10] = 'a'; //asetetaan merkki kohtaan 10,10 naytto[12][4] = 'f'; //asetetaan toinen merkki kohtaan 12,4 piirra_naytto(); return 0; }
kirjastoja.... hmm... Elikkäs ne sisältää komentoja joita voi sitten käyttää omassa ohjelmassa, eikö? Käytetään kuten iostream eli #include <kirjasto>... Onko näille kirjastoille joku kätevä paikka mistä nämä saa ja vielä jos olisi joku sivusto mikä listaisi mitä missäkin on niin helpottaisi elämä kummasti.
C++:lla ja QBasicilla on kyllä eroa aika lailla, eikä QB:n periaatteita aina kannata väkisin kääntää C++:lle. Lukemalla kirjoja tai muita oppaita ja lähtemällä alkeista oppii parhaiten; ensin kannattaakin tyytyä ainoastaan esim. iostreamin käyttöön. Kokeile vaikka netistä löytyviä esimerkkejä, muutat niitä, tarkkailet muutoksia ohjelman toiminnassa ja sovellat niitä sitten omissa ohjelmissa. Ja noihin kysymyksiin:
-Width ja locate eivät sisälly c++-standardiin, squidin mainitsemat kirjastot ovat hyviä merkkipohjaisiin ohjelmiin.
-Do-until -komentoa vastaava c++:ssa on do-while, esim:
int a=0; do { a++; }while (a < 10);
-Näppäinten lukukaan ei kuulu standardiin, PD- ja NCursesista varmaankin löytyy siihen funktiot, Windowsille ohjelmoitaessa voi käyttää Winapin GetAsyncKeyState-käskyä, peliohjelmoinnissa SDL:llä, OpenGl:llä ja Directx:llä on omat funktiot jne...
Tuskasaa, mutta eiköhän tämä projekti lähde näillä eväillä käyntiin ja loppu tulee sitten varmaan opiskeltua tuon c++ kurssin ohessa.
Sanoisin, ettei kannata lähteä kirjoittamaan opasta itselleen heikosti tunnetulla kielellä, jos ei ole kummempaa ohjelmointikokemusta. Sitä paitsi yleispätevää tapaa ei ole pelkällä C++:lla, kun ruudun leveys voi olla mitä tahansa, eikä C++ sisällä sen muuttamiseen funktiota.
Jos "pelkällä" C++:lla haluaa tehdä pelejä, kannattaa tehdä pelkästään tekstipohjaisia pelejä. Voihan sitä luoda ASCII-grafiikkaa, mutta siinä vaiheessa kannattaa ehdottomasti tutustua johonkin grafiikkakirjastoon. Itse käytän Allegroa, joka toimii Windowsissa, Linuxessa ja MacOSX:ssä. Lähes samat koodit toimii sellaisenaan kaikissa järjestelmissä.
Tältä näyttää ohjelma, joka ei tee muuta kuin kirjoittaa oranssilla tervehdystekstin grafiikkaikkunaan:
#include <allegro.h> void init(); void deinit(); int main() { init(); textout(screen, font, "Welcome to Allegro", 100, 50, makecol(255, 128, 0)); while (!key[KEY_ESC]) { /* put your code here */ } deinit(); return 0; } END_OF_MAIN(); void init() { int depth, res; allegro_init(); depth = desktop_color_depth(); if (depth == 0) depth = 32; set_color_depth(depth); res = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0); if (res != 0) { allegro_message(allegro_error); exit(-1); } install_timer(); install_keyboard(); install_mouse(); /* add other initializations here */ } void deinit() { clear_keybuf(); /* add other deinitializations here */ }
Jotta tämä toimii, allegron kirjasto pitää olla käännettynä ja linkitettynä. allegro.h pitää tietenkin myös olla oikeassa hakemistossa. Allegro on kirjoitettu C:llä, mutta se sopii aika kivuttomasti C++:lla ohjelmoivalle.
Heh, täällä taas. Nyt peliprojekti ottaa Tetriksen muodon. Aattelin että se on sopivan simppeli homma rakentaa. Elikkäs ongelma kohtina on seuraavat:
-Inkey$ -vastine C++ ja miten sitä käyttää
-Randomize ja Timer ja niiden käyttö (nämä kyllä on helppo katsoa itsekkin mutta kysytään nyt kuitenkin)
-DOS-boxin mitat? Näkyy yllä mutta entä miten saan DOS-boxin koko ruudulle suoraan ohjelman käynnistyessä?
Tässä nämä pääongelmat. Muuten homma on mietitty aika valmiiksi jo. Kiitoksia jo etukäteen.
Kuten täällä muistaakseni jo aiemmin sanottiin, niin pelkkä yleispätevä C++ ei tuohon riitä, ja siksipä onkin aika turhaa käsitellä tällaisia C++-peliohjelmointioppaassa. Tuolta opasosiosta löytyy NCurses / PDCurses -opas. Myöskään konsolin asetuksiin ei C++:lla ole mitään sanomista; toimiihan samainen C++ myös DOSissa, jossa ei mitään ikkunavaihtoehtoa ole.
Mitään Randomize-funktiota ei ole standardi-C++:n kirjastoissa. (Et kai käytä Borlandia?) Timer ei myöskään kuulosta tutulta...
Metabolix kirjoitti:
Kuten täällä muistaakseni jo aiemmin sanottiin, niin pelkkä yleispätevä C++ ei tuohon riitä, ja siksipä onkin aika turhaa käsitellä tällaisia C++-peliohjelmointioppaassa. Tuolta opasosiosta löytyy NCurses / PDCurses -opas. Myöskään konsolin asetuksiin ei C++:lla ole mitään sanomista; toimiihan samainen C++ myös DOSissa, jossa ei mitään ikkunavaihtoehtoa ole.
No, en mielellään ala kikkailemaan kirjastojen kanssa kovinkaan paljon. Kai tämä nyt on mahdollista äärimmäisen yksinkertaisesti. Tekee palikka-olion joka tippuu sitten dos-boxissa alas pelikentällä. (menee samaan malliin kuin VB:n oppaassa). On tämä kömpelö tapa mutta näin opettelun kannalta ajattelin tehdä. Eikö C++:ssa ole mitään millä tulkita mitä näppäintä käyttäjä painoi?
lainaus:
Mitään Randomize-funktiota ei ole standardi-C++:n kirjastoissa. (Et kai käytä Borlandia?) Timer ei myöskään kuulosta tutulta...
Käytän visual c++ tai Bloodshed dev-c++. Nämä funktiot olivat Basicissa mutta mikä olisi niitä vastaava juttu c++:ssa. En pyri tekemään mitään hienoa vaan kokeilla miten täälläinen yksinkertainen juttu toimisi C:llä.
No kun C++:n näppäimenlukufunktiot odottavat, että jotakin painetaan (Basicin INPUT tjsp). Tietysti voi yrittää käyttää conio.h:sta löytyvää getch-funktiota, mutta sekään ei ole C++:n standardia. Sitten pitää muistaa lisätä linkitettäväksi conio.o. (Projektin asetuksista, Linker ja jotakin...)
Mitäs täällä oikein höplötetään. "Randomize timer" on C:ksi srand(time(NULL)); ja sama toimii myös C++:ssa.
Tosin jos lähtötiedot ovat sitä luokkaa että etsitään qbasic-käskyille "c++-vastineita", niin kannattaa ihan suosiolla ottaa avuksi jokin kirjasto niiden merkkien lukuun ja piirtoon eikä edes yrittää väsätä lowlevel-pääterajapintaa itse :) Niin, ja C++:n opiskelu on vähemmän turhauttavaa, jos on opetellut ensin tavallisen C:n.
Onhan time() funktio olemassa C++:ssa kanssa. No jos ei ole, niin jotain sinne päin.
viznut kirjoitti:
"Randomize timer" on C:ksi srand(time(NULL)); ja sama toimii myös C++:ssa.
Köh. Ei tässä suinkaan olla kelloa satunnaistamassa, vaan satunnaisgeneraattoria alustamassa. Eli haettu fraasi on "seed random generator with the current time".
Juju piileekin siinä, että QBASIC-komento kuuluu juuri "RANDOMIZE TIMER".
Niin, QBasic:in "RANDOMIZE TIMER" alustaa sen satunnaislukugeneraattorin.
Zmyrgel: Ei ehkä kannata ajatella C/C++ koodia QBasic-koodina.
Ja esimerkiksi https://www.ohjelmointiputka.net/oppaat/opas.
http://www.nic.funet.fi/c opas/
tuolta löytää oikeastaan kaiken muun, paitsi ncursesin käytön, mutta sivuston tekijä vastaa nopeasti oikeastaan kaikkiin kysymyksiin, nimim. Kokemusta on. PALJON.
Megant kirjoitti:
Zmyrgel: Ei ehkä kannata ajatella C/C++ koodia QBasic-koodina.
Ja esimerkiksi https://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=cohj_4 tuolla on satunnaisluvuista.
En ajattelekkaan sitä QBasic-koodina. Tiedän vaan QBasicista enemmän kuin C++:sta. Esim tiedän että ko. ongelmaan tarvitsen jonkin ajastimen (odotetaan joku tietty aika jatketaan ohjelman suoritusta sen jälkeen) ja random numeroita arpovan funktion (satunnaisuuksiin luonnollisesti). Eli Timer ja Randomize Basicissa tai jotain sinnepäin. En tiedä mitkä ko. funktiot ovat C++:ssa ja miten niitä käytetään joten kysyin.
Tuo ajastin on vielä hakusessa mutta tuossa linkissäsi oli kyllä tuo satunnaisluvut esitetty ihan kivasti.
Mutta juuri tuo, että "mikä ko. funktio on C++:ssa". Kun C++:ssa ei missään tapauksessa ole juuri tuota kyseisen kaltaista funktiota.
C++:ssa muutenkaan ei ole järjestelmäriippumatonta sekuntia tarkempaa ajastusta. DOSissa on omat funktionta (jotia mm. QB käyttää), Windowsissa (windows.h) on GetTickCount tai pienen säädön jälkeen timeGetTime ja sen kaverit, joilla pääsee millisekuntin tarkkuuteen. UNIX-puolelta löytyy funktiot periaatteessa nano- tai ainakin mikrosekuntien mittakaavaan (sys/gettime.h, clock_gettime tai gettimeofday).
Aihe on jo aika vanha, joten et voi enää vastata siihen.