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

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Juego de Ping-Pong hecho en C.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Juego de Ping-Pong hecho en C.  (Leído 26,250 veces)
NeoB

Desconectado Desconectado

Mensajes: 69


Ver Perfil
Juego de Ping-Pong hecho en C.
« en: 1 Julio 2012, 19:24 pm »

Buenas, aquí tienen el código de un juego de ping-pong hecho en C, el famoso pong, pero con un solo jugador. No se si calificarlo como aporte o no así que, porfavor, decidme errores y mejoras (como los tics esos que parece que tiene aveces). Para compilarlo: gcc -o pong pong.c -lncurses -lpthread
(Es para Linux y se ejecuta en una terminal, utiliza ncurses)

**Un video:


Código
  1. /*
  2. -----Creado por neob
  3. -----Juego de ping-pong.
  4. -----Compilar con gcc -o pong pong.c -lncurses -lpthread .
  5. -----Controles:
  6. -- W - Mover la paleta hacia arriba.
  7. -- S - Mover la paleta hacia abajo.
  8. -- A - Mover la paleta hacia la izquierda.
  9. -- D - Mover la paleta hacia la derecha.
  10. */
  11.  
  12.  
  13. #include <stdio.h> //Simple constumbre....
  14. #include <ncurses.h> //Utilizar ncurses.
  15. #include <math.h> //Funciones para la obtención de números aleatorios ( rand() ).
  16. #include <pthread.h> //Ejecución con varios hilos.
  17. #include <time.h> //Proporciona time() que nos devuelve la hora.
  18.  
  19. /*******************************/
  20. int salir_ncurses(); //Cierra el modo ncurses.
  21. void dibujar_marco(); //Dibuja el marco.
  22. void *hiloposiciones(); //Se encarga de mover la paleta y dibujar la paleta y la pelota.
  23. void *hilomoverpelota(); //Se encarga de mover la pelota.
  24. void dibujar_pelota(); //Dibuja la pelota en una posición aleatoria (la primera vez).
  25. void pintar_paleta(); //Dibuja la paleta (la primera vez).
  26. void direc_aleatoria(); //Una dirección aleatoria para la bola (la primera vez).
  27. void escojer_dificultad(); //Se encarga de la dificultad del juego.
  28. /*******************************/
  29.  
  30.  
  31. /******   VARIABLES   *******/
  32. int x_pelota, y_pelota, x_paleta, y_paleta, dpx_pelota, dpy_pelota, dificultad;
  33. char key; //Guarda la tecla que pulsamos.
  34. /*** Variables para los hilos ***/
  35. pthread_t idhiloposiciones; //Identificador del hilo hiloposiciones
  36. pthread_t idhilomoverpelota; //Identificador del hilo hilomoverpelota.
  37. int error_hilo1, error_hilo2; //Para comprobar que no ha habido errores en los hilos.
  38. /****************************/
  39.  
  40.  
  41. int main()
  42. {
  43. initscr(); //Entramos en ncurses.
  44. noecho(); //Que no salgan las teclas pulsadas.
  45.  
  46.        dibujar_marco(); //Dibujamos las paredes.
  47. pintar_paleta(); //Pintamos la paleta.
  48.        dibujar_pelota();  //Dibujamos la pelota.
  49. direc_aleatoria(); //Para que se mueva la pelota por primera vez (Solo la llamamos aquí).
  50. escojer_dificultad(); //Le preguntamos al jugador la dificultad que quiere que tenga el juego (irá en función de la velocidad de la bola).
  51.  
  52. srand( time(NULL) ); //Cambiamos la semilla de rand.
  53.  
  54. error_hilo1 = pthread_create(&idhiloposiciones, NULL, hiloposiciones, NULL); //Lo creamos.
  55. error_hilo2 = pthread_create(&idhilomoverpelota, NULL, hilomoverpelota, NULL); //Lo creamos.
  56.  
  57. if (error_hilo1 != 0 && error_hilo2 != 0) //Si ha habido error, no podemos seguir adelante.
  58. {
  59. clear();
  60. move(LINES/2,COLS/2);
  61. printw("ERROR AL CREAR HILOS DE EJECUCIÓN.");
  62. return -1;
  63. }
  64.  
  65. while( key != 'e' && key != 'E' )//Si pulsamos E, nos vamos.
  66. {
  67. key = getch();
  68. if (key == 'w' || key == 'W') { x_paleta = x_paleta - 1; }
  69. if (key == 's' || key == 'S') { x_paleta = x_paleta + 1; }
  70. if (key == 'a' || key == 'A') { y_paleta = y_paleta - 1; }
  71. if (key == 'd' || key == 'D') { y_paleta = y_paleta + 1; }
  72. }
  73.  
  74. salir_ncurses(); kill(&idhiloposiciones); kill(&hilomoverpelota); return 0; //Hemos salido pulsando E, salimos de ncurses, matamos los hilos y nos vamos.
  75.  
  76. }
  77.  
  78. void *hiloposiciones()
  79. {
  80. for(;;)
  81. {
  82.    int i; //Para contar.
  83.  
  84.    clear(); //Borramos la pantalla para renovar todas las posiciones.
  85.    dibujar_marco(); //Volvemos a dibujar el marco.
  86.  
  87.            /*************** PALETAS ***********/
  88.            if (y_paleta != 0 && y_paleta <= COLS -1 && x_paleta != 0 && (x_paleta - 3) != LINES - 1) //No vas a atravesar el marco, no¿?
  89.    {
  90.     for( i=0; i<4; i++ )
  91.        {
  92. move(x_paleta + i, y_paleta);
  93. printw("#");
  94.        }
  95.    } else
  96.     {
  97.                   if (y_paleta <= 0)
  98.   {
  99. y_paleta = 1; //Volvemos a ajustarla a 1 (para que no pueda salir del marco por la izquierda).
  100.   for( i=0; i<4; i++ )
  101.                {
  102. move(x_paleta + i, y_paleta);
  103. printw("#");
  104.           }
  105.   }
  106.  
  107.               if (y_paleta >= COLS - 1)
  108.   {
  109.   y_paleta = COLS - 2; //Volvemos a ajustarla a COLS - 2 (para que no pueda salir del marco, pero esta vez por la derecha).
  110.   for( i=0; i<4; i++ )
  111.               {
  112. move(x_paleta + i, y_paleta);
  113. printw("#");
  114.           }
  115.   }
  116.  
  117.               if (x_paleta <= 0) //Para que no se salga por arriba.
  118.   {
  119.   x_paleta = 1;
  120.   for( i=0; i<4; i++ )
  121.               {
  122. move(x_paleta + i, y_paleta);
  123. printw("#");
  124.           }
  125.   }
  126.  
  127.   if ( (x_paleta + 3) >= LINES - 1) //Para que no se salga por debajo.
  128.   {
  129.   x_paleta = LINES - 4;
  130.   for( i=0; i<4; i++ )
  131.               {
  132. move(x_paleta + i, y_paleta);
  133. printw("#");
  134.           }
  135.   }
  136.      }
  137.  
  138.     /***************** PELOTA ******************/
  139.     move(x_pelota, y_pelota); //Segun las posiciones marcadas por el hilo hilomoverpelota...
  140.     printw("O"); // ...pintamos las pelota.
  141.  
  142. /*     //----LO UTILIZO PARA VER LOS ERRORES EN LAS VARIABLES Y EN LAS POSICIONES.
  143.     move(3,3);
  144.     printw("-DEBUG: dpx_pelota=%d; dpy_pelota=%d; x_pelota=%d; y_pelota=%d; x_paleta=%d; y_paleta=%d;", dpx_pelota, dpy_pelota, x_pelota, y_pelota, x_paleta, y_paleta); //DEBUG
  145. */
  146.  
  147.     if (y_pelota <= 0) //Significa que no ha parado la pelota, se acaba el juego.
  148.     {
  149.      kill(idhiloposiciones); kill(idhilomoverpelota);
  150.    clear();
  151.      move(LINES/2,COLS/2);
  152.      printw("FIN DEL JUEGO!");
  153.     }
  154.  
  155.     if ( (y_pelota == y_paleta) && ((x_pelota == x_paleta) || (x_pelota == x_paleta + 1) || (x_pelota == x_paleta + 2)  || (x_pelota == x_paleta + 3)) )
  156.     {
  157.         dpy_pelota = - dpy_pelota; //Si rebota contra la pala, tenemos que cambiar su sentido.
  158.       y_pelota = y_pelota + dpy_pelota; //Después de cambiar su sentido hay que volver a actualizar la posición de la pelota.
  159.     }
  160.  
  161.     usleep(20*1000); //sleep() trabaja con segundos, por eso usamos usleep(), que trabaja con milisegundos.
  162.     refresh(); //Mostramos los cambios en las posiciones.
  163.  
  164. }
  165. }
  166.  
  167. /*************************** MOVIMIENTO PELOTA ***************************/
  168. void *hilomoverpelota()
  169. {
  170. for(;;)
  171. {
  172.     if (!( (y_pelota == y_paleta) && ((x_pelota == x_paleta) || (x_pelota == x_paleta + 1) || (x_pelota == x_paleta + 2)  || (x_pelota == x_paleta + 3))) )
  173.     {  
  174.                     x_pelota = x_pelota + dpx_pelota; //Si no está rebotando con la pala, tiene que continuar su camino, por lo que sigue por su camino.
  175.     y_pelota = y_pelota + dpy_pelota;
  176.     }
  177.  
  178.     if (x_pelota <= 1) //Para que la pelota rebote contra la pared.
  179.     {
  180.     dpx_pelota = - dpx_pelota;
  181.     }
  182.  
  183.     if (x_pelota >= LINES - 1) //Para que la pelota rebote contra la pared.
  184.     {
  185.     dpx_pelota = - dpx_pelota;    
  186.     }
  187.  
  188.     if (y_pelota >= COLS - 1) //Para que la pelota rebote contra la pared.
  189.     {
  190.     dpy_pelota = - dpy_pelota;    
  191.     }
  192.  
  193.     usleep( dificultad*1000 );
  194. }
  195. }
  196.  
  197.  
  198.  
  199.  
  200.  
  201. /************ Funciones secundarias como dibujar objetos, salir de ncurses, ... ******************/
  202.  
  203. int salir_ncurses()
  204. {
  205. endwin();
  206. return 0;
  207. }
  208.  
  209. void dibujar_marco()
  210. {
  211. int i;
  212.        for(i=0;i<LINES;i++) //Pintamos las paredes: LINES indica el numero de lineas de la terminal y COLS el de columnas (proporcionados por la librería ncurses).
  213.        {
  214.         move(i,0);
  215.         printw("|");
  216.         move(i,COLS - 1);
  217.         printw("|");
  218.        }
  219.  
  220. for(i=0;i<COLS-1;i++)
  221. {
  222. move(0,i);
  223. printw("_");
  224. move(LINES -1,i);
  225. printw("_");
  226. }
  227. }
  228.  
  229. void dibujar_pelota() //Dibujamos la pelota (en una posicion aleatoria dentro de un margen).
  230. {
  231. x_pelota = (int) ( rand() % ((LINES/2+4)-(LINES/2-4)+1) + (LINES/2 - 4) ); //Escojemos un numero aleatorio con rand().
  232. y_pelota = (int) ( rand() % ( (((COLS-1) - COLS/9) + 4)-(((COLS-1) - COLS/9) - 4)+1 ) + (((COLS-1) - COLS/9) - 4) );
  233. move(x_pelota, y_pelota);
  234. printw("O");
  235. }
  236.  
  237.  
  238. void pintar_paleta() //Pintamos la paleta.
  239. {
  240. int i;
  241. y_paleta = 3; // Eje y > columnas
  242. x_paleta = LINES/2 - 3; // Eje x >> líneas
  243.  
  244. for( i=0; i<4; i++ )
  245. {
  246. move(x_paleta + i, y_paleta);
  247. printw("#");
  248. }
  249. }
  250.  
  251. void direc_aleatoria() //Elejimos una primera dirección aleatoria para la pelota.
  252. {
  253. dpx_pelota = ( rand() % (+1 - (-1) +1) + (-1) );
  254. dpy_pelota = -1;
  255.  
  256. }
  257.  
  258.  
  259. void escojer_dificultad() //Escojemos la dificultad del juego.
  260. {
  261. char d;
  262. clear();
  263. move(3,3);
  264. printw("\n-Creado por Juan Escudero Pedrosa.\n"
  265.       "-Indique el nivel de dificultad:\n"
  266.       "\t1 - Fácil.\n"
  267.       "\t2 - Medio.\n"
  268.       "\t3 - Difícil.\n\n"
  269.       "\t(Los controles son W,S,A y D)");
  270. d = getch();
  271. switch(d)
  272. {
  273. case '1': dificultad = 200; break;
  274. case '2': dificultad = 100; break;
  275. case '3': dificultad = 50; break;
  276. default:
  277. clear();
  278. move(3,3);
  279. printw("No se ha seleccionado ningún nivel de dificultad, se tomará por defecto el nivel 2 (Medio). Pulse una tecla para continuar.");
  280.                dificultad = 100;
  281. getch();
  282. break;
  283. }
  284.  
  285. }
  286.  


