View Full Version : [ANSI C] cerco istruzioni!
ciao ragazzi...
sto cercando istruzioni o funzioni che siano l'equivalente di queste istruzioni in pascal:
gotoxy()
textcolor()
backgroundcolor()
a:=readkey;
keypressed
spero mi possiate aiutare ^^
uso dev-cpp e vorrei non dover utilizzare librerie non standard.. grazie :D
in ANSI C non ci sono, dovresti appunto usare librerie non standard. l'unica per la quale puoi trovare una cosa analoga é la readkey: non so se la readkey mostri l'echo e attenda Invio, ma in C c'é la getchar (che fa entrambe le cose).
quindi in ansi c non potrei nemmeno scrivere al centro dello schermo??
speravo di finire il tetris text based che avevo iniziato in pascal anni fa... :(
banryu79
28-10-2009, 14:19
speravo di finire il tetris text based che avevo iniziato in pascal anni fa... :(
Finirlo in Pascal? :stordita:
nah ho smesso con certe cose... volevo considerarlo come un esercizio in vista dell'esame di informatica a :D
quindi in ansi c non potrei nemmeno scrivere al centro dello schermo?? in ANSI C non esiste il concetto della console, esiste il concetto degli standard streams: lo standard input, lo standard output e lo standard error; parliamo dello standard output. in quanto stream di output l'unica cosa che puoi fare con lo standard output é buttarci dentro tutti i caratteri che ti pare, poi a seconda del mezzo su cui é mappato l'stdout otterrai determinati effetti collaterali: se gli standard streams sono rediretti sulla console vedrai i caratteri stampati in ordine sulla console, se sono rediretti su un file otterrai un file di testo, e cosi via. l'esempio del file di testo dovrebbe farti capire l'errore concettuale nel voler scrivere in posizioni arbitrarie della console e modificare quello che hai scritto in precedenza: come si dovrebbe vedere una partita del tuo tetris se il tuo programma venisse avviato con stdout rediretto su file? il problema é che tu vuoi gestire un cursore sullo schermo, ma non c'é nessun cursore: lo stream é un pozzo senza fondo, ci puoi solo scrivere, non ha cursore.
una cosa che potresti tuttavia fare é quella di assumere che la console sia grande 80x25 caratteri (cioé che abbia 25 linee di testo e che ogni linea possa contenere 80 caratteri) che sono le dimensioni classiche, e stampare molto velocemente intere schermate da 80x25; per evitare il flickering devi lavorare sul buffering dello standard output (prova a consultare la documentazione di setvbuf, non mi ricordo se é quella che possa fare al caso tuo). in tal modo nell'esempio del file di testo la tua partita di tetris verrebbe stampata come una marea di schermate in successione (sarebbe un file enorme :asd: ).
tutto sommato a me non sembra schifosissimissimo come approccio, se vuoi assolutamente realizzare un tetris senza GUI e senza grafica accelerata ma solamente in ASCII mi sembra la soluzione migliore; il fatto che possa sembrare schifosa dipende dal fatto che i videogames non si fanno in ANSI C :D peró resta comunque un ottimo esercizio didattico.
in ANSI C non esiste il concetto della console, esiste il concetto degli standard streams: lo standard input, lo standard output e lo standard error; parliamo dello standard output. in quanto stream di output l'unica cosa che puoi fare con lo standard output é buttarci dentro tutti i caratteri che ti pare, poi a seconda del mezzo su cui é mappato l'stdout otterrai determinati effetti collaterali: se gli standard streams sono rediretti sulla console vedrai i caratteri stampati in ordine sulla console, se sono rediretti su un file otterrai un file di testo, e cosi via. l'esempio del file di testo dovrebbe farti capire l'errore concettuale nel voler scrivere in posizioni arbitrarie della console e modificare quello che hai scritto in precedenza: come si dovrebbe vedere una partita del tuo tetris se il tuo programma venisse avviato con stdout rediretto su file? il problema é che tu vuoi gestire un cursore sullo schermo, ma non c'é nessun cursore: lo stream é un pozzo senza fondo, ci puoi solo scrivere, non ha cursore.
una cosa che potresti tuttavia fare é quella di assumere che la console sia grande 80x25 caratteri (cioé che abbia 25 linee di testo e che ogni linea possa contenere 80 caratteri) che sono le dimensioni classiche, e stampare molto velocemente intere schermate da 80x25; per evitare il flickering devi lavorare sul buffering dello standard output (prova a consultare la documentazione di setvbuf, non mi ricordo se é quella che possa fare al caso tuo). in tal modo nell'esempio del file di testo la tua partita di tetris verrebbe stampata come una marea di schermate in successione (sarebbe un file enorme :asd: ).
tutto sommato a me non sembra schifosissimissimo come approccio, se vuoi assolutamente realizzare un tetris senza GUI e senza grafica accelerata ma solamente in ASCII mi sembra la soluzione migliore; il fatto che possa sembrare schifosa dipende dal fatto che i videogames non si fanno in ANSI C :D peró resta comunque un ottimo esercizio didattico.
estremamente interessate! grazie ^.^
per quello che ho capito (sono abbastanza ignorante in materia) quello che potrei fare è riempire prima un buffer di 80x25 e poi stamparlo tutto insieme sullo schermo giusto??
estremamente interessate! grazie ^.^
per quello che ho capito (sono abbastanza ignorante in materia) quello che potrei fare è riempire prima un buffer di 80x25 e poi stamparlo tutto insieme sullo schermo giusto?? si, esattamente.
peró prima di iniziare a stampare le schermate ti conviene impostare adeguatamente il buffering: devi fare in modo che stdout bufferizzi 80*25 bytes prima di fare il flush, cosi quando avviene il flush viene inviata un'intera schermata alla console.
per stampare una schermata stampa con printf una stringa di 80*25 caratteri; se la tua schermata contiene spazi vuoti non commettere l'errore di stampare linee con meno di 80 caratteri concludendole con un newline: cosi non riempiresti tutto il buffer e sfaseresti i flush automatici, quindi usa gli spazi per riempire le celle vuote della schermata. i newline non stamparli proprio: se assumi che la console sia grossa esattamente 80x25 le linee vanno a capo da sole.
ho ricontrollato il reference della funzione setvbuf, mi pare proprio quella che fa al caso tuo. la dovresti chiamare cosi: setvbuf(stdout, NULL, _IOFBF, 80 * 25);
fflush(stdout);
fflush serve a svuotare il buffer prima di stampare la prima schermata. queste due istruzioni vanno eseguite immediatamente prima di stampare la prima schermata di gioco ma non prima, altrimenti cominceresti ad usare le modalitá di buffering di gioco per stampare altre cose (menu?) e il risultato sarebbe che non vedresti nulla finché non stampi 80*25 caratteri, newline inclusi.
maggiori dettagli sulla setvbuf: http://www.linuxmanpages.com/man3/setvbuf.3.php
le altre funzioni che vedi descritte sono implementate al di sopra della setvbuf, che é quella principale; non usare le altre perché tra quelle che ti sono utili la setvbuf é l'unica conformante allo standard ANSI C.
altra cosa: evita di stampare caratteri ASCII del set esteso, quindi stampa solo caratteri con codice compreso tra 0 e 127 inclusi. il motivo é che la console di Windows non é propriamente ASCII ma ANSI, che significa che i codici ASCII del set esteso sono mappati su caratteri diversi a seconda della codepage impostata.
altra cosa ancora :D
non stampare cosi: printf("... schermata ...");
stampa cosi: printf("%s", "... schermata ...");
giusto per evitare che la printf becchi qualche falso format code se per qualche motivo durante lo sviluppo ti capita di stampare dei % nelle schermate :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.