PDA

Visualizza la versione completa : [C] Implementazione gioco "Memory"


miscialo
23-01-2007, 18:29
ragazzi un mio amico ha questo problema da risolvere... avrebbe bisogno di consigli...
PRIMA PARTE DEL PROGETTO

Il progetto consiste nello sviluppare un programma che
permetta ad un utente di giocare al gioco del:

MEMORY

dare la possibilità di selezionare il livello di gioco con
numero di carte per riga minimo: 2, massimo: 6;
numero di carte per colonna minimo: 2, massimo 10

L'interfaccia grafica deve essere schematica (a caratteri),
ma sviluppata in modo da rendere chiaro lo stato di avanzamento
del gioco.

Sviluppare l'interfaccia grafica schematica.

All'avvio del programma deve essere richiesto
il nome dell'utente che inizia a giocare.

Predisporre una sezione chiamata help, richiamabile
in qualsiasi momento all'interno dell'applicazione, che
permetta agli utenti di conoscere le regole del gioco e le
modalità di utilizzo del programma, oltre una descrizione di
tutte le funzionalità disponibili.

SECONDA PARTE DEL PROGETTO

La seconda parte del progetto consiste in una evoluzione del
progetto che avete svolto per la prima parte. In particolare
le modifiche comprendono: lo sviluppo di nuove funzionalità e
la reingegnerizzazione del codice.

Nuove funzionalità da implementare:

Inserire tutti i controli e relativi messaggi di
errore nel caso di qualsiasi inserimento errato da
parte dell'utente

Una volta terminata la partita dare la possibilità
di giocarne un'altra senza uscire dal programma

Dare la possibilità di terminare una partita in qualsiasi
momento e ovviamente di poterne iniziare una nuova

Per ogni mossa fatta tenere traccia del tempo impiegato per
eseguirla (UTILIZZARE UNA LISTA DINAMICA)

Stampare l'elenco delle mosse fatte a fine partita

Modifiche al codice:

Utilizzo di funzioni per migliorare il codice ed evitare
inutili ripetizioni di porzioni di codice

I commenti devono seguire le seguenti specifiche:

Ogni funzione deve avere un commento prima dell'intestazione
che specifichi nell'ordine:
1.nome della funzione,
2.breve descrizione delle funzionalità,
3.elenco dei parametri in ingresso con relativo significato,
4.descrizione dell'eventuale parametro restituito.

Ad esempio:

/*
* calcolaMediaValoriArray()
* funzione che calcola la media dei valori presenti all'interno
* di un array passato come argomento alla funzione.
*
* Parametri in ingresso:
* array: vettore dei valori dei quali deve essere calcolata la media
* dim: numero di celle presenti all'interno del vettore
*
* Valore restituito:
* un float che indica la media dei valori inseriti
*/
float calcolaMediaValoriArray(int array[], int dim)
{
...
}

Inoltre per ogni variabile o costante dichiarata deve esistere un commento
che ne descriva il ruolo all'interno del programma o della funzione; e devono
essere presenti commenti all'interno del codice che descrivano le
parti più salienti.

miscialo
23-01-2007, 18:32
ha realizzato questo codice...


#include <stdio.h>
#include <stdlib.h>

#define NUM_LETTERE 46


int richiesta_nome_giocatore();
int numeroRandom(int lBound, int uBound); //Variabile di tipo integer: dichiarazione del blocco in cui verrà svolto la random
void inizio(void); //Variabile di tipo void: dichiarazione della chiamata della schermata principale del gioco
void istruzioni(void);
int main()
{
int i, j, lt; //Variabile di tipo integer: dichiarazioni delle variabili da utilizzare nei cicli successivi for
int lettereDaInserire;
int nRighe, nColonne;
int riga_carta1, colonna_carta1, riga_carta2, colonna_carta2;
int tentativi,punti,mosse_errate,mosse_corrette;
int caratteriUtilizzati[NUM_LETTERE];
char nome_giocatore[30]; //Variabile di tipo character: dichiarazione della variabile che conterrà la stringa del nome del giocatore
char caratteri[NUM_LETTERE+1] = {"ABCDEFGHILMNOPQRSTUVZWHKYJ1234567890£$^&=?!<>-"}; //Variabile di tipo character: dichiarazione dell'elenco dei caratteri da utilizzare nella random
char** matrice; //Variabile di tipo character: dichiarazione della matrice con doppio puntatore
char** gioco;
char menu1,menu2;
inizio();
fflush(stdin);
menu1 = getch();
system("cls");
/*Menu primario in cui si hanno delle scelte */
switch(menu1)
{
case '1':
{


for (i = 0; i < NUM_LETTERE; i++)
caratteriUtilizzati[i] = 0;
/* Richiesta del nome del giocatore */
puts("Inserire nome giocatore:");
scanf("%s",&nome_giocatore);
system("cls");
/* Richiesta delle righe e colonne per creazione di matrice dinamica */
printf("Numero righe: ");
fflush(stdin);
scanf("%d",&nRighe);
printf("Numero colonne: ");
fflush(stdin);
scanf("%d",&nColonne);
/*Costruzione della matrice dinamica utilizzando le variabili ottenute dall'utente*/
lettereDaInserire = nRighe * nColonne;
if (lettereDaInserire % 2 == 1 || lettereDaInserire == 0)
{
printf("\nNumero di celle non valido!");
exit(0);
}
matrice = (char **)malloc(sizeof(char*)*nRighe);
for (i = 0; i < nRighe; i++)
*(matrice + i) = (char *)malloc(sizeof(char)*nColonne);
for (i = 0; i < nRighe; i++)
for (j = 0; j < nColonne; j++)
*(*(matrice + i) + j) = ' ';
do
{
lt = numeroRandom(0,NUM_LETTERE-1);
if (!caratteriUtilizzati[lt])
{
do
{
i = numeroRandom(0,nRighe-1);
j = numeroRandom(0,nColonne-1);
}
while (*(*(matrice + i) + j) != ' ');
*(*(matrice + i) + j) = caratteri[lt];
do
{
i = numeroRandom(0,nRighe-1);
j = numeroRandom(0,nColonne-1);
}
while (*(*(matrice + i) + j) != ' ');
*(*(matrice + i) + j) = caratteri[lt];
caratteriUtilizzati[lt] = 1;
lettereDaInserire-=2;
}
}
while(lettereDaInserire > 0);
printf("\n\n");
/*Stampa della matrice per prova */
for (i = 0; i <nRighe; i++)
{
for (j = 0; j < nColonne; j++)
printf("matrix [%d] [%d] = %c\n",i,j,*(*(matrice + i) + j)); //da trascurare la stampa

}
/*Stampa della vera matrice */
int k = 0;
int n = 0;
for (j = 0; j < nColonne; j++)
{
printf(" %d",k++);
}
printf("\n");
for (i = 0; i < nRighe; i++)
{
printf("%d",n++);
for (j = 0; j < nColonne; j++)
printf(" %c",*(*(matrice + i) + j)/*= '#'*/);
printf("\n");
}

printf("\n");
printf("Menu'",nome_giocatore);
puts("");
puts("[1] - Scopri le carte\n[2] - Salva la partita\n[3] - Carica la partita");
puts("[4] - Visualizza lista mosse\n[5] - Istruzioni\n[6] - Esci");
printf("Che cosa vuoi fare, %s?\n");
menu2 = getch();
/*Menu secondario in cui si hanno delle scelte */
switch(tolower(menu2)) //Funzione switch:
{
case '1':
{
tentativi = 0;
mosse_errate = 0;
punti = 0;
mosse_corrette = 0;
puts("Carta 1:");
fflush(stdin);
scanf("%d %d",&riga_carta1,&colonna_carta1);
if (((riga_carta1>=0) && (colonna_carta1>=0)) && ((riga_carta1<nRighe) && (colonna_carta1<nColonne)))
{
*(*(gioco+riga_carta1)+colonna_carta1) = *(*(matrice+riga_carta1)+colonna_carta1);
system("cls");
for(i=0; i<nRighe;i++)
{
for(j=0; j<nColonne; j++)
printf("%c",*(*(gioco+i)+j));
printf("\n");
}
puts("Carta 2");
fflush(stdin);
scanf("%d %d",&riga_carta2,&colonna_carta2);
if (((riga_carta2>=0) && (colonna_carta2>=0)) && ((riga_carta2<nRighe) && (colonna_carta2<nColonne )))
{
*(*(gioco+riga_carta2)+colonna_carta2) = *(*(matrice+riga_carta2)+colonna_carta2);
system("cls");
for(i=0; i<nRighe;i++)
{
for(j=0; j<nColonne; j++)
printf("%c",*(*(gioco+i)+j));
printf("\n");
}
if (*(*(gioco+riga_carta1)+colonna_carta1) != *(*(gioco+riga_carta2)+colonna_carta2))
{
tentativi--;
mosse_errate++;
punti--;
printf("Hai sbagliato, ritenta!!!\n");
sleep(1000);

oregon
23-01-2007, 18:33
Chiedere genericamente dei consigli, non serve a tanto ...

Bisogna capire, passo per passo durante l'elaborazione del progetto, cosa non sa fare o su cosa ha difficolta' ...

E tu, che consigli gli hai dato?

EDIT: ho visto il codice e ho ancora piu' dubbi ... qual e' il problema?

miscialo
23-01-2007, 18:36
if (tentativi == 0)
{
printf("Siamo spiacenti, hai finito i tentativi! Ritenta!!!\n\n\n");
system("pause");
system("cls");
inizio();
}
*(*(gioco+riga_carta1)+colonna_carta1) = ' ';
*(*(gioco+riga_carta2)+colonna_carta2) = ' ';
system("cls");
for(i=0; i<nRighe;i++)
{
for(j=0; j<nColonne; j++)
printf("%c",*(*(gioco+i)+j));
printf("\n");
}
}
else
{
punti++;
punti++;
mosse_corrette++;
if (mosse_corrette == 30)
{
puts("Complimenti!Hai completato il gioco!\n Ora passiamo alla tua valutazione finale\n");
sleep(2000);
}
else
{
system("cls");
for(i=0; i<nRighe;i++)
{
for(j=0; j<nColonne; j++)
printf("%c",*(*(gioco+i)+j));
printf("\n");
}
printf("Bravo! Ottieni 2 PUNTI\n\n\n");
sleep(2000);
}
}
}
}
break;
}
case '2': //Funzione di salvataggio da vedere
{
puts("Salvataggio effettuato!!!");
sleep(1000);
system("cls");
break;
}
case '3': //Funzione di caricamento da vedere
{
puts("Caricamento effettuato!!!");
sleep(1000);
system("cls");
break;
}
}
system("pause");
}
break;
case '2':
istruzioni();
system("cls");
break;
case '3':
puts("GRAZIE PER AVER SCELTO MEMORY!!");
sleep(2000);
exit(0);
default:
system("cls");
puts("Lettera errata. Riprovare!");
sleep(1000);
system("cls");
}
}

