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

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  1º Reto de Retrodev
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 2 [3] 4 5 Ir Abajo Respuesta Imprimir
Autor Tema: 1º Reto de Retrodev  (Leído 15,126 veces)
SrCooper

Desconectado Desconectado

Mensajes: 137


Bazinga!


Ver Perfil
Re: 1º Reto de Retrodev
« Respuesta #20 en: 6 Julio 2013, 23:53 pm »

Ya está lista la ALPHA de mi juego. Aquí el código:

Código
  1. #include <allegro.h>
  2. #include <list>
  3. #include <cstdlib>
  4. #include <time.h>
  5. #include <string>
  6. using namespace std;
  7.  
  8. const int XTAM = 60, YTAM = 40;
  9. const int SZ = 12;
  10.  
  11. int vx = 1, vy = 0;
  12. int al, score = 0;
  13.  
  14. BITMAP *cuadrado1;
  15. BITMAP *cuadradobmp;
  16. BITMAP *buffer;
  17. BITMAP *fruta;
  18. BITMAP *manzanabmp;
  19. BITMAP *fresabmp;
  20. BITMAP *bombabmp;
  21.  
  22. void draw_score()
  23. {
  24.    rectfill(screen, 0,0,200,14,0);
  25.    textprintf(screen, font, 0, 0, -1, "SCORE:  %d", score);
  26. }
  27.  
  28. void pantalla(){
  29.    blit(buffer, screen, 0,0,0,0, XTAM*SZ, YTAM*SZ);
  30. }
  31. struct Punto{
  32.    int x,y;
  33. };
  34.  
  35. void cuadrado(const Punto& p){
  36.    blit(cuadradobmp, cuadrado1, 0, 0, 0, 0, 12, 12);
  37.    draw_sprite(buffer, cuadrado1, p.x*SZ, p.y*SZ);
  38. }
  39.  
  40. void pinta_comida(const Punto& p){
  41.    srand(time(0));
  42.    if (al==0) blit(manzanabmp, fruta, 0, 0, 0, 0, 12, 12);
  43.    if (al==1) blit(fresabmp, fruta, 0, 0, 0, 0, 12, 12);
  44.    draw_sprite(buffer, fruta, p.x*SZ, p.y*SZ);
  45. }
  46.  
  47. Punto al_azar(){
  48.    srand(time(0));
  49.    Punto p = {rand() % XTAM, rand() % YTAM};
  50.    al = rand() % 2;
  51.    return p;
  52. }
  53.  
  54. void teclas(){
  55.        if (key[KEY_UP] && vy != 1){
  56.            vx = 0, vy = -1;
  57.       }else if (key[KEY_DOWN] && vy != -1){
  58.            vx = 0; vy = 1;
  59.       }else if (key[KEY_LEFT] && vx != 1){
  60.            vx = -1, vy = 0;
  61.       }else if (key[KEY_RIGHT] && vx != -1){
  62.            vx = 1, vy = 0;
  63.       }
  64. }
  65.  
  66. bool hay_choque(const Punto& cabeza, const list<Punto>& cola){
  67.    if (cabeza.x >= XTAM  || cabeza.x < 0) return true;
  68.    if (cabeza.y >= YTAM  || cabeza.y < 0) return true;
  69.    list <Punto>::const_iterator it = cola.begin();
  70.    for (; it != cola.end(); it++){
  71.        if (cabeza.x == it->x && cabeza.y == it->y){
  72.            return true;
  73.        }
  74.    }
  75.    return false;
  76. }
  77.  
  78. int main(){
  79.    allegro_init();
  80.    install_keyboard();
  81.  
  82.    set_color_depth(32);
  83.    set_gfx_mode(GFX_AUTODETECT_WINDOWED, XTAM * SZ, YTAM * SZ, 0, 0);
  84.  
  85.    buffer = create_bitmap(XTAM * SZ, YTAM * SZ);
  86.    cuadrado1 = create_bitmap(12,12);
  87.    cuadradobmp = load_bitmap("imagenes/cabeza.bmp", NULL);
  88.    fruta = create_bitmap(12,12);
  89.    fresabmp = load_bitmap("imagenes/fresa.bmp", NULL);
  90.    manzanabmp = load_bitmap("imagenes/manzana.bmp", NULL);
  91.    bombabmp = load_bitmap("imagenes/bomba.bmp", NULL); //Ya desvelo lo que incluire proximamente ;D
  92.  
  93.    list<Punto> cola;
  94.    int engorda = 0;
  95.    int retraso = 0;
  96.  
  97.    bool choque = false;
  98.    Punto cara = {30, 30};
  99.    Punto comida = al_azar();
  100.  
  101.    while(!key[KEY_ESC] && !choque ){
  102.        pantalla();
  103.        retraso++;
  104.        teclas();
  105.        draw_score();
  106.  
  107.         if (retraso==8){
  108.            cola.push_front(cara);
  109.            if (engorda > 0){
  110.                engorda--;
  111.            }else {
  112.                cola.pop_back();
  113.            }
  114.            cara.x += vx;
  115.            cara.y += vy;
  116.            if (hay_choque(cara, cola)){
  117.                choque = true;
  118.  
  119.            } else if (cara.x == comida.x && cara.y == comida.y){
  120.                engorda = 5;
  121.                if (al==0) score += 5;
  122.                else if (al==1) score +=10;
  123.                comida = al_azar();
  124.                while (hay_choque(comida, cola) ||
  125.                    comida.x == cara.x && comida.y == cara.y ||
  126.                    comida.y < 5){
  127.                        comida = al_azar();
  128.                    }
  129.            }
  130.  
  131.            retraso = 0;
  132.        }
  133.    if (!choque){
  134.            clear(buffer);
  135.            list<Punto>::const_iterator it;
  136.            for (it = cola.begin(); it != cola.end(); it++){
  137.                cuadrado(*it);
  138.            }
  139.            cuadrado(cara);
  140.            pinta_comida(comida);
  141.  
  142.        }
  143.        rest(10);
  144.    }
  145.  
  146.    rectfill(screen, 0,0,200,14,0);
  147.    textprintf(screen, font, 200, 200, -1, "Tu puntuacion ha sido de:  %d", score);
  148.    rest(2000);
  149.    return 0;
  150. }
  151. END_OF_MAIN();
  152.  

He usado Allegro, una lista para crear a mi serpiente y estructuras en lugar de clases. El juego de momento solo tiene una fruta cada vez, aunque hay varios tipos de fruta (cada una da diferentes puntos).
El juego funciona perfectamente, aunque aún me queda incluirle un menú, más frutas y algún tipo de jefe o algo así  >:D

PD: Cuando pueda subiré los archivos compilados en linux y windows :D


« Última modificación: 7 Julio 2013, 00:00 am por SrCooper » En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: 1º Reto de Retrodev
« Respuesta #21 en: 7 Julio 2013, 00:18 am »

¡Allegro! Por fin alguien lo usa ^^

Aunque no acabo de entender bien tú código, no sé, es un poco extraño (¿Que es retraso?)


En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
SrCooper

Desconectado Desconectado

Mensajes: 137


Bazinga!


Ver Perfil
Re: 1º Reto de Retrodev
« Respuesta #22 en: 7 Julio 2013, 00:41 am »

¡Allegro! Por fin alguien lo usa ^^

Aunque no acabo de entender bien tú código, no sé, es un poco extraño (¿Que es retraso?)

Ahora que lo veo, en realidad es un poco retorcido pero es útil. Retraso es una variable que aumenta cada vez que se realiza un ciclo. Y solo cuando esta variable es igual a 10 (se han completado 10 ciclos) se realizan las acciones de mover a la serpiente y se resetea el valor. Si te fijas las acciones que no son de movimiento están fuera de este if.

La función de este valor es bajar un poco la velocidad del juego. También podría haberse hecho aumentando el valor del rest del final, pero con esta variable se concreta que solo queremos bajarle el "ritmo" al movimiento de la serpiente. Prueba a quitarla y se hace injugable, te lo aseguro  :xD
Un saludo
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: 1º Reto de Retrodev
« Respuesta #23 en: 7 Julio 2013, 01:04 am »

Ahora que lo veo, en realidad es un poco retorcido pero es útil. Retraso es una variable que aumenta cada vez que se realiza un ciclo. Y solo cuando esta variable es igual a 10 (se han completado 10 ciclos) se realizan las acciones de mover a la serpiente y se resetea el valor. Si te fijas las acciones que no son de movimiento están fuera de este if.
Entiendo... Bueno es factible ^^

Aunque lo ideal (tanto en rendimiento como en claridad) sería hacer una tarea en segundo plano (hilo). Además es mucho más flexible (puedes ponerle el tiempo que quieras).
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
SrCooper

Desconectado Desconectado

Mensajes: 137


Bazinga!


Ver Perfil
Re: 1º Reto de Retrodev
« Respuesta #24 en: 9 Julio 2013, 23:31 pm »

Ya está listo el archivo compilado de mi juego, la verdad,  había olvidado completamente que tenía que subirlo  :silbar:

En el archivo están el código fuente y el ejecutable, que por alguna razón que desconozco, no funciona. Sin embargo desde el CodeBlocks si que corre, supongo que faltará algo, pero no consigo averiguar que es, agradecería que alguien lo dijese.

Esta era solo una versión ALPHA, para probar la dinámica del juego y todo eso. Ahora mismo estoy realizando una versión definitiva en SDL y OpenGL, que espero poder terminar y que sea mucho mejor  :xD

Un saludo

Descarga: http://www.mediafire.com/?fb8qoly710qnkzk

PD: Una captura, un poco cutre la verdad, pero estoy mejorandolo  :D


« Última modificación: 9 Julio 2013, 23:34 pm por SrCooper » En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: 1º Reto de Retrodev
« Respuesta #25 en: 10 Julio 2013, 00:42 am »

No te funciona directamente porque no encuentra la carpeta "Imagenes" (cuando lo ejecutas desde el Codeblocks, te pilla la carpeta del proyecto como raiz y no la del ejecutable). Por otro lado es posible compilar las Allegro estáticamente (es decir, incrustar la librería dentro del ejecutable, de esa forma no necesitas la DLL).

Esta es la configuración que tienes que poner:
http://imageshack.us/a/img546/3949/nst6.png
http://imageshack.us/a/img812/1416/qr2o.png

El código me da muchos warnings:
Código
  1. textprintf(screen, font, 0, 0, -1, "SCORE:  %d", score);

Esta función está anticuada, en su lugar puedes usar textprintf_ex:
https://www.allegro.cc/manual/4/api/text-output/textprintf_ex

Y me da problemas cada vez que se come una fruta (sufre un retraso apreciable).
« Última modificación: 10 Julio 2013, 00:44 am por amchacon » En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
SrCooper

Desconectado Desconectado

Mensajes: 137


Bazinga!


Ver Perfil
Re: 1º Reto de Retrodev
« Respuesta #26 en: 10 Julio 2013, 00:50 am »

Y me da problemas cada vez que se come una fruta (sufre un retraso apreciable).

Te diré a qué creo que se debe: cada vez que la serpiente se come una fruta se selecciona una nueva posición para esta. Si esta posición coincide con cualquiera de las posiciones de la serpiente entonces se vuelve a llamar a la función random(). Sé que no es la manera más eficiente pero no se me ocurría otra.

Gracias por todo lo demás, ya está añadido todo lo nuevo.

PD: ¿Cómo se compila estáticamente en SDL/OpenGL?
« Última modificación: 10 Julio 2013, 00:54 am por SrCooper » En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: 1º Reto de Retrodev
« Respuesta #27 en: 10 Julio 2013, 01:20 am »

Te diré a qué creo que se debe: cada vez que la serpiente se come una fruta se selecciona una nueva posición para esta. Si esta posición coincide con cualquiera de las posiciones de la serpiente entonces se vuelve a llamar a la función random(). Sé que no es la manera más eficiente pero no se me ocurría otra.
Yo también hago ese algoritmo, pero no es normal que pase eso (por probabilidad, eso pasará en el 1% de los casos).

Mirando tú código:

Código
  1. while (hay_choque(comida, cola) ||
  2.                    comida.x == cara.x && comida.y == cara.y ||
  3.                    comida.y < 5)

Este while es muy confuso (hasta el mismo compilador me lo ha dicho). Pon paréntesis para separar los && de los ||
PD: ¿Cómo se compila estáticamente en SDL/OpenGL?
Para compilar estaticamente (static link) los creadores deben hacer hecho una versión estática de la librería.

Dado que SDL no tiene licencia libre, es poco probable que tenga una versión estática. OpenGL no lo he llegado a usar nunca, asi que no puedo decirte.
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
SrCooper

Desconectado Desconectado

Mensajes: 137


Bazinga!


Ver Perfil
Re: 1º Reto de Retrodev
« Respuesta #28 en: 10 Julio 2013, 01:35 am »

Este while es muy confuso (hasta el mismo compilador me lo ha dicho).

A mí también me advertía de algo pero no suelo hacerle caso xD. Aunque ahora que lo dices debería...
Ya he escrito los paréntesis y he probado un poco el programa, y por lo que parece sigue parándose a veces aunque menos a menudo.

Quizás debería hacer una función para estabilizar los FPS a 60. En fin, ya lo probaré en la siguiente versión. Por ahora estoy contento con esta  :laugh:

Un saludo
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: 1º Reto de Retrodev
« Respuesta #29 en: 10 Julio 2013, 01:56 am »

Pues es extraño, lo normal esque ni se note.

Mirando un poco, he visto esto:
Código
  1. void alzar()
  2. {
  3. srand(time(0));

La semilla hay que inicializarla una vez (al principio del juego por ejemplo), no se debe iniciar cada vez o obtendrás el mismo número una y otra vez.
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
Páginas: 1 2 [3] 4 5 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Reto ;)
Ingeniería Inversa
NeoKiller 3 2,921 Último mensaje 15 Agosto 2004, 23:12 pm
por NeoKiller
Reto!!
Ingeniería Inversa
HaCkZaTaN 2 2,970 Último mensaje 10 Septiembre 2004, 09:30 am
por Ðevastador
Reto vB
Ingeniería Inversa
nhouse 2 3,530 Último mensaje 16 Marzo 2005, 09:41 am
por 4rS3NI(
reto en VB6
Ingeniería Inversa
ellolo 1 2,649 Último mensaje 15 Abril 2005, 10:03 am
por UnpaCker!
los reto a un reto muy dificil
Desafíos - Wargames
elshaker 2 4,327 Último mensaje 2 Enero 2013, 00:12 am
por kaiserr
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines