|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Sep 2008
Città: Messina
Messaggi: 991
|
[C] Tic-Tac-Toe
Una buona giornata a tutti.
Da un paio di giorni mi cimento nello sviluppo del mio primo videogames, il più semplice da implementare molto probabilmente, al fine di migliorare la mia tecnica di stesura del codice e le interazioni tra funzioni e, perché no, per avvicinarmi al mondo dei videogiocatori. Nel codice che vi allego al seguente post noterete sia presente solo la modalità "Player vs Player", questo perché prima di proseguire vorrei chiedervi dei consigli e dei pareri in merito. Codice:
int main (void) { int tavola[10]; /* Campo di gioco */ char index = 1; /* Variabile di ingresso al ciclo infinito del menù */ system (CLEARSCREEN); /* Visualizzo schermata iniziale di scelta */ for (; index != 27;) { // 27 è il corrispettivo carattere ASCII di ESC screen_init (); fflush (stdin); index = getchar (); while (getchar () != '\n'); //Evita di far ripetere il printf successivo switch (index) { case '1': system (CLEARSCREEN); Player_vs_Player (tavola); system (CLEARSCREEN); break; case '2': system (CLEARSCREEN); printf("\n\n\n\t\tLa funzione attualmente\n\t\tnon è implementata"); getchar (); system (CLEARSCREEN); break; case '3': system (CLEARSCREEN); printf("\n\n\n\t\tLa funzione attualmente\n\t\tnon è implementata"); getchar (); system (CLEARSCREEN); break; case 'c': system (CLEARSCREEN); printf("\n\n\n\t\tLa funzione attualmente\n\t\tnon è implementata"); getchar (); system (CLEARSCREEN); break; case 'i': system (CLEARSCREEN); screen_instructions (); system (CLEARSCREEN); break; case 's': system (CLEARSCREEN); printf("\n\n\n\t\tLa funzione attualmente\n\t\tnon è implementata"); getchar (); system (CLEARSCREEN); break; default: system (CLEARSCREEN); break; } } return 0; } Altro difetto non di poco conto che ho notato. Una volta fatto accesso a qualsiasi schermata tranne Player vs Player, digitando più volte (2 o più se necessario) una delle opzioni da me scelte per gestire lo switch-case e confermando con invio invece di tornare alla schermata principale, come io mi aspetterei, entra direttamente in una delle schermate corrispondente alla scelta effettuata. Credo il problema stia nel getchar () ma come è risolvibile. Prima di procedere oltre e mettere ulteriore carne al fuoco preferirei trovare soluzione ai due dilemmi esposti. Ho il timore di non essere stato particolarmente chiaro ma alcuni concetti sono meglio esplicabili con il metodo visivo che con quello orale/testuale per questo vi invito a provare il programma.
__________________
PC/HTPC: Mac Mini 3,1 late 2009 | My Book Studio 2TB | LG M237WD monitor/tv | Logitech Z4 | Apple Magic Mouse | Apple Wireless Keyboard | Apple Remote Mobile: Samsung Galaxy Wonder i8150 cm9 |
![]() |
![]() |
![]() |
#2 |
Member
Iscritto dal: Dec 2009
Messaggi: 59
|
Usa la funzione getch () includendo la libreria <conio.h>
L'utilizzo è questo: Codice:
char c; c = getch(); Spero di esserti stato utile! ![]() |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Sep 2008
Città: Messina
Messaggi: 991
|
Quote:
![]()
__________________
PC/HTPC: Mac Mini 3,1 late 2009 | My Book Studio 2TB | LG M237WD monitor/tv | Logitech Z4 | Apple Magic Mouse | Apple Wireless Keyboard | Apple Remote Mobile: Samsung Galaxy Wonder i8150 cm9 |
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Sep 2008
Città: Messina
Messaggi: 991
|
Quote:
Codice:
Undefined symbols: "_stdscr", referenced from: _main in ccQGKLtP.o "_wgetch", referenced from: _main in ccQGKLtP.o ld: symbol(s) not found collect2: ld returned 1 exit status
__________________
PC/HTPC: Mac Mini 3,1 late 2009 | My Book Studio 2TB | LG M237WD monitor/tv | Logitech Z4 | Apple Magic Mouse | Apple Wireless Keyboard | Apple Remote Mobile: Samsung Galaxy Wonder i8150 cm9 |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Sep 2008
Città: Messina
Messaggi: 991
|
Non ho utilizzato quella dicitura ma il problema pare essersi risolto
![]() Ora mi sono accorto di un'altro difetto: Codice:
void Player_vs_Player (int *tavola) { int i, k, player = 0, /* Inizializzato a 0. */ /* Impostato ad 1 se gioca X, a 2 se gioca O */ winner = 0, /* Registra la presenza di un vincitore. */ /* Impostato ad 1 se vince X, a 2 se vince O */ move_valida; /* Verifica la validità della mossa effettuata */ char move = '0'; /* Registra l'ultima mossa effettuata */ /* Pulisco il campo di gioco */ for (k=0; k<10; tavola [k++]=0); /* Visualizzo il campo di gioco aggiornato */ screen_game (tavola); for (i=0; i<9 && winner==0; i++) { /* Aggiorno il personaggio giocante */ player = i%2 + 1; /* Inserisco una mossa e ne verifico la validità */ for (move_valida=0; !move_valida;) { printf("\n\tPlayer%d inserisce la mossa: ", player); move = getchar (); my_fflush (); if(move == 27) return; if( isdigit(move) && move>='1' && move<='9' ) { if (tavola[atoi(&move)]==0) move_valida=1; else { system (CLEARSCREEN); screen_game (tavola); printf("\n\tATTENZIONE: mossa non valida\n"); } } else { system (CLEARSCREEN); screen_game (tavola); printf("\n\tATTENZIONE: mossa non valida\n"); } } /* Visualizzo il campo aggiornato */ system (CLEARSCREEN); tavola[atoi(&move)]=player; screen_game (tavola); /* Verifico la resenza di un vincitore */ winner = verifica_winner (tavola); } /* Visualizzo a schermo il risultato della partita */ if (winner==0) printf("\n LA PARTITA E' TERMINATA IN PARITA'"); else printf("\n\t THE WINNER IS: PLAYER%d", winner); }
__________________
PC/HTPC: Mac Mini 3,1 late 2009 | My Book Studio 2TB | LG M237WD monitor/tv | Logitech Z4 | Apple Magic Mouse | Apple Wireless Keyboard | Apple Remote Mobile: Samsung Galaxy Wonder i8150 cm9 Ultima modifica di -hide- : 13-07-2012 alle 15:05. |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Sep 2008
Città: Messina
Messaggi: 991
|
Nell'utilizzo della libreria ncurses (davvero carina) sto trovando un problema nella riga che vi evidenzio nel codice:
Codice:
/* Modalita' di gioco Umano vs Umano */ void Player_vs_Player(int *tavola) { int i, k, player = 0, /* Inizializzato a 0. */ /* Impostato ad 1 se gioca X, a 2 se gioca O */ winner = 0, /* Registra la presenza di un vincitore. */ /* Impostato ad 1 se vince X, a 2 se vince O */ move_valida; /* Verifica la validita' della mossa effettuata */ char move = '0'; /* Registra l'ultima mossa effettuata */ initscr(); /* Pulisco il campo di gioco */ for(k=0; k<10; tavola[k++]=0); /* Visualizzo il campo di gioco aggiornato */ screen_game(tavola); refresh(); for(i=0; i<9 && winner==0; i++) { /* Aggiorno il personaggio giocante */ player = i%2 + 1; /* Inserisco una mossa e ne verifico la validita' */ for(move_valida=0; !move_valida;) { printw("\n\tPlayer%d inserisce la mossa: ", player); refresh(); move = getch(); if(move == 27) return; else if( isdigit(move) && move>='1' && move<='9' ) { getch(); if (tavola[atoi(&move)]==0) { /* NON FUNZIONA QUESTO CONFRONTO */ printw("\tdebug-\n"); move_valida=1; } else { erase(); screen_game(tavola); printw("\n\tATTENZIONE: mossa non valida\n"); printw("\tdebug1\n"); refresh(); } } else { erase(); screen_game(tavola); printw("\n\tATTENZIONE: mossa non valida\n"); printw("\tdebug2\n"); refresh(); } } /* Visualizzo il campo aggiornato */ erase(); tavola[atoi(&move)]=player; screen_game(tavola); refresh(); /* Verifico la presenza di un vincitore */ winner = checkwin(tavola); } /* Visualizzo a schermo il risultato della partita */ if (winner==0) printw("\n LA PARTITA E' TERMINATA IN PARITA'"); else printw("\n\t THE WINNER IS: PLAYER%d", winner); refresh(); endwin(); return; }
__________________
PC/HTPC: Mac Mini 3,1 late 2009 | My Book Studio 2TB | LG M237WD monitor/tv | Logitech Z4 | Apple Magic Mouse | Apple Wireless Keyboard | Apple Remote Mobile: Samsung Galaxy Wonder i8150 cm9 Ultima modifica di -hide- : 17-07-2012 alle 14:05. |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Sep 2008
Città: Messina
Messaggi: 991
|
up1
__________________
PC/HTPC: Mac Mini 3,1 late 2009 | My Book Studio 2TB | LG M237WD monitor/tv | Logitech Z4 | Apple Magic Mouse | Apple Wireless Keyboard | Apple Remote Mobile: Samsung Galaxy Wonder i8150 cm9 |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:20.