« Última modificación: 28 Junio 2013, 21:00 pm por NeoB » En línea

durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: Juego de Ping-Pong hecho en C.
« Respuesta #1 en: 3 Julio 2012, 01:06 am »

Hola! lo compile pero me tira varios errores y todo se debe a que LINES y COLS no estan declarados... son constantes que vos definist??? si es asi decime que valor les diste asi puedo jugar :)


Saludos


En línea

Ahorrate una pregunta, lee el man
NeoB

Desconectado Desconectado

Mensajes: 69


Ver Perfil
Re: Juego de Ping-Pong hecho en C.
« Respuesta #2 en: 3 Julio 2012, 18:06 pm »

Buenas durasno. LINES y COLS están definidas por ncurses. ¿Podrías copiar el error que te sale?
En línea

Dryken

Desconectado Desconectado

Mensajes: 117


El arte de vencer se aprende en las derrotas


Ver Perfil WWW
Re: Juego de Ping-Pong hecho en C.
« Respuesta #3 en: 6 Julio 2012, 04:55 am »

Pues a mi no me tira error, lo unico que no tengo instalada la libreria ncurses.h a ver si me la instalo. Por cierto, al instalarme esa libreria, ¿que debo colocar en las opciones del compilador para linquearla?

Edito:

Libreria ncurses.h

http://rudy.mif.pg.gda.pl/~anowocin/curses/curses.devpak

Linkear en opciones del compilador "-lcurses"
« Última modificación: 6 Julio 2012, 05:14 am por Dryken » En línea

Lo intentas y fracasas, lo intentas y fracasas pero fracasas realmente cuando dejas de intentarlo.

Calc Don v0.7 - C
http://foro.elhacker.net/programacion_cc/source_calculadora_calc_don_10-t366489.0.html

Hundir la flota v0.3 - C#
http://foro.elhacker.net/net/source_c_juego_hundir_la_flota_v01-t377794.0.html
dato000


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
Re: Juego de Ping-Pong hecho en C.
« Respuesta #4 en: 6 Julio 2012, 05:24 am »

muy bueno, yo estoy comenzando a analizar estos juegos desde c a ver que se puede hacer, viejo esto es motivación.

De momento me parece increible tanto codigo para algo tan sencillo, eso del ncurses me tiene intrigado. como dije en el video, felicitaciones.
En línea


NeoB

Desconectado Desconectado

Mensajes: 69


Ver Perfil
Re: Juego de Ping-Pong hecho en C.
« Respuesta #5 en: 7 Julio 2012, 14:09 pm »

-Para instalar la librería ncurses solo teclea en la consola: "sudo apt-get install libncurses5*"
En línea

Dryken

Desconectado Desconectado

Mensajes: 117


El arte de vencer se aprende en las derrotas


Ver Perfil WWW
Re: Juego de Ping-Pong hecho en C.
« Respuesta #6 en: 8 Julio 2012, 04:00 am »

Citar
-Para instalar la librería ncurses solo teclea en la consola: "sudo apt-get install libncurses5*"

Amigo imagino que al hacerlo de ese modo se instalara en la distro linux, ya que en MS-DOS de win no lo permite.
En línea

Lo intentas y fracasas, lo intentas y fracasas pero fracasas realmente cuando dejas de intentarlo.

Calc Don v0.7 - C
http://foro.elhacker.net/programacion_cc/source_calculadora_calc_don_10-t366489.0.html

Hundir la flota v0.3 - C#
http://foro.elhacker.net/net/source_c_juego_hundir_la_flota_v01-t377794.0.html
durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: Juego de Ping-Pong hecho en C.
« Respuesta #7 en: 8 Julio 2012, 09:05 am »

Al finnn pude instalar ncurses!!! ahora funciona sin problemas... jugando :)


Citar
imagino que al hacerlo de ese modo se instalara en la distro linux
Sí, es un comando para linux. Si trabajas con code:blocks tal vez te sirva este link:
http://valijon.blogspot.com.ar/2011/01/ejecutar-ncurses-en-windows.html


Saludos
En línea

Ahorrate una pregunta, lee el man
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
juego del ping pong
Programación Visual Basic
chaarlyyyy 5 5,756 Último mensaje 10 Octubre 2009, 05:27 am
por BlackZeroX
Ayuda. ping pong
Programación Visual Basic
ninto33 3 3,908 Último mensaje 23 Enero 2010, 23:20 pm
por ninto33
[JUEGO] Pong! XD « 1 2 »
Programación Visual Basic
79137913 18 7,875 Último mensaje 11 Febrero 2011, 12:23 pm
por 79137913
PONG Game - Simple Juego "Pong" [VBScript + HTA] (100% Notepad)
Scripting
JohnConnor 0 4,994 Último mensaje 22 Febrero 2013, 19:07 pm
por JohnConnor
Juego del Pong en C
Programación C/C++
almer95 1 2,074 Último mensaje 2 Enero 2015, 14:36 pm
por Yoel Alejandro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines