Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: "Liikkuminen"

Sivun loppuun

kuutso [31.10.2009 12:29:25]

#

Eli mulla on semmonen ongelma etten tiedä miten saan tuota "matoa" liikutettua
sillee esim. et jos painan "d" niin se liikkuu oikealle kunnes painan vaikka "s" joka ohjaa madon alas. Sen tietenkin pitäisi lähteä alas siitä kohti mihin se ny sattuu jäämään.

Ja jos semmoseen viel et se tyhjentää edellisen kohan.

Tässä on tää sähläys:

#include <stdio.h>

int main(void){
    char a;
    int ylos(),alas(),vasen(),oikea();
    system("cls");
    printf("M A T O P E L I");sleep(500);system("cls");
   do{
        a=getch();
        switch(a){

                        case 'w':
                             ylos();
                             break;
                        case 's':
                             alas();
                             break;
                        case 'a':
                             vasen();
                             break;
                        case 'd':
                             oikea();
                             break;
                        case 'q':
                             exit(0);
                             break;
                        case 'Q':
                             exit(0);
                             break;
                             }
                             }while(a!='q'||'Q');

}

alas(){
       int i;
       do{
           system("cls");
           printf(".\n.\n.\n.\n");
           i++;
           }while(i<4);

}
ylos(){
       int i;
       do{
           system("cls");
           printf(".\n.\n.\n.\n");
           i++;
           }while(i<4);

}
vasen(){
        int i;
       do{
           system("cls");
           printf(". . . .");

           i++;
           }while(i<4);

}
oikea(){
        int i;
       do{
           system("cls");
           printf(". . . .");
           i++;
           }while(i<4);

}

Mod. lisäsi kooditagit

Grez [31.10.2009 12:32:31]

#

Kooditagien kanssa tuota olisi huomattavasti miellyttävämpää lukea..

Anyways, sinun pitäisi pitää ohjelman muistissa pelaajan sijainti ja kun liikutetaan niin päivitetään sijaintia. Sitten piirto tapahtuu aina senhetkisen sijainnin mukaan.

Tuo cls-viritys on vähän arveluttava. Kannattaa tutustua ..curses kirjastoihin, esim. pdcurses. cls ei kuitenkaan toimi kuin Win/DOS ympäristössä.

kuutso [31.10.2009 12:33:49]

#

Sori sori!! :PP

Teuro [31.10.2009 12:36:44]

#

Aloitetaan:

Nuo voisi korjata ensin ja sitten katsotaan lisää.

kuutso [31.10.2009 13:07:30]

#

No en tiiä. Kyl mä noi kuvat saan siihen näytölle ku painan näppäimiä.
Pitäs vaa tietää mitä tehä siit.
gotoxy:lla sais laitettuu sen kuvan menemään, mutta eipä tuo windows.h tykkää... se heittää tyylii 1000 virhettä :PPP tyylii tämmöstä
263 C:\Dev-Cpp\include\windef.h syntax error at '##' token
263 C:\Dev-Cpp\include\windef.h syntax error before '{' token


Blaah menee yli ymmärryksen.

Teuro [31.10.2009 13:13:54]

#

Hmm minulla tuo sinun antamasi koodi ei suostu kääntymään, ennen noita laittamiani korjauksia. Tämän jälkeen ohjelma kääntyy, mutta näytöllä ei näy mitään muuta kuin musta ruutu. Tällekin löytyy selitys, koska kutsut funktiota system("cls"); heti tuon tulostuksen jälkeen.

kuutso [31.10.2009 13:17:27]

#

oon tallentanu ton .c

Teuro [31.10.2009 13:20:13]

#

kuutso kirjoitti:

oon tallentanu ton .c

Niin minäkin, koska tuo oli aivan selvästi c:ä. Eikä tiedostopäätteellä ole mitään tekemistä noiden logiikka- ja muiden virheiden kanssa.

kuutso [31.10.2009 13:28:35]

#

Grez ainakin mainitsi että pitäs pitää ohjelman muistissa pelaajan sijainti.

how this goes?

Grez [31.10.2009 13:58:07]

#

No ehkä jotekin tälleen. En nyt pääse testaamaan kun cls ja conio on jotain dos-juttuja..

#include <conio.h>
#include <stdio.h>

int main(void){
    char a;
	int x=30, y=10, i;
	int suuntaX=1, suuntaY=0;
	int run=1;
	do {
        system("cls");
		for (i=0;i<y;i++) printf("\n");
		for (i=0;i<x;i++) printf(" ");
		printf("O");

		sleep(500);
		if (kbhit()) {
			a = getch();
			switch(a){
				case 'w': //ylös
					 suuntaX=0;
					 suuntaY=-1;
					 break;
				case 's': //alas
					 suuntaX=0;
					 suuntaY=1;
					 break;
				case 'a': //vasen
					 suuntaX=-1;
					 suuntaY=0;
					 break;
				case 'd':  //oikea
					 suuntaX=1;
					 suuntaY=0;
					 break;
				case 'q':  //Pois
				case 'Q':
					 run=0;
					 break;
			}
		}
		x+=suuntaX;
		y+=suuntaY;
		if (x<0 || y<0 || x>79 || y>23) {
			system("cls");
			printf("Game over");
			run=0;
		}
    } while (run);
}

kuutso [31.10.2009 14:01:06]

#

Kyllä toi toimii.

Täytyy ny tarkkaa kattoo mitä oot tehny :P

Ville [01.11.2009 11:36:15]

#

Kokeilin tuota minäkin ja toimii kunhan kommentoin tuon conio.h includin pois.
Käytössä kun on Dev-Cpp + MinGW.
Mutta tuli vain mieleen että jos kommentoin tuon conio.h:n pois ja jäljelle ei jää kuin stdio.h, niin mistä kääntäjä löytää tuon funktion kbhit()??
Sitä kun en stdio.h tiedostosta löytänyt.

Metabolix [01.11.2009 11:50:11]

#

C:ssähän funktion esittelyä ei ole pakko edes olla, vaan kääntäjä arvaa aina, että se olisi int f(), joten kbhit toimii ilmankin includeja. Toisaalta voi olla, että stdio.h:ssa on lisää include-rivejä, jotka päätyvät jotenkin myös tuon esittelyyn.

Kannattaa joka tapauksessa pitää mielessä, että kyseessä ei ole standardifunktio, joten koodi toimii todennäköisesti vain Windowsissa. (Ilmeisesti nuo funktiot ovat MSVCRT:ssä eli Microsoft Visual C++ Run-Timessa.)

Ville [01.11.2009 12:15:39]

#

Metabolix kirjoitti:

C:ssähän funktion esittelyä ei ole pakko edes olla, vaan kääntäjä arvaa aina, että se olisi int f(), joten kbhit toimii ilmankin includeja. Toisaalta voi olla, että stdio.h:ssa on lisää include-rivejä, jotka päätyvät jotenkin myös tuon esittelyyn.

Tuota, tuota. Mikäs tarkoitus niillä includeilla sitten on jos niitä ei tarvita?
Tässä näiden C:n perusteiden kanssa painiessa olen ollut siinä ymmärryksessä että ne pitää laittaa sinne jotta kääntäjä osaa ymmärtää funktioiden kutsut ohjelmasta.
Ja tästä tuleekin mieleen...
On nimittäin käynyt niin että joskus kun tuo include on vahingossa jäänyt pois, niin olen saanut virheilmoituksen ja toisessa tapauksessa homma on pelittänyt ilman minkäänlaisia ongelmia.
Onko tuo ilmiö kääntäjästä riippuva vai mistä? Käytössä siis MinGW.

lainaus:

Kannattaa joka tapauksessa pitää mielessä, että kyseessä ei ole standardifunktio, joten koodi toimii todennäköisesti vain Windowsissa. (Ilmeisesti nuo funktiot ovat MSVCRT:ssä eli Microsoft Visual C++ Run-Timessa.)

No tuo MS VC on asennettu koneelle, eli olisiko osannut sieltä hakea?

Metabolix [01.11.2009 13:17:48]

#

Ville kirjoitti:

Tuota, tuota. Mikäs tarkoitus niillä includeilla sitten on jos niitä ei tarvita?

Kannattaa ihan ensiksi selvittää, mitä include tekee ja mitä esittelyt ovat.

ANSI C:ssä funktion esittelyn puuttuessa "esittelyksi" tulee aina automaattisesti sama:
int funktio();
Ehkä arvaat, että jos funktion paluuarvo on muu kuin int, lopputulos menee aika pahasti metsään. Lisäksi tällaiselle funktiolle on mahdollista antaa väärä määrä vääriä parametreja väärässä järjestyksessä ilman, että asiasta tulee mitään huomautusta, ja tällöinkin funktio toimii aika täydellisen väärin.

C99 onneksi poisti tämän ominaisuuden, eli siinä esittely on pakollinen. Sama koskee C++:aa.

En tiedä, missä tilanteissa olet saanut tuon toimimaan omituisesti, mutta voi olla, että jokin kääntäjäsi vaatii esittelyt (tai ehkä jopa käyttää C99-standardia). Lisäksi kannattaa muistaa, että monet standardikirjaston tiedostot sisällyttävät myös toisiaan, eli jos ohjelmassasi on yksi include, saatat saada (ympäristöstä riippuen) mukaan pari ylimääräistäkin tiedostoa, jolloin niiden puuttumista ei huomaa (paitsi sitten toisessa ympäristössä).


Sivun alkuun

Vastaus

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

Tietoa sivustosta