Memory Game in c++

di il
6 risposte

Memory Game in c++

Buongiorno a tutti.
Per un "progetto/esercizio" universitario devo creare il famoso memory in c++. Non avendo avuto in passato molta dimestichezza con la programmazione e soprattutto c++ sto avendo delle difficoltà.
All'inizio avevo impostato tutto su una matrice[rows][cols] a cui aggiungevo lettere con due cicli annidati per il conteggio di righe e colonne. Qui il primo problema:
1. inserire per ogni lettera una coppia. Ho provato in vari modi (char c = 'A' +rand()%25), ma niente.
Poi ho pensato di creare una vector[size] (size = rows*cols) di valori false per controllare se le carte sono state scoperte, e se uguali, lasciarle scoperte. Qui il mio problema sta nelle coordinate della matrice ed il controllo tra essa e la posizione della carta scelta dall'utente.
Il tutto poi viene stampato da una stringa result, che all'inizio prende tanti "?" quanto è grande la matrice, e mano mano che scopri le carte nella stessa posizione della matrice sostituisce la lettera, e se giuste, la lascia.

Qualcuno può aiutarmi? grazie mille.

6 Risposte

  • Re: Memory Game in c++

    Provo a suggerirti un altro metodo.

    Una doppia matrice[j] una con gli elementi all'interno l'altra riempita solo con 0 (se l'elemento è ancora non scoperto) e 1 (se l'elemento deve apparire). Ogni volta viene chiesto all'utente due coppie di coordinate per cercare di beccare i due valori uguali. Vengono comparati i valori della prima matrice e nel caso siano uguali viene posto a 1 i due elementi appena scoperti. Quando all'inizio di ogni ciclo mostri la matrice degli elementi controlli se nella matrice parallela quel posto è 0 (lo nascondi con un *) se è 1 (lo mostri). Naturalmente la prima matrice riempita con gli elementi deve essere fatta in modo che tutti gli elementi abbiano almeno un altro elemento uguale.

    Credo sia un metodo abbastanza semplice, inizia a buttar giù codice in modo che sia più facile aiutarti.
  • Re: Memory Game in c++

    Eduadie ha scritto:


    Provo a suggerirti un altro metodo.

    Una doppia matrice[j] una con gli elementi all'interno l'altra riempita solo con 0 (se l'elemento è ancora non scoperto) e 1 (se l'elemento deve apparire). Ogni volta viene chiesto all'utente due coppie di coordinate per cercare di beccare i due valori uguali. Vengono comparati i valori della prima matrice e nel caso siano uguali viene posto a 1 i due elementi appena scoperti. Quando all'inizio di ogni ciclo mostri la matrice degli elementi controlli se nella matrice parallela quel posto è 0 (lo nascondi con un *) se è 1 (lo mostri). Naturalmente la prima matrice riempita con gli elementi deve essere fatta in modo che tutti gli elementi abbiano almeno un altro elemento uguale.

    Credo sia un metodo abbastanza semplice, inizia a buttar giù codice in modo che sia più facile aiutarti.


    Grazie mille.
    intendi creare una matrice per le lettere e una per il controllo coperta/scoperta? Rimane comunque il problema di gestire le coordinate inserite dall'utente.
  • Re: Memory Game in c++

    L'utente inserisce due coppie di coordinate (es in una matrice 4x4) lui può inserire (12) che rappresenta l'elemento della riga 1 colonna 2. Con tutti i controlli per evitare che immetta coordinate al di fuori della matrice.
  • Re: Memory Game in c++

    Ecco. Ci avevi pensato ma volevo evitarlo. Appena arrivo in università posto il codice di una bozza di ieri.
  • Re: Memory Game in c++

    Questa è la classe memory.h:
    #include <iostream>
    #include <vector>
    using namespace std;
    
    class memory
    {
    public:
        memory(int rows0, int cols0);
        void gen_matrix();
        vector<char> Cards;
        vector<bool> Control;
        vector<char> Cover;
        void UnCover(int pos01, int pos02);
        string result;
        int Finished();
    
    private:
        int rows, cols;
        int pos1, pos2;
    };
    
    questo il memory.cpp
    #include "memory.h"
    
    memory::memory(int rows0, int cols0)
    {
        cols = cols0;
        rows = rows0;
    }
    
    void memory::gen_matrix()
    {
        int size = rows * cols;
        Control[size];
        
        char c;
        int ind;
        string matrix = "\n";
        for (int coupple = 0; coupple <2; coupple++)
        {
            for (int i= 0; i < size/2; i++)
            {
            c = 'A' + i;
            Cards.push_back(c);
            Control.push_back(false);
    
        }
            }
        
        for (int k = 0; k < Cards.size(); k++) {
            int r = k + rand() % (Cards.size() - k); // careful here!
            swap(Cards[k], Cards[r]);
        }
        
        for (int y = 0; y <rows; y++)
        {
            for (int x = 0; x < cols; x++)
            {
                ind = y*cols +x;
                matrix += Cards[ind];
                Cover.push_back('?');
                matrix += "\t";
                result += "?";
                result += "\t";
            } result += "\n";
            matrix += "\n";
                
        } cout << result;
        cout << matrix;
    }
    
    void memory::UnCover(int pos01, int pos02)
    {
        pos1 = pos01;
        pos2 = pos02;
        result = "";
        //int size = rows * cols;
        
        if (Cards[pos1] == Cards[pos2])
        {
            Control[pos1] = true;
            Control[pos2] = true;
            Cover[pos1] = Cards[pos1];
            Cover[pos2] = Cards[pos2];
        }
        
        /*for (int i= 0; i < size; i++ ){
            cout << Cover[i] << "\t";
        }*/
        
        int pos;
        for (int y = 0; y <rows; y++)
        {
            for (int x = 0; x < cols; x++)
            {
                pos = y*cols +x;
                result += Cover[pos];
                result += "\t";
            } result += "\n";
        } cout << result;
    }
    
    int memory::Finished()
    {
        int size = rows*cols;
        int control;
        for (int i = 0; i < size; i++)
        {
            if(Control[i] == true)
            {
                control++;
            }
        }
        
        return control;
    }
    
    questo il main:
    #include <iostream>
    #include <vector>
    #include "memory.h"
    
    using namespace std;
    
    int main() {
        // insert code here...
    
        int rows, cols;
        do {
            cout << "\ntype rows: "; cin >> rows;
            cout << "type cols: "; cin >> cols;
        } while (rows == cols || (rows*cols)%2 !=0);
    
    
        memory memory(rows, cols);
        memory.gen_matrix();
        int control;
        
        do {
        int pos1, pos2;
        cout << "type Card 1: "; cin >> pos1;
        cout << "type Card 2: "; cin >> pos2;
        memory.UnCover(pos1, pos2);
        control = memory.Finished();
            if (control == (rows*cols))
            {
                cout << "YOU WON!";
            }
        } while (control < (rows*cols));
      
    }
    la variabile matrix in memory.cpp mi serviva solo per il controllo di come viene generta la matrice
  • Re: Memory Game in c++

    Si ma essendo una matrice tu la posizione dovresti prenderla con 4 cin (2 per la prima e 2 per la seconda) altrimenti poi dovresti scindere il risultato che ti viene immesso in input.
Devi accedere o registrarti per scrivere nel forum
6 risposte