Skip to content

Commit 8508a3b

Browse files
committed
Add Spanish card stack
1 parent aa9dc42 commit 8508a3b

File tree

1 file changed

+299
-0
lines changed

1 file changed

+299
-0
lines changed

card_stack.cpp

Lines changed: 299 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,299 @@
1+
#include <iostream>
2+
#include <ctime>
3+
#include <cstdlib>
4+
5+
using namespace std;
6+
7+
/**
8+
9+
A simple Spanish card stack using pointers. Nice! :)
10+
11+
*/
12+
13+
14+
struct Carta {
15+
char palo;
16+
int num;
17+
Carta *sig; // this pointer is for iterate through the whole card stack
18+
};
19+
20+
class MontonCartas
21+
{
22+
Carta *p; // this is our stack, a simple pointer. Yeah, amazing xD
23+
24+
public:
25+
MontonCartas(); // constructor that builds an empty Spanish card stack
26+
MontonCartas(int todas); // constructor that builds a complete Spanish card stack
27+
~MontonCartas();
28+
29+
MontonCartas& operator= (const MontonCartas& orig);
30+
31+
void mezclar ();
32+
void insertarCarta (int n, char tipo);
33+
void eliminarCarta(int pos);
34+
void printMonton ();
35+
36+
int sizeMonton () const;
37+
int getNumeroCarta (int pos) const;
38+
char getPaloCarta (int pos) const;
39+
Carta* getCarta (int pos) ;
40+
};
41+
42+
MontonCartas::MontonCartas()
43+
{
44+
p = 0;
45+
}
46+
47+
MontonCartas::MontonCartas(int todas)
48+
{
49+
char pal [] = {'O','C','B','E'};
50+
51+
Carta *aux;
52+
bool primeraCarta = true;
53+
54+
55+
for(int i=0; i<4; i++)
56+
{
57+
char a = pal[3-i];
58+
aux = new Carta;
59+
60+
for(int j=0; j<12; j++)
61+
{
62+
(*aux).palo = a;
63+
(*aux).num = 12-j;
64+
65+
if(primeraCarta)
66+
{
67+
(*aux).sig = 0;
68+
primeraCarta = false;
69+
}else
70+
(*aux).sig = p;
71+
72+
p = aux;
73+
74+
aux = new Carta;
75+
}
76+
}
77+
}
78+
79+
MontonCartas::~MontonCartas()
80+
{
81+
Carta *aux;
82+
83+
aux = (*p).sig;
84+
while(aux != 0){
85+
delete p;
86+
p = aux;
87+
aux = (*aux).sig;
88+
}
89+
delete p;
90+
}
91+
92+
MontonCartas& MontonCartas::operator= (const MontonCartas& orig)
93+
{
94+
if(&orig != this)
95+
{
96+
if(this->p != 0)
97+
{
98+
Carta *Claus;
99+
Claus=this->p;
100+
while(Claus != 0)
101+
{
102+
Claus = (*Claus).sig;
103+
delete p;
104+
p = Claus;
105+
}
106+
}
107+
108+
Carta *aux, *aux2;
109+
aux = this->p;
110+
aux2 = orig.p;
111+
bool primeraCarta = true;
112+
113+
while(aux2 != 0)
114+
{
115+
aux = new Carta;
116+
117+
if(primeraCarta){
118+
(*aux).sig = 0;
119+
primeraCarta = false;
120+
}else
121+
(*aux).sig = p;
122+
123+
p = aux;
124+
125+
aux2 = (*aux2).sig;
126+
}
127+
128+
//copiamos datos
129+
aux = this->p;
130+
aux2 = orig.p;
131+
while(aux2 != 0)
132+
{
133+
(*aux).num = (*aux2).num;
134+
(*aux).palo = (*aux2).palo;
135+
136+
aux = (*aux).sig;
137+
aux2 = (*aux2).sig;
138+
}
139+
}
140+
return *this;
141+
}
142+
143+
void MontonCartas::mezclar()
144+
{
145+
Carta *aux;
146+
aux = p;
147+
int tam=0;
148+
for(tam; aux != 0; tam++)
149+
aux = (*aux).sig;
150+
151+
Carta *aux2;
152+
153+
for(int i=0; i<tam; i++)
154+
{
155+
aux = p;
156+
aux2 = p;
157+
158+
srand(time(0));
159+
int a = rand()%tam;
160+
int b = rand()%tam;
161+
162+
Carta *aux2a;
163+
Carta *auxan;
164+
aux2a = p;
165+
auxan = p;
166+
167+
for(int h=0; h<a; h++)
168+
aux = (*aux).sig;
169+
for(int h=0; h<a-1; h++)
170+
auxan = (*auxan).sig;
171+
for(int h=0; h<b; h++)
172+
aux2 = (*aux2).sig;
173+
for(int h=0; h<b-1; h++)
174+
aux2a = (*aux2a).sig;
175+
176+
if( (&aux != &aux2) && (&aux != &auxan) && (&aux2 != &aux2a) )
177+
{
178+
(*aux).sig = (*aux2).sig;
179+
(*aux2).sig = aux2a;
180+
(*aux2a).sig = aux;
181+
(*auxan).sig = aux2;
182+
}
183+
else if( (&aux == &auxan) || (&aux2 == &aux2a) )
184+
{//que sera cuando estén al principio
185+
186+
(*aux).sig = (*aux2).sig;
187+
(*aux2).sig = aux2a;
188+
(*aux2a).sig = aux;
189+
p = aux2;
190+
}
191+
}
192+
}
193+
194+
void MontonCartas::eliminarCarta (int pos)
195+
{
196+
Carta *aux;
197+
Carta *aux2;
198+
aux = p;
199+
aux2 = p;
200+
for(int i=0; i<pos; i++)
201+
aux = (*aux).sig;
202+
for(int i=0; i<pos-1; i++)
203+
aux2 = (*aux2).sig;
204+
205+
(*aux2).sig = (*aux).sig;
206+
207+
delete aux;
208+
}
209+
210+
int MontonCartas::getNumeroCarta (int pos) const
211+
{
212+
Carta *aux = p;
213+
for(int i=0; i<pos; i++)
214+
aux = (*aux).sig;
215+
216+
return (*aux).num;
217+
}
218+
219+
char MontonCartas::getPaloCarta (int pos) const
220+
{
221+
Carta *aux;
222+
aux = p;
223+
for(int i=0; i<pos; i++)
224+
aux = (*aux).sig;
225+
226+
return (*aux).palo;
227+
}
228+
229+
void MontonCartas::insertarCarta (int n, char tipo)
230+
{
231+
//1º buscamos alguna carta igual en numero y palo
232+
bool encontrada = false;
233+
Carta *aux;
234+
aux = p;
235+
while(aux!=0 && !encontrada)
236+
{
237+
if((*aux).num == n && (*aux).palo == tipo)
238+
encontrada = true;
239+
aux = (*aux).sig;
240+
}
241+
242+
//ahora la añadimos al final
243+
if(!encontrada){
244+
aux = p;
245+
//movemos aux hasta el ultimo lugar
246+
while((*aux).sig != 0){
247+
aux = (*aux).sig;
248+
}
249+
250+
//creamos la nueva carta
251+
Carta *aux2 = new Carta;
252+
(*aux2).sig = 0;
253+
(*aux2).num = n;
254+
(*aux2).palo = tipo;
255+
256+
(*aux).sig = aux2;
257+
}else
258+
cout<<"No se pudo añadir porque ya existe."<<endl;
259+
}
260+
261+
int MontonCartas::sizeMonton() const
262+
{
263+
int tam=0;
264+
Carta *aux;
265+
aux = p;
266+
for(tam; aux != 0; tam++)
267+
aux = (*aux).sig;
268+
269+
return tam;
270+
}
271+
272+
void MontonCartas::printMonton()
273+
{
274+
Carta * aux = p;
275+
char palo = '#';
276+
277+
while( aux != 0 )
278+
{
279+
if(palo == '#')
280+
palo = (*aux).palo ;
281+
282+
if(palo != (*aux).palo) {
283+
palo = (*aux).palo ;
284+
cout << endl;
285+
}
286+
287+
cout << (*aux).num << (*aux).palo << " ";
288+
289+
aux = (*aux).sig;
290+
}
291+
cout << endl;
292+
}
293+
294+
int main()
295+
{
296+
MontonCartas m(0);
297+
298+
m.printMonton();
299+
}

0 commit comments

Comments
 (0)