Título: Necesito ayuda con este programa quiero que me imprima las cartas que almacene Publicado por: Shaitan Nasser en 22 Noviembre 2017, 18:14 pm Hice el ciclo while pero no se como hago para que reparta mis cartas a mis 4 jugadores, y que cuando a alguien le salga una A este le de el poder que cogerle la carta que tiene arriba los otros 3 jugadores, pero este poder se decide si lo quiere usar en el instante o en otro momento, ayuda por favor.
#include <iostream> #include <stack> #include <stdlib.h> #include <time.h> #include <list> #include <conio.h> using namespace std; class Carta{ public: Carta* siguiente; Carta(){ siguiente = NULL; } Carta(string n,int v){ nombre=n; valor=v; siguiente = NULL; } string nombre; int valor; }; class Pila{ public: Carta* cabeza; void agregar(string nombre, int valor){ Carta* carta= new Carta(nombre,valor); if(cabeza==NULL){ cabeza=carta; } else{ carta->siguiente=cabeza; cabeza=carta; } } Pila(){ cabeza=NULL; } Carta* pop(){ Carta* aux = cabeza; cabeza = cabeza->siguiente; aux->siguiente = NULL; return aux; } Carta* peek(){ return cabeza; } bool estaVacia(){ if(cabeza==NULL) return true; else return false; } }; class Jugador{ public: Jugador(string nombre,int numjugador){ this->nombre=nombre; this->numjugador=numjugador; siguiente=NULL; anterior=NULL; tienepoder=false; } Pila cartas; string nombre; int numjugador; Jugador* siguiente; Jugador* anterior; bool tienepoder; }; class Lista{ public: Jugador* Primero; Jugador* Ultimo; void agregar(string nombre, int numjugador){ Jugador* jugador=new Jugador(nombre,numjugador); if(Primero==NULL){ Primero=Ultimo=jugador; } else{ Ultimo->siguiente=jugador; jugador->anterior=Ultimo; Ultimo=jugador; Ultimo->siguiente=Primero; } } Jugador* getPrimero(){ return Primero; } Lista(){ this->Primero = NULL; this->Ultimo = NULL; } }; void pasarPila(Carta carta[], Pila* pila){ for(int i=0; i<52; i++){ if(carta.valor != 0) pila->agregar(carta.nombre, carta.valor); } } void barajar(Carta cartas[]){ Carta aux; for(int x=0; x<51; x++){ int i=rand() % 51 + 0; int j=rand() % 51 + 0; aux = cartas; cartas = cartas[j]; cartas[j] = aux; } } int main() { Lista jugadores; Carta carta[52]; Pila pilaCartas; int pos =0; for(int i=0; i<4; i++){ for(int j=0; j<13; j++){ if(i == 0) carta[pos] = Carta("Espada",j+2); if(i == 1) carta[pos] = Carta("Corazon",j+2); if(i == 2) carta[pos] = Carta("Diamante",j+2); if(i == 3) carta[pos] = Carta("Trebol",j+2); pos++; } } pos = 0; //int carta[52]={1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,12,13,13,13,13}; //list< string> jugadores; //int suma[5]={0,0,0,0,0}; string jugador; srand(time(NULL)); cout <<"Ingrese el Primer Jugador: "; cin>>jugador; jugadores.agregar(jugador, 1); cout <<"Ingrese el Segundo Jugador: "; cin>>jugador; jugadores.agregar(jugador, 2); cout <<"Ingrese el Tercer Jugador: "; cin>>jugador; jugadores.agregar(jugador, 3); cout <<"Ingrese el Cuarto Jugador: "; cin>>jugador; jugadores.agregar(jugador, 4); //stack <int> cartas; //stack <int> entregadas; /*for(int i=0; i<51; i++){ int ran=rand() % 51 + 0; cartas.push(carta[ran]); }*/ barajar(carta); cout<<"Las cartas Fueron Barajadas"<<endl; //Jugadores toman carta para decidir el turno Jugador* aux = jugadores.getPrimero(); do{ aux->cartas.agregar(carta[pos].nombre, carta[pos].valor); carta[pos].nombre = ""; carta[pos].valor = 0; pos++; aux=aux->siguiente; }while(aux!= jugadores.getPrimero()); /*aux->cartas.agregar(carta[pos].nombre, carta[pos].valor); carta[pos].nombre = ""; carta[pos].valor = 0; cout<<"@"; pos++;*/ barajar(carta); pasarPila(carta, &pilaCartas); aux = jugadores.getPrimero(); Jugador* primero; int valor = 0; do{ if(aux->cartas.peek()->valor > valor){ valor = aux->cartas.peek()->valor; primero = aux; } }while(aux->siguiente != jugadores.getPrimero()); while(!pilaCartas.estaVacia()){ Jugador* aux2 = jugadores.getPrimero(); while(aux2->siguiente!=jugadores.getPrimero());{ aux2=aux2->siguiente; } } /*cout<<"Las cartas Fueron Barajadas"<<endl; list<string>::iterator iter(jugadores.begin()); int cont=0; while(cartas.empty()==false){ if(iter==jugadores.begin()){ while(iter!=jugadores.end()&&cartas.empty()==false){ entregadas.push(cartas.top()); cout<<"Jugador "<<*iter<<" "<<entregadas.top()<<endl; if (cont!=4) suma[cont]+=entregadas.top(); cartas.pop(); cont++; iter++; getch(); } } if(iter==jugadores.end()){ while(iter!=jugadores.begin()&&cartas.empty()==false){ iter--; entregadas.push(cartas.top()); cout<<"Jugador "<<*iter<<" "<<entregadas.top()<<endl; if (cont!=4) suma[cont]=suma[cont]+entregadas.top(); cartas.pop(); cont--; getch(); } } } list<string>::iterator iter2(jugadores.begin()); int cont2=0; while(iter2!=jugadores.end()){ cout <<"El Jugador "<<*iter2<<" Tiene "<<suma[cont2]<<" Cartas"<<endl; cont2++; iter2++; }*/ return 0; } Título: Re: Necesito ayuda con este programa quiero que me imprima las cartas que almacene Publicado por: Serapis en 23 Noviembre 2017, 03:19 am Tienes que pensar como un humano, y luego traducirlo a código... porque programar es eso.
Se obvian las funciones que no son precisas para llegar al punto donde explicar el asunto de tu interés. 1º - Debes disponer de una baraja, supongamos que la baraja se compone de 4 palos (y como soy español y no inglés usamos de ejemplo la baraja española y no la francesa (la de póker)). Código: array de bytes Baraja(0 a 39) //también podría ser bidimensional (0 a 3, 0 a 9) 2º Tras ser generada la baraja (contener las cartas deseadas), debe ser barajada. Código: // Esta función baraja las cartas, esto es las cambia de orden. Ahora toca repartir las cartas entre los jugadores, pero antes de repartir, vemos la necesidad de tener un alojamiento para los datos de cada jugador, básicamente hará falta una estructura que contenga el array de 'cuales' cartas tiene cada jugador. un valor que indique cuantas le restan válidas en ese array. Código: estructura Jugador 3º Repartimos... debemos saber cuantos jugadores hay en la partida y cuantas cartas se reparten. Vamos a suponer que no se reparten todas sino, 5 al empezar... por simplicidad, no se comprueba si quedan suficientes cartas por repartir. En teoria si se llega al final, habría que tomar las que haya aún en la anca y barajarlas (solo las que quedan ahí), es fácil modificar la función de barajado para indicar cuantas barajar y tal... Al parámetro desde se le pasa el valor de siguienteCarta , que se actualiza al retorno de la función. Código: // Esta función es la correcta cuando cada reparto sucede que todos los jugadores se han descartado, si no es así, el procedimiento debe variar (se pone debajo una aproximación al caso). Función de reparto cuando se puede tener diferente número de cartas, según momentos y jugador durante la partida. alcaso se supone un tamaño de array de cartas para cada jugador del mismo que la baraja, así se evita errores de desbordamiento y hace innnecesario controlar dicho factor... Código: entero = funcion Repartir(entero numJugadores, entero numCartas, entero desde) 4º Ahora llegamos al punto donde es el turno de un jugador y se comprueba si tiene un as y por tanto roba una carta (la siguiente o una alazar?) al resto de jugadores... Recuerda: Se han obviado las funciones que no son precisas para llegar a este punto donde se explica el asunto de tu interés. Código: entero funcion SiguienteTurno(entero turno) //, entero indiceCarta para elcaso de que sea el jugador quien decide qué carta se arroja. Para entender correctamente el pseudocódigo considera lo siguiente: - La baraja tiene 40 cartas, una copia por cada carta, que han sido barajadas x veces. - El array 'baraja' representa la banca. - La banca cuando reparte cartas, aumenta el índice en tantas cartas como reparte, las de más abajo están en uso, las que restan hasta 39, siguenen la banca. - Las cartas del jugadores, sigue el orden al revés, dado que no hay forma de saber cuantas cartas tendrá en algún momento, cuando se le retira una, se intercambia de orden con la del final de las que le quedan válidas, y su cuenta se reduce en uno. - Los valores de las cartas en la baraja van del 0 al 39. 0-9 las 10 cartas de un palo, 10-19, las de otro, 20-29 otro y 30-39 el último palo. Usar dos barajas es aumentar el array al doble y proceder con la misma idea, solo que se consideran cartas iguales (x y n) si: Código: buleano = funcion Iguales(entero x, entero n) - Se supone que los turnos, son una vez cada uno. Si no es así, se deb modificar la devolución en la función 'SiguienteTurno'. Para el caso, (por simplicidad y claridad), tampoco se ha previsto el caso de que un jugador esté descartado y por tanto deba ceder el turno a otro. - La función 'SiguienteTurno', simplemente está evaluando que carta juega el jugador que tiene el turno, y verifica si es un as en cuyo casoretira una carta a cada jugador (pero no se las asigna así mismo, es decir no se apodera de ellas), y da por hecho que jugar una carta supone perderla, descartando por tanto al jugador de esa carta... ...es realmente sencillo, espero que lo entiendas correctamente... |