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: