Gioco di carte CORTE (solitario)

di il
11 risposte

Gioco di carte CORTE (solitario)

Salve a tutti, sono un ragazzo universitario della facoltà di ingegneria di Palermo e per via di un esame ci è stato chiesto di ricreare un solitario a nostra scelta e di proporlo ricreandolo come programma in C.
La scelta del mio gruppo di lavoro è ricaduta su una tipologia di solitario molto semplice chiamato CORTE.
In questo solitario si hanno 8 pile formate da mazzetti di 4 carte di cui solo l'ultima è scoperta, le carte 32 carte in questione sono solamente le figure (A,J,Q,K) in 8 copie per figura e distribuite casualmente nelle 8 pile.
il giocatore, molto semplicemente, deve trovare le carte con la stessa figura indipendentemente dal seme e accoppiarle per rimuoverle dal gioco.
una volta che delle carte vengono rimosse dalle pile si scopre la carte subito sotto quest'ultime.
il giocatore vince la partita quando tutte le carte vengono tutte rimosse dal tavolo.

avendo questo tipo di gioco con queste determinate regole ho predisposto un prototipo con una matrice 4x8 che mi permettesse di generare valori casuali nel range fra 1 11 12 13 riempiendo la matrice con i soli valori che mi servivano.

ho anche creato una bozza di presentazione del gioco colorata per rendere più carina la visualizzazione del nome del gioco e per differenziare le regole del gioco spiegate rispetto alla matrice.

volevo chiedere dei consigli e delle informazioni riguardanti i seguenti problemi che in quanto novizio al momento non sono del tutto in grado di risolvere:
1) come posso fare in modo che la mia matrice diventi dinamica introducendo la possibilità di selezionare e confrontare valori interni ad essa e rimuoverli qualora l'uguaglianza venga rispettata?
2)come potrei trattare in maniera visualmente carina le carte coperte e renderle impossibili da utilizzare qualora ci sia una carta sotto di essa?
3) necessitando soltanto delle figure ci sarebbe un modo per affibbiare ai valori numerici all'interno della matrice le lettere maiuscole delle figure permettendo di visualizzare solo quelle? inoltre come posso visualizzare secondo voi la visualizzazione del seme che sebbene ai fini del gioco sia irrilevante è comunque richiesta dal mio docente?

qui di seguito il codice da me già scritto
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>

#define dim 32   
 
void stampatitolo();
int textcolor(int color);
void stampa_matrice(int matrice[4][8]);
void random(int matrice[4][8]);

int main()
{
    stampatitolo();
    int p=7;
    textcolor(p);
    int matrice[4][8]={1 ,11 ,12 ,13 ,1 ,11 ,12 ,13 ,1 ,11 ,12 ,13 ,1 ,11 ,12 ,13 ,1 ,11 ,12 ,13 , 1,11 ,12 ,13 ,1 ,11 ,12 ,13 ,1 ,11 ,12 ,13 };
    
    random( matrice);
    stampa_matrice( matrice);

 return 0; 
}
void stampatitolo()
{ 
       int p=5;
       textcolor(p);
        printf("\t\t\t\t ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n");
    printf("\t\t\t\t º                          º\n");
    printf("\t\t\t\t º            CORTE         º\n");
    printf("\t\t\t\t º                          º");
    printf("\n\t\t\t\t ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n\n");
    printf("Benvenuto al Solitario Corte, per Vincere dovrai rimuovere tutte le carte accoppiando fra di loro le carte dello stesso valore (indipendentemente dal seme) a patto che siano libere e non chiuse da altre \n");
    
}

int textcolor (int color) 

{
    SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), color);
}
void stampa_matrice(int matrice[4][8])
{
 int i,j;
for(i=0;i<4;i++)
    {  
       for(j=0;j<8;j++)

       printf("%3i", matrice[i][j]);
       printf("\n\n");   
    } 
}

void random(int matrice[4][8])
{
    time_t t;
    srand((unsigned) time(&t));
      int i,j,temp;
      for ( i=0 ; i<4 ; i++)
        for ( j=0 ; j<8 ; j++){
            int j1 = (rand() % 4);
            int j2 = (rand() % 8);
   temp = matrice[i][j];
            matrice[i][j] = matrice[j1][j2];
            matrice[j1][j2] = temp;
   }
                 
}

11 Risposte

  • Re: Gioco di carte CORTE (solitario)

    Non c'è modo di eliminare un elemento casuale da un array, al massimo puoi rendere dinamico l'intero array, quindi eliminarlo e riallocarlo ogni volta. Per esempio potresti usare 8 array dinamici:
    
    int* matrice[8];
    
    Se vuoi eliminare proprio un elemento per volta, devi usare le liste, non i vettori.

    Un'altra soluzione, utile anche per le altre due domande, è usare delle struct nei cui campi ci metti le caratteristiche delle carte e anche le informazioni che indichino se la carta è coperta o è rimossa. In questo modo non dovresti eliminarle fisicamente dalla matrice, ma solo cambiare i valori dei campi. Quest'ultima è la soluzione più semplice perché non rischi di incorrere in errori di memoria e pui scriverti facilmente funzioni per contare le carte nelle pile.
  • Re: Gioco di carte CORTE (solitario)

    Salve alexv, dopo aver mandato la richiesta di aiuto ho ovviamente continuato a lavorare al programma informandomi su internet, ho generato il ciclo che stampa al posto dei valori numeri il segno delle carte (A,J,Q,K) quindi mi rimane solo il problema del seme.
    Per quanto riguarda gli array dinamici (che erano i tipi di array che intendevo usare) mi sono informato per quanto riguardava la selezione di valori ad esso interni e ho visto la possibilità di selezionarli tramite puntatore indicando le locazioni di memoria, quindi pensavo di predisporre una tabella graficamente carina che permettesse al giocatore di individuare le carte digitando i valori dell'allocazione di memoria inserendoli nel puntatore, effettuare il confronto fra i 2 valori scelti dal giocatore e qualora fossero uguali cancellarli dalla matrice e riscriverla.
    secondo te è comunque più semplice utilizzare il metodo da te proposto? quello che avevo pensato di fare era sbagliato o funzionava correttamente?
    il consiglio che mi hai fornito è ottimo, potresti farmi degli esempi di sintassi e costruzione delle struct in modo da provare per vedere come funziona questa alternativa?
    come potrei quindi utilizzare le liste?
    ti ringrazio per la risposta!
  • Re: Gioco di carte CORTE (solitario)

    Per i semi
    
    #include <iostream>
    #include <io.h>
    #include <fcntl.h>
    
    #define QUADRI L"\u2660"
    #define FIORI L"\u2663"
    #define CUORI L"\u2665"
    #define PICCHE L"\u2666"
    
    using namespace std;
    
    int main()
    {
    	_setmode(_fileno(stdout), _O_U16TEXT);
    
    	wcout << "A" QUADRI << endl;
    	wcout << "K" FIORI << endl;
    	wcout << "Q" CUORI << endl;
    	wcout << "J" PICCHE << endl;
    
    	_setmode(_fileno(stdout), _O_TEXT);
    
    	return 0;
    }
    

    P.S. Forza Palermo ...
  • Re: Gioco di carte CORTE (solitario)

    Oregon grazie mille per il codice! questo è davvero un aiuto grandissimo, ora devo solo capitare come fare in modo che vengano stampati nella matrice
    Sempre forza Palermo ?
  • Re: Gioco di carte CORTE (solitario)

    Ho fatto una piccola ricerca sulla funzionalità delle strutture e come diceva Alexv è davvero il miglior metodo per implementare questo progettino, non avendo mai usato le struct però sono un poò disorientato, qualcuno saprebbe darmi qualche consiglio anche tenendo conto del codice mandato da oregon per la visualizzazione dei semi? ovviamente io continuerò ad informarmi e provare, vi ringrazio di cuore per i consigli e per l'aiuto
  • Re: Gioco di carte CORTE (solitario)

    Non si stampa "nella" matrice. Visualizzi i valori della matrice ...

    Per i semi puoi usare, come ti è stato consigliato, una struttura in cui inserisci valore, seme e stato (facendo corrispondere i semi ad un valore 0 cuori, 1 quadri, 2 fiori, 3 picche) e lo stato ad un altro (0 carta coperta, 1 carta scoperta, 2 carta eliminata) con delle enum
    
    typedef enum {cuori, quadri, fiori, picche}  semi;
    typedef enum {coperta, scoperta, eliminata}  status;
    
    typedef struct _card
    {
       int valore;
       semi seme;
       status stato;
    } card;
    
  • Re: Gioco di carte CORTE (solitario)

    Ok adesso è molto più chiaro, perdona l'ignoranza sullo "stampare" nella matrice.
    generando queste struct per singole carte posso adesso quindi generare un array da 32 carte che mi permette di avere 8 carte per tipo con tutti i semi giusto?
    a differenza della matrice che avevo adoperato sopra come posso adesso implementare rand e srand per riempire casualmente la lista? ammesso che si possa fare in maniera simile al funzionamento della matrice di prima.
    sempre grazie
  • Re: Gioco di carte CORTE (solitario)

    Se sai come trattare le struct non ti sarà difficile ... comunque, proprio per darti un'ultima mano da cui prendere spunto ...
    
    #include <iostream>
    #include <io.h>
    #include <fcntl.h>
    
    typedef enum { cuori, quadri, fiori, picche }  semi;
    typedef enum { coperta, scoperta, eliminata }  status;
    
    typedef struct _card
    {
    	int valore;
    	semi seme;
    	status stato;
    } card;
    
    const wchar_t visSemi[][2] = { L"\u2665", L"\u2660", L"\u2663", L"\u2666" };
    
    using namespace std;
    
    void visCard(card *c)
    {
    	_setmode(_fileno(stdout), _O_U16TEXT);
    
    	if (c->stato == scoperta)
    	{
    		switch (c->valore)
    		{
    		case 1:
    			wcout << "A";
    			break;
    		case 11:
    			wcout << "J";
    			break;
    		case 12:
    			wcout << "Q";
    			break;
    		case 13:
    			wcout << "K";
    			break;
    		}
    		
    		wcout << visSemi[c->seme] << endl;
    	}
    	else
    	{
    		if (c->stato == coperta)
    			wcout << "??" << endl;
    	}
    
    	_setmode(_fileno(stdout), _O_TEXT);
    }
    
    int main()
    {
    	card pila[8] = {
    					 {  1, cuori, scoperta },
    					 { 11, quadri, scoperta },
    					 { 12, fiori, scoperta },
    					 { 13, picche, eliminata },
    					 {  1, quadri, scoperta },
    					 { 11, fiori, scoperta },
    					 { 12, picche, scoperta },
    					 { 13, cuori, coperta },
    				   };
    
    	int i;
    	for (i = 0; i < 8; i++)
    		visCard(&pila[i]);
    
    	return 0;
    }
    
  • Re: Gioco di carte CORTE (solitario)

    Grazie infinite oregon, provo subito sulla base del programma che hai gentilmente scritto a ricreare il programma fino al punto in cui ero arrivato prima sperando funzioni, vi ringrazio ancora, buona serata.
  • Re: Gioco di carte CORTE (solitario)

    Vedo che sono arrivato un po' tardi, aggiungo altre due cosette:
    1) Non serve sommare i puntatori per accedere agli array dinamici, anche doppi, puoi continuare ad usare le doppie parentesi quadre.

    2) Rispondendo alla tua domanda, secondo me è una scelta inutile usare array dinamici in questo progetto: ti complichi la vita, appesantisce il programma (ogni volta devi distruggere e riallocare) e il risparmio di memoria è infinitesimo.

    3) Per come ho capito, le carte vengono eliminate in sequenza dalla pila, cioè a partire dall'alto, quindi invece di mettere una variabile nella struct che ne indichi la presenza (come ho detto prima), potresti farti un altro vettore in cui tieni traccia del numero di carte presenti in ogni pila.
    
    int altezza_pile[8] = {4,4,4,4,4,4,4,4};
    
    Quando peschi dalla pila n, diminuisci il rispettivo numero in altezza_pile.
    Adesso decidi tu quale pensi sia la scelta migliore.

    PS: chi non ti ha spiegato le struct ti vuole male
  • Re: Gioco di carte CORTE (solitario)

    E secondo te cosa dovrei usare per semplificarmi il lavoro? stavo pensando a matrici di struct o array di struct arrivato a questo punto.
    pensavo di creare magari 4 array da 8 valori l'uno affidando ad ogni arrray 1 seme e di stamparli randomicamente magari all'interno di una tabella.
    Oregon gentilmente potrebbe passarmi la versione C della visualizzazione dei semi? il compito deve essere in c e non in c++ e non trovo l'equivalente dei comandi che ha utilizzato per la visualizzazione dei semi da nessuna parte
Devi accedere o registrarti per scrivere nel forum
11 risposte