/*Funzione della Random */
int numeroRandom(int lBound, int uBound)
{
int valore, diff;
diff = uBound-lBound;
if (diff != 0)
return lBound + (rand()+time(NULL))%(diff+1);
else
return lBound;
}
/*Interfaccia grafica iniziale */
void inizio(void)
{
puts(" M M EEEE M M OOOOO RRRR Y Y");
puts(" MM MM E MM MM O O R R Y Y ");
puts(" M M M EEEE M M M O O RRRR Y ");
puts(" M M E M M O O R R Y ");
puts(" M M EEEE M M OOOOO R R Y ");
puts("");
puts(" @@@@@@@@@@@@@ ");
puts(" @ @");
puts(" @ [1] Gioca @");
puts(" @ [2] Info @");
puts(" @ [3] Esci @");
puts(" @ @");
puts(" @@@@@@@@@@@@@ ");
puts("");
printf(" -> ");
}
/* Aiuto richiamabile in qualsiasi momento */
void istruzioni(void)
{
system("cls");


puts("ISTRUZIONI\n");
puts("In questo gioco devi trovare ogni coppia di carte uguali.");
puts("Per trovarle vi verranno chieste le coordinate per scoprirle.");
puts("Per scoprire una carta dovete digitare in questo modo:");
puts("Numero riga spazio numero colonna. Per esempio: 0 0.");
puts("Se indovinate vincete due punti altrimenti verrà tolto 1 punto.\n");
system("pause");
system("cls");
main();
}[/

miscialo
23-01-2007, 18:37
il problema è nel confronto tra le due carte...inserisco le due cordinate di una carta
poi quelle dell'altra.... secondo me ha fatto un casino... secondo voi andava fatta una struttura?

miscialo
24-01-2007, 00:35
nessuno mi può aiutare???

Il Pazzo
24-01-2007, 00:47
Originariamente inviato da miscialo
il problema è nel confronto tra le due carte...inserisco le due cordinate di una carta
poi quelle dell'altra.... secondo me ha fatto un casino... secondo voi andava fatta una struttura?

Guarda... onestamente non ho letto nè il testo del problema nè il codice...

però un modo semplice per fare il gioco del memory penso sia quello di creare una matrice (anche di interi) e poi inserendo le coordinate delle 2 carte (riga, colonna).... se il valore dei due elementi della matrice è uguale allora ha trovato la coppia....

Se quello che ho scritto centra poco con il tuo problema allora scusa ma comunque prova a mettere solo il pezzo (non tutto) di codice che non ti è chiaro... e se ti posso essere d'aiuto... ben venga :D

miscialo
24-01-2007, 16:53
dovrei fare dellle matrici dinamiche...l'utente deve decidere la difficoltà...esempio farla 2X2 4X4 8X8...come alloco i file nel vettore e poi definirli in base al range del vettore?

oregon
24-01-2007, 17:37
Originariamente inviato da miscialo
dovrei fare ...
come alloco ...


Ma sei tu ad avere il problema o il tuo amico ?

Il Pazzo
24-01-2007, 18:33
Originariamente inviato da miscialo
dovrei fare dellle matrici dinamiche...l'utente deve decidere la difficoltà...esempio farla 2X2 4X4 8X8...come alloco i file nel vettore e poi definirli in base al range del vettore?


Non ho ben capito cosa intendi... comunque per fare una matrice dinamica non è molto difficile:



int NumCarte, *Matrice;

Matrice = (int*)calloc(NumCarte,sizeof(int));


Oppure puoi anche usare un malloc... vedi tu...

Loading