Libros no sé ya que yo apenas he leído uno. Es posible que @string Manolo te recomiende alguno ya que he visto otros temas en los que ha recomendado algunos libros. También puedes ver cursos online (posiblemente gratuitos) y sobre todo practicar mucho.
Te dejo un enlace AQUÍ a la página de <cplusplus.com>. Está en inglés pero es un inglés muy fácil de entender. Ahí puedes ver un montón de librerías con sus respectivas funciones y ejemplos de uso. Puede que te sirva.
Personalmente lo que haría sería "quitar los palos". Para este juego lo importante es el valor de la carta, el palo importa más bien poco y al quitar los palos podemos guardar todos los números en un solo array y aplicar el código que te puse para sacar una carta y hacer que no salga más veces.
Puedes probar este código para que veas como saca todas las cartas y muestra las que ya han salido. Luego es cosa tuya ver qué cosas puedes aprovechar y cuáles no para tu programa.
En caso de hacerlo con una matriz y con los palos como lo tienes implementado, se complica un poco más el código. Tendrías que llevar 4 contadores: <orosDisponibles>, <copasDisponibles>, <espadasDisponibles> y <bastosDisponibles> y en vez de guardar las cartas que ya han salido al final del array, tendrías que guardarlos al final de la fila correspondiente a ese palo.
También tienes opciones un poco más "profesionales" pero que supongo que no habrás visto todavía como usar un <struct> o <class> llamado <Carta> que tenga <numero> y <palo> y hacer uso de contenedores de la STL como el <multiset>.
Te dejo un enlace AQUÍ a la página de <cplusplus.com>. Está en inglés pero es un inglés muy fácil de entender. Ahí puedes ver un montón de librerías con sus respectivas funciones y ejemplos de uso. Puede que te sirva.
Personalmente lo que haría sería "quitar los palos". Para este juego lo importante es el valor de la carta, el palo importa más bien poco y al quitar los palos podemos guardar todos los números en un solo array y aplicar el código que te puse para sacar una carta y hacer que no salga más veces.
Código (cpp) [Seleccionar]
#include <iostream>
#include <cstdlib>
#include <ctime>
const int NUM_CARTAS = 40;
int main(){
int cartasDisponibles = NUM_CARTAS;
int cartas[NUM_CARTAS] = {1,2,3,4,5,6,7,10,11,12,1,2,3,4,5,6,7,10,11,12,1,2,3,4,5,6,7,10,11,12,1,2,3,4,5,6,7,10,11,12};
srand(time(NULL));
while(cartasDisponibles > 0){
int indiceAleatorio = rand() % cartasDisponibles;
int cartaActual = cartas[indiceAleatorio];
cout << "La carta sacada es: " << cartaActual << endl;
// Guardamos la carta que hemos sacado al final del array para que no salga mas veces
int auxiliar = cartas[indiceAleatorio];
cartas[indiceAleatorio] = cartas[cartasDisponibles-1];
cartas[cartasDisponibles-1] = auxiliar;
--cartasDisponibles;
// Si quieres ver las cartas que ya han salido
cout << "Cartas que ya han salido: ";
for(size_t i = cartasDisponibles; i < NUM_CARTAS; ++i)
cout << cartas[i] << " ";
}
}
Puedes probar este código para que veas como saca todas las cartas y muestra las que ya han salido. Luego es cosa tuya ver qué cosas puedes aprovechar y cuáles no para tu programa.
En caso de hacerlo con una matriz y con los palos como lo tienes implementado, se complica un poco más el código. Tendrías que llevar 4 contadores: <orosDisponibles>, <copasDisponibles>, <espadasDisponibles> y <bastosDisponibles> y en vez de guardar las cartas que ya han salido al final del array, tendrías que guardarlos al final de la fila correspondiente a ese palo.
También tienes opciones un poco más "profesionales" pero que supongo que no habrás visto todavía como usar un <struct> o <class> llamado <Carta> que tenga <numero> y <palo> y hacer uso de contenedores de la STL como el <multiset>.