001: #include<stdio.h>
002: #include<stdlib.h>
003: #include<time.h>
004: 
005: // costanti da usare per quanto possibile
006: #define NCARTE 40
007: #define NCARTE_GIOCATORE (NCARTE/2)
008: 
009: // FUNZIONI GIA' DISPONIBILI
010: void stampa_carta(int c);      // stampa una singola carta
011: void stampa_carte(int *c);     // stampa le carte di un giocatore
012: void stampa_mazzo(int *m);     // stampa carte del mazzo
013: void ordina_carte(int *carte); // ordina le carte di un singolo giocatore
014: int  n_carte(int *carte);      // restituisce il n. di carte di un giocatore
015: int  check(int *g);            // restituisce 1 se il giocatore ha ancora carte e 0 se non ne ha piu'
016: 
017: // FUNZIONI DA IMPLEMENTARE
018: int *genera_mazzo(void);
019: void distribuisci_carte(int *mazzo, int *primo, int *secondo);
020: void elimina_cavallo(int *primo, int *secondo);
021: void elimina_doppi(int *carte);
022: void scambio(int *src, int *dst);
023: 
024: 
025: // LA MAIN NON VA TOCCATA SALVO COMMENTARE/SCOMMENTARE MESSAGGI DI STAMPA DEL MAZZO GENERATO
026: int main(int argc, char **argv){
027: 
028:   srand(time(0));
029: 
030:   int *mazzo = genera_mazzo();
031: 
032:   printf("Mazzo generato: "); 
033:   stampa_mazzo(mazzo); 
034: 
035:   // alloco i mazzi dei due giocatori inizializzando tutte le carte a 0
036:   int *giocatore1=calloc(NCARTE_GIOCATORE, sizeof(int));
037:   int *giocatore2=calloc(NCARTE_GIOCATORE, sizeof(int));
038: 
039:   // distribuisco le carte ai due giocatori
040:   distribuisci_carte(mazzo, giocatore1, giocatore2);
041:   free(mazzo); // non serve piu'
042: 
043:   printf("Dopo aver distribuito le carte, il primo   giocatore ha in mano %2d carte: ", n_carte(giocatore1)); 
044:   stampa_carte(giocatore1); 
045:   printf("Dopo aver distribuito le carte, il secondo giocatore ha in mano %2d carte: ", n_carte(giocatore2));
046:   stampa_carte(giocatore2); 
047: 
048:   elimina_cavallo(giocatore1, giocatore2);
049: 
050:   printf("Dopo aver eliminato il cavallo, il primo   giocatore ha in mano %2d carte: ", n_carte(giocatore1)); 
051:   stampa_carte(giocatore1); 
052:   printf("Dopo aver eliminato il cavallo, il secondo giocatore ha in mano %2d carte: ", n_carte(giocatore2));
053:   stampa_carte(giocatore2); 
054: 
055:   ordina_carte(giocatore1);
056:   ordina_carte(giocatore2);
057: 
058:   printf("Dopo aver ordinato le carte,    il primo   giocatore ha in mano %2d carte: ", n_carte(giocatore1)); 
059:   stampa_carte(giocatore1); 
060:   printf("Dopo aver ordinato le carte,    il secondo giocatore ha in mano %2d carte: ", n_carte(giocatore2));
061:   stampa_carte(giocatore2); 
062: 
063:   elimina_doppi(giocatore1);
064:   elimina_doppi(giocatore2);
065: 
066:   printf("Dopo aver eliminato i doppi,    il primo   giocatore ha in mano %2d carte: ", n_carte(giocatore1)); 
067:   stampa_carte(giocatore1); 
068:   printf("Dopo aver eliminato i doppi,    il secondo giocatore ha in mano %2d carte: ", n_carte(giocatore2));
069:   stampa_carte(giocatore2); 
070: 
071:   int nscambi=1;
072:   while(1)
073:   {
074:     scambio(giocatore1, giocatore2);
075:     printf("Dopo lo scambio %3d,            il secondo giocatore ha in mano %2d carte: ", nscambi++, n_carte(giocatore2)); 
076:     stampa_carte(giocatore2); 
077:     if(!check(giocatore2) || !check(giocatore1))
078:       break;
079: 
080:     getchar();
081: 
082:     scambio(giocatore2, giocatore1);
083:     printf("Dopo lo scambio %3d,            il primo   giocatore ha in mano %2d carte: ", nscambi++, n_carte(giocatore1)); 
084:     stampa_carte(giocatore1); 
085:     if(!check(giocatore1) || !check(giocatore2))
086:       break;
087: 
088:     getchar();
089:   }
090: 
091:   printf("\n");
092:   if(!check(giocatore1))
093:   {
094:     printf("Il primo   giocatore ha vinto,  il secondo e' rimasto con       %2d carte: ", n_carte(giocatore2));
095:     stampa_carte(giocatore2);
096:   }
097:   else
098:   {
099:     printf("Il secondo giocatore ha vinto,  il primo   e' rimasto con       %2d carte: ", n_carte(giocatore1));
100:     stampa_carte(giocatore1);
101:   }
102: 
103:   free(giocatore1);
104:   free(giocatore2);
105: 
106:   return 0;
107: }
108: 
109: int *genera_mazzo(void)
110: {
111:   // alloco mazzo dinamicamente
112:   int *mazzo = malloc(sizeof(int)*NCARTE);
113:   int i;
114: 
115:   // inizialmente metto tutti i valori in ordine tra 1 e 40
116:   for(i=0; i<NCARTE; ++i)
117:     mazzo[i] = i + 1;
118: 
119:   // poi li mescolo casualmente
120:   for(i=0; i<NCARTE; ++i)
121:   {
122:     int j = rand()%NCARTE; // genero indice a caso
123:     // scambio valore in i con valore in j
124:     int t = mazzo[j];
125:     mazzo[j] = mazzo[i];
126:     mazzo[i] = t;
127:   }
128: 
129:   return mazzo;
130: }
131: 
132: void distribuisci_carte(int *mazzo, int *primo, int *secondo)
133: {
134:   int i;
135:   for(i=0; i<NCARTE; i+=2)
136:   {
137:     primo[i/2]   = mazzo[i];
138:     secondo[i/2] = mazzo[i+1];
139:   }
140: }
141: 
142: void elimina_cavallo(int *primo, int *secondo)
143: {
144:   int i;
145:   for(i=0; i<NCARTE_GIOCATORE; ++i)
146:   {
147:     if(primo[i] == 39)
148:     {
149:       primo[i] = 0;
150:       break;
151:     }
152:     if(secondo[i] == 39)
153:     {
154:       secondo[i] = 0;
155:       break;
156:     }  
157:   }
158: }
159: 
160: void elimina_doppi(int *carte)
161: {
162:   int i;
163:   for(i=1; i<NCARTE_GIOCATORE; ++i)
164:   {
165:     if(carte[i-1]%10 == carte[i]%10)
166:     {
167:       carte[i-1] = 0;
168:       carte[i]   = 0;
169:     }
170:   }
171: }
172: 
173: 
174: void scambio(int *src, int *dst)
175: {
176:   // genero un indice casuale fino a che nel mazzo sorgente non corrisponde ad una carta esistente
177:   int j;
178:   do
179:   {
180:     j=rand()%NCARTE_GIOCATORE;
181:   }while(!src[j]);
182: 
183:   // cerco il primo 0 nel mazzo destinazione e ci metto la carta estratta
184:   int i;
185:   for(i=0; i<NCARTE_GIOCATORE; ++i)
186:     if(!dst[i])
187:     {
188:       dst[i] = src[j];
189:       src[j] = 0;
190:       break;
191:     }
192: 
193: 
194:   // DA LASCIARE IN FONDO ALLA FUNZIONE
195:   ordina_carte(dst);
196:   elimina_doppi(dst);
197: }
198: 
199: 
200: 
201: 
202: 
203: 
204: 
205: 
206: 
207: 
208: 
209: 
210: /*****************************************************
211:   FUNZIONI GIA' DEFINITE -> NON MODIFICARE
212: *****************************************************/
213: void stampa_carta(int c)
214: {
215:   char semi[] = "CQFP";
216:   printf("%2d%c ", (c-1)%10+1, semi[(c-1)/10]);
217: }
218: 
219: void stampa(int *c, int n)
220: {
221:   for(int i=0; i<n; ++i)
222:     if(c[i]) // non stampo posizioni vuote
223:       stampa_carta(c[i]);
224:   printf("\n");
225: }
226: 
227: void stampa_carte(int *c)
228: {
229:   stampa(c, NCARTE_GIOCATORE);
230: }
231: 
232: void stampa_mazzo(int *c)
233: {
234:   stampa(c, NCARTE);
235: }
236: 
237: int _compara_carte(const void *a, const void *b)
238: {
239:   int ca = *((int *)a);
240:   int cb = *((int *)b);
241: 
242:   return ((ca-1)%10 - (cb-1)%10);
243: }
244: 
245: void ordina_carte(int *carte)
246: {
247:   qsort(carte, NCARTE_GIOCATORE, sizeof(int), _compara_carte);
248: }
249: 
250: int n_carte(int *carte)
251: {
252:   int i, c=0;
253:   for(i=0; i<NCARTE_GIOCATORE; ++i)
254:     if(carte[i])
255:       ++c;
256:   return c;
257: }
258: 
259: 
260: int  check(int *g)
261: {
262:   if(n_carte(g))
263:     return 1;
264:   return 0;
265: }
266: