Advertisement
ferseg

pacman allegro

Dec 3rd, 2014
10,986
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.47 KB | None | 0 0
  1. /*
  2.     Autores: Saldaña Ramos, Edinson
  3.              Fernandez Segura, Joel
  4.     Tema: Implementacion de un Juego usando Estructuras de Datos
  5.     Curso: Estructura de Datos
  6.     Blog: http://codebotic.blogspot.com
  7.     Fuente: Devidcoptero Chann canal de Youtube
  8.  
  9. */
  10. #include <allegro.h>
  11. #include<allegro/alcompat.h>
  12. #include <cstdlib>
  13. #include<iostream>
  14. #include<sstream>
  15.  
  16. #define MAXFILAS 20 // eje y
  17. #define MAXCOLS 33  //eje x
  18.  
  19. using std::cout;
  20. using std::endl;
  21.  
  22. struct nodo {
  23.     char item;
  24.     struct nodo *sgte;
  25. };
  26.  
  27. typedef nodo *Puntero;
  28.  
  29. Puntero p=NULL;//puntero de pila
  30.  
  31. int puntaje=0;
  32. int bonusRojo=0;
  33. int bonusAzul=0;
  34. int anteriorpx, anteriorpy;
  35. int px=30*14, py=30*17;
  36. int dir=4;//indica la direccion
  37. int vidas=3;
  38. int s=0; //contador para la pila
  39. int d=570;
  40. char w;
  41. /*   Declaracion de BITMAP */
  42. BITMAP *buffer;
  43. BITMAP *roca;
  44. BITMAP *pacbmp;
  45. BITMAP *pacman;
  46. BITMAP *comida;
  47. BITMAP *muertebmp;
  48. BITMAP *diamante1;
  49. BITMAP *diamante2;
  50. BITMAP *fondo1;
  51. BITMAP *fondo2;
  52. BITMAP *fondo3;
  53. BITMAP *cursor;
  54. BITMAP *win;
  55. BITMAP *loser;
  56. /* ---- declaracion del audio ----*/
  57. MIDI *musica1;
  58.  
  59.  
  60. /*----Funcion Apilar valor----*/
  61. void push( char valor )
  62. {
  63.      Puntero aux;
  64.      aux = new(struct nodo);
  65.      aux->item = valor;
  66.      cout<<endl<<aux->item;
  67.      aux->sgte = p ;
  68.      p = aux ;
  69. }
  70. /*---Funcion que es llamada cuando pacan pierde una vida  ----*/
  71. int pop(  )
  72. {   char it;
  73.  
  74.      Puntero aux;
  75.      if(p!=NULL){
  76.      aux = p ;
  77.      it = aux->item;
  78.      cout<<endl<<"desapilado:"<<it<<endl;
  79.      p = aux->sgte ;
  80.      delete(aux);
  81.      } else cout<<endl<<"no hay elementos en la pila"<<endl;
  82.  
  83.  
  84. }
  85.  
  86. /*Funcion que muestra el elemento apilado en pantalla*/
  87. void mostrar_pila(  )
  88. {   int t=0;
  89.      Puntero aux;
  90.      aux = p;     // apunta al inicio de la lista
  91.  
  92.      while( aux !=NULL )
  93.      {      if(aux->item=='L')//diamante azul
  94.             draw_sprite(buffer,diamante1,30*30,d-t*30);//resta el tamaño de pantalla-30 para posicionar un diamante
  95.  
  96.             if(aux->item=='M')//diamante Rojo
  97.             draw_sprite(buffer,diamante2,30*30,d-t*30);
  98.  
  99.             aux = aux->sgte;
  100.             t++;
  101.      }
  102. }
  103.  
  104. /*---- Funcion que desapila y destruye la pila -----*/
  105. void destruir_pila( )
  106. {
  107.      Puntero aux;
  108.  
  109.      while( p != NULL)
  110.      {
  111.            aux = p;
  112.            p = aux->sgte;
  113.            if(aux->item=='L')
  114.                 bonusAzul=bonusAzul+100;
  115.            if(aux->item=='M')
  116.                 bonusRojo=bonusRojo+200;
  117.            delete(aux);
  118.  
  119.      }
  120. }
  121.  
  122. /*----- Declaracion del Arreglo del mapa -----*/
  123. char mapa[MAXFILAS][MAXCOLS]={
  124.      "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX  ",
  125.      "XOOOO|OOOOO XXXXX OOOOO|OOOMX  ",
  126.      "XOXXX XXXXXLXXXXXOXXXXXOXXXOX  ",
  127.      "XOXXX XXXXX XXXXXOXXXXXOXXXOX  ",
  128.      "XOOLOOOOOO |OOOOOO|OOOOMOOOOX  ",
  129.      "XOXXX XX|XXXXXXXXXX |XX XXXOX  ",
  130.      "XOOOO|XXOOOOOXXX O OOXX|OOOOX  ",
  131.      "XOXXX XXXXXXLXXX XXXXXX XXXOX  ",
  132.      "XLXXX XX OOM OOOO O  XX XXX X  ",
  133.      "OOOOOOXX|XXXXXXXXXXX|XXOOOOOO  ",
  134.      "X XXX XX XXXXXXXXXXXOXX XXX X  ",
  135.      "XOXXX|XXOOOOOOMOOOOOOXX XXX X  ",
  136.      "XOXXX XXXXXX XXX XXXXXX XXX X  ",
  137.      "XOOOO XXOOOOOXXXOOOOOXX OOOOX  ",
  138.      "XMXXXOXXOXXXXXXXXXXX XX XXX X  ",
  139.      "XOXXX  O O |OOOOOO|OOOOOXXXLX  ",
  140.      "XOXXX XXXX0XXXXXXXXOXXXLXXXOX  ",
  141.      "XOXXXOXXXX  O OO O OXXX XXXOX  ",
  142.      "XOOLOO O O XXXXXXXX OOOOOO OX  ",
  143.      "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX  ",
  144. };
  145. /*-------------Funcion para Dibujar bloques, monedas, diamantes  ---------*/
  146. void dibujar_mapa()
  147. {
  148.     int row, col;
  149.     for (row = 0 ; row<MAXFILAS ; row++)
  150.     {
  151.         for (col = 0 ; col<MAXCOLS ; col++)
  152.         {
  153.             if(mapa[row][col] == 'X')
  154.             {
  155.                 draw_sprite(buffer, roca, col*30, row*30);
  156.             }
  157.             else if(mapa[row][col] == 'O')
  158.             {
  159.                 draw_sprite(buffer, comida, col*30, row*30);
  160.                 if(py/30 == row && px/30 == col)/*Si pacman come una moneda, desaparcerla*/
  161.                   {
  162.                       mapa[row][col] = ' ';
  163.                       puntaje=puntaje+10;
  164.  
  165.                   }
  166.             }
  167.             else if(mapa[row][col]=='L')/*  pacman come un diamante azul*/
  168.             {
  169.                 draw_sprite(buffer,diamante1,col*30,row*30);
  170.                 if(py/30 == row && px/30 == col)
  171.                   {
  172.                       mapa[row][col] = ' ';
  173.                       push('L');
  174.  
  175.                     }
  176.             }
  177.  
  178.             if(mapa[row][col]=='M')/*  pacman come un diamante rojo*/
  179.             {
  180.                 draw_sprite(buffer,diamante2,col*30,row*30);
  181.                 if(py/30 == row && px/30 == col)
  182.                   {
  183.                       mapa[row][col] = ' ';
  184.                       push('M');
  185.  
  186.                     }
  187.             }
  188.             char c1[10];
  189.             textout_ex(buffer, font, "Vidas:", 885, 30,  0xfff000, -1);
  190.             textout_ex(buffer, font, itoa(vidas,c1,10), 895, 60,  0xfff000, -1);//muestra las vidas en pantalla
  191.             mostrar_pila();//dibujar diamantes apilados en pantalla
  192.         }
  193.     }
  194. }
  195. /*----- Funcion que dibuja todo lo de buffer en pantalla principal -------*/
  196. void pantalla()
  197. {
  198.     blit(buffer, screen, 0, 0, 0, 0,940, 600);
  199. }
  200.  
  201. /*------- Muestra en pantalla a pacman -------*/
  202. void dibujar_pacman()
  203. {
  204.     blit(pacbmp,pacman,dir*33,0,0,0,33,33);// imprimir imagen de pacman
  205.     draw_sprite(buffer, pacman, px,py);
  206. }
  207. /*----------Funcion que determina si las monedas se acabaron------*/
  208. bool win_juego(){
  209.     int row, col;
  210.  
  211.     for (row = 0 ; row<MAXFILAS ; row++){
  212.         for (col = 0 ; col<MAXCOLS ; col++){
  213.             if(mapa[row][col] == 'O')  return true;
  214.         }
  215.     }
  216.     return false;
  217. }
  218.  
  219. /*------- Funcion que activa el fin del juego si es que las vidas llegan a cero ------*/
  220. bool lose_juego(){
  221.     if(vidas==0) return true;
  222.     return false;
  223. }
  224.  
  225. /*---------------------Implementacion de la clase fantasma-----------*/
  226. class fantasma
  227. {
  228.     BITMAP *enemigobmp;
  229.     BITMAP *enemigo;
  230.  
  231.     int fdir ;
  232.     int _x, _y;
  233.  
  234. public:
  235.        fantasma(int x, int y); //construcctor de parametros
  236.        void dibujar_fantasma() const;
  237.        void mover_fantasma();
  238.        void choque_pacman();
  239. };
  240. /*---------- Constructor de la clase ------------*/
  241. fantasma::fantasma(int x, int y)
  242. {
  243.     _x = x;
  244.     _y = y;
  245.     fdir = rand()%4;
  246.     enemigobmp = load_bitmap("images/enemigo.bmp",NULL);
  247.     enemigo = create_bitmap(30,30);
  248. }
  249.  
  250.  
  251. void fantasma::dibujar_fantasma()const
  252. {
  253.      blit(enemigobmp,enemigo ,0,0,0,0,30,30);
  254.      draw_sprite(buffer, enemigo, _x,_y);
  255. }
  256.  
  257. /*---------- Funcion que determina si hay colision entre pacman y un fantasma ------------*/
  258. void fantasma::choque_pacman()
  259. {
  260.     if(py== _y && px == _x || _y ==anteriorpy && _x==anteriorpx)
  261.     {
  262.  
  263.         for(int j=0;j<=5;j++)
  264.         {
  265.             clear(pacman);
  266.             clear(buffer);
  267.             dibujar_mapa();
  268.  
  269.             blit(muertebmp, pacman,j*33,0,0,0,33,33);
  270.             draw_sprite(buffer,pacman,px,py);
  271.  
  272.             pantalla();
  273.             rest(80);
  274.  
  275.         }
  276.         vidas--;
  277.         cout<<endl<<"vidas"<<vidas<<endl;
  278.         pop();//desapilar TOS
  279.         px =30*14;
  280.         py =30*17;
  281.         dir =4;
  282.     }
  283. }
  284.  
  285. /*-------------- Funcion para mover un fantasma --------------*/
  286. void fantasma::mover_fantasma()
  287. {
  288.     dibujar_fantasma();
  289.     choque_pacman();
  290.     if(mapa[_y/30][_x/30] == '|'){
  291.         fdir = rand()%4;
  292.         }
  293.     if(fdir == 0)
  294.     {
  295.        if(mapa[_y/30][(_x-30)/30]!= 'X') _x-=30;
  296.             else fdir = rand()%4;
  297.     }
  298.     if(fdir == 1)
  299.     {
  300.        if(mapa[_y/30][(_x+30)/30]!= 'X') _x+=30;
  301.             else fdir = rand()%4;
  302.     }
  303.     if(fdir == 2)
  304.     {
  305.        if(mapa[(_y-30)/30][(_x)/30]!= 'X') _y-=30;
  306.             else fdir = rand()%4;
  307.     }
  308.     if(fdir == 3)
  309.     {
  310.        if(mapa[(_y+30)/30][(_x)/30]!= 'X') _y+=30;
  311.             else fdir = rand()%4;
  312.     if(_x <= -30) _x=870;
  313.             else if(_x >= 870) _x = -30;
  314. }
  315. }
  316.  
  317.  
  318. /*--------------------------Funcion Principal --------------------------*/
  319. int main()
  320. {
  321.     bool fin_menu;
  322.     bool lose;
  323.     bool salir;
  324.     char c1[10],c2[10];
  325.  
  326.     allegro_init();
  327.     install_keyboard();
  328.     install_mouse();
  329.  
  330.     set_color_depth(32);
  331.     set_gfx_mode(GFX_AUTODETECT_WINDOWED, 940, 600, 0, 0);
  332.  
  333.     if (install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, NULL) != 0)
  334.         {   allegro_message("Error: inicializando sistema de sonido\n%s\n", allegro_error);
  335.             return 1;
  336.         }
  337.     set_volume(70, 70); //Control del volumen
  338.  
  339.  
  340.     /*----- Cargamos todos las imagenes a su respectivo BITMAP---*/
  341.     fondo1 = load_bitmap("menu/FONDO1.bmp", NULL);
  342.     fondo2 = load_bitmap("menu/FONDO2.bmp", NULL);
  343.     fondo3 = load_bitmap("menu/FONDO3.bmp", NULL);
  344.     cursor = load_bitmap("menu/cursor.bmp", NULL);
  345.  
  346.     roca = load_bitmap ("images/roca.bmp", NULL);
  347.     pacbmp = load_bitmap("images/pacman.bmp", NULL);
  348.     comida = load_bitmap("images/Comida.bmp", NULL);
  349.     muertebmp= load_bitmap ("images/muerte.bmp", NULL);
  350.     diamante1=load_bitmap("images/diamante1.bmp",NULL);
  351.     diamante2=load_bitmap("images/diamante2.bmp",NULL);
  352.  
  353.     win=load_bitmap("images/WIN.bmp",NULL);
  354.     loser=load_bitmap("images/LOSE.bmp",NULL);
  355.  
  356.     musica1=load_midi("sounds/mario.mid");
  357.  
  358.  
  359.  
  360.     /* ------- Implementacion del Menu -----*/
  361.     buffer =create_bitmap(800,530);
  362.     fin_menu=false;
  363.  
  364.      while(!fin_menu){
  365.         if(mouse_x>211&&mouse_x<553&&mouse_y>319&&mouse_y<374)
  366.         {
  367.             blit(fondo2,buffer,0,0,60,0,800,530);
  368.             if(mouse_b&1){
  369.                 fin_menu=true;
  370.             }
  371.         } else if(mouse_x>311&&mouse_x<404&&mouse_y>418&&mouse_y<465){
  372.                   blit(fondo3,buffer,0,0,60,0,800,530);
  373.                   if(mouse_b&1){
  374.                     fin_menu=true;
  375.                     return 0;
  376.                   }
  377.  
  378.     }else blit(fondo1,buffer,0,0,60,0,800,530);
  379.  
  380.     masked_blit(cursor,buffer,0,0,mouse_x,mouse_y,13,22);
  381.     blit(buffer,screen,0,0,60,0,880,600);
  382.  
  383.     }
  384.     /* ------- Fin de Implementacion del Menu -----*/
  385.  
  386.     clear(buffer);/*  Liberamos los registros cargados*/
  387.     clear(cursor);
  388.     clear(fondo1);
  389.     clear(fondo2);
  390.     clear(fondo3);
  391.  
  392.  
  393.  
  394.  
  395.  
  396.     /*-- creamos los enemigos en distintas posiciones ---*/
  397.     fantasma A(30*2,30*3);
  398.     fantasma B(30*15,30*15);
  399.     fantasma C(30*3,30*3);
  400.     fantasma D(30*18,30*18);
  401.     fantasma E(30*9,30*9);
  402.  
  403.     /*  Implementamos la pantalla del juego  */
  404.     buffer =create_bitmap(940,600);
  405.     pacman = create_bitmap(33,33);
  406.     play_midi(musica1,1);//iniciamos musica de fondo
  407.     while(win_juego()==true&&lose_juego()==false )
  408.     {
  409.         if(key[KEY_ESC]) return 0;
  410.  
  411.         /*---- Funcion para manejar el teclado ----*/
  412.         anteriorpx = px;
  413.         anteriorpy = py;
  414.         if(key[KEY_RIGHT]) dir=1;
  415.         else if(key[KEY_LEFT]) dir=0;
  416.         else if(key[KEY_UP]) dir=2;
  417.         else if(key[KEY_DOWN]) dir=3;
  418.  
  419.         if(dir == 0)
  420.         {
  421.             if(mapa[py/30][(px-30)/30]!='X')
  422.                 px -= 30;
  423.             else dir = 4;
  424.         }
  425.         if(dir == 1)
  426.         {
  427.             if(mapa[py/30][(px+30)/30]!='X')
  428.                px += 30;
  429.             else dir = 4;
  430.         }
  431.         if(dir == 2)
  432.         {
  433.             if(mapa[(py-30)/30][(px)/30]!='X')
  434.                py -= 30;
  435.             else dir = 4;
  436.         }
  437.         if(dir == 3)
  438.         {
  439.             if(mapa[(py+30)/30][(px)/30]!='X')
  440.                py += 30;
  441.             else dir = 4;
  442.         }
  443.         if(px <= -30) px = 870;
  444.          else if (px>=870) px = -30;
  445.  
  446.         /*---- Fin de Funcion para manejar el teclado ----*/
  447.  
  448.         clear(buffer);//limpiamos pantalla
  449.  
  450.         dibujar_mapa();
  451.         dibujar_pacman();
  452.         A.mover_fantasma();
  453.         B.mover_fantasma();
  454.         C.mover_fantasma();
  455.         D.mover_fantasma();
  456.         E.mover_fantasma();
  457.         pantalla();
  458.         rest(70);
  459.  
  460.         clear (pacman);
  461.         blit(pacbmp,pacman,4*33,0,0,0,33,33);// imprimir imagen de pacman
  462.         draw_sprite(buffer, pacman, px,py);
  463.         pantalla();
  464.         rest(90);
  465.  
  466.     }       /*---- Fin de la implentacion del juego ----*/
  467.  
  468.     /*-------- Limpiamos todos los buffers ------*/
  469.     clear(buffer);
  470.     clear(pacman);
  471.     clear(roca);
  472.     clear(pacbmp);
  473.     clear(comida);
  474.     clear(muertebmp);
  475.     clear(diamante1);
  476.     clear(diamante2);
  477.     clear(screen);
  478.  
  479.  
  480.     destruir_pila();// calculamos el bonus obtenido
  481.  
  482.     salir=false;
  483.     int Total=puntaje+bonusAzul+bonusRojo;
  484.     while(!salir){
  485.     /*-----  Mostramos pantalla cuando perdemos  ------*/
  486.     if(lose_juego()==true){
  487.  
  488.         blit(loser,buffer,0,0,60,0,880,600);
  489.         textout(buffer,font,"Tu Puntaje es:",220,350,pallete_color[14]);
  490.         textout_ex(buffer, font, itoa(puntaje,c1,10), 240, 380,  0xfff000, -1);
  491.         textout(buffer,font,"Bonus Rojo(200) :      Bonus  Azul(100):",220,410,pallete_color[14]);
  492.         textout_ex(buffer, font, itoa(bonusRojo,c2,10), 300, 430,  0xfff000, -1);
  493.         textout_ex(buffer, font, itoa(bonusAzul,c2,10), 450, 430,  0xfff000, -1);
  494.         textout(buffer,font,"Total de Puntos :",220,460,pallete_color[14]);
  495.         textout_ex(buffer, font, itoa(Total,c2,10), 400, 460,  0xfff000, -1);
  496.         textout(buffer,font,"Presione ESC o ENTER para salir",220,490,pallete_color[14]);
  497.         blit(buffer,screen,0,0,0,0,880,600);
  498.         midi_pause();
  499.         if(key[KEY_ESC]||key[KEY_ENTER]){
  500.             salir=true;
  501.         }
  502.     }
  503.     /*----- Mostramos pantalla cuando ganamos ------*/
  504.     if(win_juego()==false){
  505.         blit(win,buffer,0,0,60,0,880,600);
  506.         textout(buffer,font,"Tu Puntaje es:",220,350,pallete_color[14]);
  507.         textout_ex(buffer, font, itoa(puntaje,c1,10), 240, 380,  0xfff000, -1);
  508.         textout(buffer,font,"Bonus Rojo(200) :      Bonus  Azul(100):",220,410,pallete_color[14]);
  509.         textout_ex(buffer, font, itoa(bonusRojo,c2,10), 300, 430,  0xfff000, -1);
  510.         textout_ex(buffer, font, itoa(bonusAzul,c2,10), 450, 430,  0xfff000, -1);
  511.         textout(buffer,font,"Total de Puntos :",220,460,pallete_color[14]);
  512.         textout_ex(buffer, font, itoa(Total,c2,10), 400, 460,  0xfff000, -1);
  513.         textout(buffer,font,"Presione ESC o ENTER para salir",220,490,pallete_color[14]);
  514.         blit(buffer,screen,0,0,0,0,880,600);
  515.         midi_pause();
  516.         if(key[KEY_ESC]||key[KEY_ENTER]){
  517.             salir=true;
  518.         }
  519.     }
  520.     }
  521.  
  522.     /*--- Destruimos todos los BITMAP usados en el juego para liberar memoria de tarjeta grafica----*/
  523.     destroy_midi(musica1);
  524.     destroy_bitmap(buffer);
  525.     destroy_bitmap(win);
  526.     destroy_bitmap(loser);
  527.     destroy_bitmap(pacbmp);
  528.     destroy_bitmap(pacman);
  529.     destroy_bitmap(comida);
  530.     destroy_bitmap(roca);
  531.     destroy_bitmap(muertebmp);
  532.     destroy_bitmap(diamante1);
  533.     destroy_bitmap(diamante2);
  534.  
  535.  
  536. }
  537. END_OF_MAIN();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement