elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Juego de BlackJack en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Juego de BlackJack en C  (Leído 10,878 veces)
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Juego de BlackJack en C
« en: 24 Abril 2016, 15:58 pm »

La publicación original la tengo en mi pagina:

http://codigoenc.com/post/33/Juego_de_BlackJack_en_C_paso_a_paso

El juego se puede optimazar si. Se puede perzonalizar si, actualmente juega en automatico.



En este Topic vamos a hacer un juego de blackjack en C, lo vamos a tratar de ser lo mas sencillo posible explicando función por función.


Primero definiremos un Maso de cartas esto es 13 cartas desde el A hasta el K

Código
  1. char *mazo = "A234567890JQK";

Para hacer este juego lo mas escalable posible generaremos dinámicamente un mazo de juego de N bajaras, para eso tenemos la siguiente función:

Código
  1. char *crear_baraja(int n) {
  2. int i = 0,j;
  3. int offset = 0;
  4. char *cartas;
  5. cartas = calloc(sizeof(char)*52+1,n);
  6. while(i < n) {
  7. j = 0;
  8. while(j < 4) {
  9. memcpy(cartas+offset,mazo,13);
  10. offset+=13;
  11. j++;
  12. }
  13. i++;
  14. }
  15. cartas[offset] = '\0'; //Esta instrucción es innecesaria debido a la función calloc pero lo dejamos para aclarar que nuestra condicion de paro es el caracter nulo al final de la cadena
  16. return cartas;
  17. }

La funcion anterior solo nos devuelve un puntero con la memoria asignada mediante Malloc con la cantidad de bajaras que le pedimos.

Ahora si mandamos a llamar esta funcion y mostramos la cadena veremos un mazo ordenado obvio por la forma que se construyo
 En este ejemplo usaremos 2 barajas pero tengan en cuenta que puede ser hasta 1000 barajas siempre y cuando este disponible
Código
  1. baraja = crear_baraja(2);
  2. printf("Baraja:\n%s\n",baraja);
salida:
Código:
Baraja:
A234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQK

Ahora si bien tenemos que barajar la bajara.

Código
  1. char *barajar(char *baraja) {
  2. int len = strlen(baraja);
  3. char *temp = calloc(len+1,1);
  4. int r;
  5. int i = 0;
  6. /*
  7. Poner su propia funcion random disponible en su sistema
  8. En freeBSD prefiero usar arc4rand
  9. */
  10. while(i < len) {
  11. r = arc4random_uniform(len);
  12. if(baraja[r] != 0) {
  13. temp[i] = baraja[r];
  14. baraja[r] = 0;
  15. i++;
  16. }
  17. }
  18. free(baraja);
  19. return temp;
  20. }

Esta función nos devuelve un nuevo puntero con la bajara anterior pero ahora en desorden

Mostramos la salida:
Código
  1. baraja = barajar(baraja);
  2. printf("Baraja:\n%s\n",baraja);
Código:
Baraja:
9KJ4067Q6A9068Q5A08J3Q3QJ7Q3AK38A6J453762KK0852KA4Q52548753Q234A42K2Q3J7KJ090A62A5J0674KJ702689799989584

Depues de construir las funcoines de evaluar carta y evaluar jugador podemos terminar el juego
Código
  1. /*
  2. Twitter @albertobsd
  3.  */
  4. #include<stdio.h>
  5. #include<stdlib.h>
  6. #include<string.h>
  7. /*
  8. Maso basico de Cartas para su salida en pantalla.
  9. el 0 vale representa a la carta 10
  10.  */
  11. typedef struct jugador_struct {
  12. int continuar;
  13. int valor;
  14. int offset;
  15. char mano[6];
  16. }jugador;
  17.  
  18. char *mazo = "A234567890JQK";
  19.  
  20. char *crear_baraja(int n);
  21. char *barajar(char *baraja);
  22. int juego(char *bajara,int *offset,int m);
  23. void evaluar_jugador(jugador *j);
  24. int evaluar_carta(char c);
  25. void debug(char *p,int l);
  26.  
  27. int main() {
  28. char *baraja;
  29. int offset = 0;
  30. printf("Juego de BlackJack\n");
  31. printf("Creando bajara...\n");
  32. baraja = crear_baraja(2);
  33. printf("Baraja:\n%s\n",baraja);
  34. printf("Revolver bajara...\n");
  35. baraja = barajar(baraja);
  36. printf("Baraja:\n%s\n",baraja);
  37. juego(baraja,&offset,6); // La casa juega contra 6 Jugadores Solo una ronda, si queremos mas rondas tendremos que agregarlo en un ciclo y controlar el numero de cartas restantes en la baraja
  38. free(baraja);
  39. }
  40.  
  41. char *crear_baraja(int n) {
  42. int i = 0,j;
  43. int offset = 0;
  44. char *cartas;
  45. cartas = calloc(sizeof(char)*52+1,n);
  46. while(i < n) {
  47. j = 0;
  48. while(j < 4) {
  49. memcpy(cartas+offset,mazo,13);
  50. offset+=13;
  51. j++;
  52. }
  53. i++;
  54. }
  55. cartas[offset] = '\0'; //Esta instruccion es incesaria debido a la funcion calloc
  56. return cartas;
  57. }
  58.  
  59. char *barajar(char *baraja) {
  60. int len = strlen(baraja);
  61. char *temp = calloc(len+1,1);
  62. int r;
  63. int i = 0;
  64. /*
  65. Poner su propia funcion random disponible en su sistema
  66. En freeBSD prefiero usar arc4random_uniform
  67. */
  68. while(i < len) {
  69. r = arc4random_uniform(len);
  70. if(baraja[r] != 0) {
  71. temp[i] = baraja[r];
  72. baraja[r] = 0;
  73. i++;
  74. }
  75. }
  76. free(baraja);
  77. return temp;
  78. }
  79.  
  80. int juego(char *bajara,int *offset,int m) {
  81. int len = strlen(bajara);
  82. int i = offset[0],j = 0,k = 0, n = m+1;
  83. jugador **jugadores;
  84. jugadores = calloc(sizeof(jugador*),n);
  85. //memset(jugadores,0,sizeof(jugador)*2);
  86. /* Generamos n jugadores (m jugadores elegidos por el usuario + la casa jugador 0) */
  87. /* Repartimos Cartas a todos los jugadores*/
  88. while(k < n) {
  89. jugadores[k] = calloc(sizeof(jugador),1);
  90. printf("Memoria asignada para el jugador %i @ 0x%X [%i bytes]\n",k,jugadores[k],sizeof(jugador));
  91. k++;
  92. }
  93. while( j < 2 ) {
  94. k = 0;
  95. while(k < n) {
  96. jugadores[k]->mano[j] = bajara[i];
  97. jugadores[k]->offset++;
  98. i++;
  99. k++;
  100. }
  101. j++;
  102. }
  103. /* Funcion de depuracion
  104. debug(jugadores[0],16);
  105. debug(jugadores[1],16);
  106. */
  107. /*
  108. Aqui se ve la mano de cada jugador en el proximo printf dentro del ciclo solo es para fines didacticos
  109. posteriormente solo se evaluan las manos;
  110. */
  111. j = 0;
  112. while( j < n ) {
  113. printf("Jugador: %i\ncartas %s\n",j,jugadores[j]->mano);
  114. evaluar_jugador(jugadores[j]);
  115. printf("Valor actual: %i\n",jugadores[j]->valor);
  116. j++;
  117. }
  118. /*
  119. Despues de repartir las cartas los jugadores juegan y la casa se destapa al final
  120. */
  121. j = 1;
  122. while( j < n ) {
  123. while(jugadores[j]->continuar) {
  124. jugadores[j]->mano[jugadores[j]->offset] = bajara[i];
  125. //printf("Jugador: %i\ncartas %s\n",j,jugadores[j]->mano);
  126. jugadores[j]->offset++;
  127. evaluar_jugador(jugadores[j]);
  128. i++;
  129. }
  130. j++;
  131. }
  132. /*
  133. Ahora juega la casa.
  134. */
  135. while(jugadores[0]->continuar) {
  136. jugadores[0]->mano[jugadores[0]->offset] = bajara[i];
  137. jugadores[0]->offset++;
  138. evaluar_jugador(jugadores[0]);
  139. i++;
  140. }
  141. /* Mostramos a todos los resultados*/
  142. j = 1;
  143. while( j < n ) {
  144. printf("Jugador: %i\ncartas %s\n",j,jugadores[j]->mano);
  145. printf("Valor actual: %i\n",jugadores[j]->valor);
  146. if(jugadores[j]->valor > 21) {
  147. printf("Perdio\n");
  148. }
  149. else {
  150. if(jugadores[j]->valor == 21) {
  151. printf("Gano BlackJack\n");
  152. }
  153. else {
  154. if(jugadores[0]->valor > 21) {
  155. printf("Gano\n");
  156. }
  157. else {
  158. if(jugadores[j]->valor > jugadores[0]->valor) {
  159. printf("Gano\n");
  160. }
  161. else {
  162. printf("Perdio\n");
  163. }
  164. }
  165. }
  166. }
  167. j++;
  168. }
  169.  
  170. /*
  171. Liberamos memoria de los jugadores
  172. */
  173. while( j < n ) {
  174. free(jugadores[j]);
  175. j++;
  176. }
  177. /*
  178. Retornamos el valor actaul del offset mediante la direccion de memoria del argumento.
  179. y Retornamos el jugador ganador;
  180. */
  181. offset[0] = i;
  182. return 1;
  183. }
  184.  
  185. void evaluar_jugador(jugador *j) {
  186. int i = 0;
  187. char v;
  188. j->valor = 0;
  189. while(j->mano[i] != 0) {
  190. v = evaluar_carta(j->mano[i]);
  191. if(v == 1) {
  192. if((j->valor + 11) <= 21 ) {
  193. j->valor += 11;
  194. }
  195. else {
  196. j->valor += v;
  197. }
  198. }
  199. else {
  200. j->valor += v;
  201. }
  202. if(j->valor <= 16) {
  203. j->continuar = 1;
  204. }
  205. else {
  206. j->continuar = 0;
  207. }
  208. i++;
  209. }
  210. }
  211.  
  212. int evaluar_carta(char c) {
  213. int r = 0;
  214. switch(c) {
  215. case 'A':
  216. r = 1;
  217. break;
  218. case 'K':
  219. case 'Q':
  220. case 'J':
  221. case '0':
  222. r = 10;
  223. break;
  224. case '1':
  225. case '2':
  226. case '3':
  227. case '4':
  228. case '5':
  229. case '6':
  230. case '7':
  231. case '8':
  232. case '9':
  233. r = c - '0';
  234. break;
  235. }
  236. return r;
  237. }
  238.  
  239. void debug(char *p,int l) {
  240. int i = 0;
  241. printf("0x%x\n",p);
  242. while(i < l) {
  243. printf("%.2x",p[i]);
  244. i++;
  245. }
  246. printf("\n");
  247. }
  248.  

Salida completa

Código:
Juego de BlackJack
Creando bajara...
Baraja:
A234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQK
Revolver bajara...
Baraja:
57A6627296K55Q4Q0073Q2K4J6J297A962AK40350J87754369JJ3JJ7AJQ20828A9A5K0528K8549K9Q0AKK69604487Q38843Q33AQ
Memoria asignada para el jugador 0 @ 0x2880D040 [20 bytes]
Memoria asignada para el jugador 1 @ 0x2880D060 [20 bytes]
Memoria asignada para el jugador 2 @ 0x2880D080 [20 bytes]
Memoria asignada para el jugador 3 @ 0x2880D0A0 [20 bytes]
Memoria asignada para el jugador 4 @ 0x2880D0C0 [20 bytes]
Memoria asignada para el jugador 5 @ 0x2880D0E0 [20 bytes]
Memoria asignada para el jugador 6 @ 0x2880D100 [20 bytes]
Jugador: 0
cartas 52
Valor actual: 7
Jugador: 1
cartas 79
Valor actual: 16
Jugador: 2
cartas A6
Valor actual: 17
Jugador: 3
cartas 6K
Valor actual: 16
Jugador: 4
cartas 65
Valor actual: 11
Jugador: 5
cartas 25
Valor actual: 7
Jugador: 6
cartas 7Q
Valor actual: 17
Jugador: 1
cartas 794
Valor actual: 20
Gano
Jugador: 2
cartas A6
Valor actual: 17
Perdio
Jugador: 3
cartas 6KQ
Valor actual: 26
Perdio
Jugador: 4
cartas 650
Valor actual: 21
Gano BlackJack
Jugador: 5
cartas 250
Valor actual: 17
Perdio
Jugador: 6
cartas 7Q
Valor actual: 17
Perdio


En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Juego de BlackJack en C
« Respuesta #1 en: 28 Abril 2016, 06:24 am »

Original:
http://codigoenc.com/post/33/Juego_de_BlackJack_en_C_paso_a_paso/#msg-41

Otra codigo que podemos aplicar es el estar contando cartas, si alguno ha visto la pelicula de 21 en donde el protagonista es un genio con los numeros y es capas de llevar el conteo de cartas de forma facil, pues el contar cartas para un progragrama de computadoras bien diseñado es simple:

La siguiente funcion asigna valores a las cartas en modo contador para las altas un valor de -1 y para las chicas un valor de +1. lo que quiere decir es que cuando salgan muchas cartas chica, el contador tendra un valor alto, y es cuando mas probabilidades tenemos de que la próxima carta sea una carta de 10 o J,Q,K y  As.

Y dependiendo de la mano que tengamos es posible pedir mas cartas o plantarnos.

Código
  1. int valor_conteo(char c) {
  2. int r = 0;
  3. switch(c) {
  4. case 'A':
  5. case 'K':
  6. case 'Q':
  7. case 'J':
  8. case '0':
  9. r = -1;
  10. break;
  11. case '7':
  12. case '8':
  13. case '9':
  14. r = 0;
  15. break;
  16. case '2':
  17. case '3':
  18. case '4':
  19. case '5':
  20. case '6':
  21. r =1;
  22. break;
  23. }
  24. return r;
  25. }

Ahora para mostrar que funciona vamos a contar toda la baraja y ver la salida

Código
  1. baraja = barajar_baraja(baraja);
  2. len = strlen(baraja);
  3. printf("%s\n",baraja);
  4. i = 0;
  5. while(i < len) {
  6. conteo += valor_conteo(baraja[i]);
  7. printf("%i\n",conteo);
  8. i++;
  9. }

Salida

Código:
Creando barja:
A234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQK
Barajando:
4Q907566846A3J8Q6Q287270A388J2J9KK0J323QK390K98A6428539804723J74A954862KK5JAQ9Q80066233067347AJQ0708K56A49A9686322Q63QJA48AJ5795Q7903JQ87J9J44596K36J06Q3A7794562732AK652AJ6J005QQ0A024A62A8K0409298A62KJ754Q553Q8A59278QK745342Q6782588Q9897K7A9J40JA9407K05K087A623K542Q5K92A3K9K57338KQJQ5K6K3AJJQ35494J20J4Q5K47A0KJ
Conteo:
1
0
0
-1
-1
0
1
2
2
3
4
3
4
3
3
2
3
2
3
3
3
4
4
3
2
3
3
3
2
3
2
2
1
0
-1
-2
-1
0
1
0
-1
0
0
-1
-2
-2
-2
-3
-2
-1
0
0
1
2
2
2
1
2
2
3
4
3
3
4
3
3
4
5
5
6
7
6
5
6
5
4
3
3
2
2
1
0
1
2
3
4
5
4
5
5
6
7
7
6
5
4
3
3
2
2
1
2
3
2
3
3
2
2
3
3
4
5
6
7
6
7
8
7
6
5
6
6
5
4
5
5
5
6
5
5
5
4
5
4
3
3
3
2
2
1
2
3
4
4
5
4
5
6
5
4
5
4
5
4
4
4
4
5
6
7
8
8
9
10
9
8
9
10
11
10
9
10
9
8
7
8
7
6
5
4
3
4
5
4
5
6
5
5
4
3
4
3
3
4
4
4
3
4
5
4
3
3
4
5
4
5
6
7
6
6
5
6
6
7
7
7
6
5
5
6
7
8
9
10
9
10
10
10
11
12
12
12
11
11
11
11
11
10
10
9
9
8
9
8
7
6
6
7
6
6
5
4
5
4
3
3
3
2
3
4
5
4
5
6
7
6
7
6
6
7
6
7
6
6
5
6
6
7
8
8
7
6
5
4
5
4
5
4
5
4
3
2
1
2
3
4
4
5
4
5
4
3
4
3
4
3
4
4
3
2
1
0

En teoria cuando los numeros estan sobre 10 tenemos mas chance de recibir una carta alta, asi que si en nuestra mano tenesmo 10 u 11 podremos ganar, en caso de tener mas de 11 nos arriesgamos a perder, igualemente si tenemos 2 10, podriamos hacer split

El ejemplo anterior se uso con 6 barajas, lo he probado con 1000 barajas y los contadores son mas variables que van desde los -130 hasta los 130


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
juegos para equipos nextel: poker, blackjack,golf carreras de autos.
Juegos y Consolas
ALEX_21_3 0 2,307 Último mensaje 1 Agosto 2008, 10:00 am
por ALEX_21_3
[Duda] Juego BlackJack python
Scripting
SrVamp 4 6,442 Último mensaje 11 Febrero 2013, 08:31 am
por SrVamp
Necesito realizar un algoritmo del juego blackjack
Programación General
uffje_15 2 5,615 Último mensaje 7 Marzo 2013, 16:56 pm
por 1mpuls0
Ataque Pixie Dust Attack y Ataque Blackjack « 1 2 »
Wireless en Linux
ChimoC 10 11,829 Último mensaje 2 Abril 2015, 11:34 am
por sanson
Cinematicas de juego viejo, son comicas, no se como se llama el juego
Juegos y Consolas
engel lex 0 3,192 Último mensaje 24 Julio 2015, 22:32 pm
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines