Pong-Pong C++ / Allegro

#include <allegro.h>

#define MAX_X 600
#define MAX_Y 300
#define VMODE GFX_AUTODETECT
#define SOUND_CARD DIGI_AUTODETECT
#define MIDI_CARD MIDI_AUTODETECT

#define BOLA_W 10
#define BOLA_H 10
#define BOLA_COLOR 255,255,255
#define JOGADOR_W 5
#define JOGADOR_H 80
#define JOGADOR_COLOR 255,255,255
#define RISCO_W 2
#define RISCO_H MAX_Y
#define RISCO_COLOR 255,255,255

#define DIS_Y 130
#define DIS_X (MAX_X/2)-30

int BOLA_VELOCIDADE = 1;
int bola_x, bola_y;
int jogador1_x, jogador1_y;
int jogador2_x, jogador2_y;
int jogador1_pontos = 0, jogador2_pontos = 0;
int flagx, flagy, tempo, i1, i2;
int flag1 = 0, flag2 = 0;
int computador1 = 0;
int computador2 = 1;
int comp_posicao1;
int comp_posicao2;
int op=0;
int flagLogo = 0;
int audio = 1;

BITMAP *buffer;
BITMAP *buffer2;
BITMAP *buffer3;
BITMAP *buffer4;
BITMAP *logo;

SAMPLE *bolaA;
SAMPLE *jogadorA;
SAMPLE *perdeuA;

struct sprite {
  int x, y;
  int height, width;
  float dx, dy;
  BITMAP *img;
};

int colisao_jogador(struct sprite object1, struct sprite object2) {
    int left1, left2;
    int right1, right2;
    int top1, top2;
    int bottom1, bottom2;

    left1 = object1.x;
    left2 = object2.x;
    right1 = object1.x + object1.width;
    right2 = object2.x + object2.width;
    top1 = object1.y;
    top2 = object2.y;
    bottom1 = object1.y + object1.height;
    bottom2 = object2.y + object2.height; 

    if (bottom1 < top2) { return(0); }
    if (top1 > bottom2) { return(0); }
    if (right1 < left2) { return(0); }
    if (left1 > right2) { return(0); }

    return(1);
}

void mover_bola() {
     tempo++;
     if (tempo > BOLA_VELOCIDADE){
        if(flagx==0 &amp;&amp; bola_x <= (MAX_X + 150)){
            bola_x++;
        }else{
              flagx=1;
              if(flagx==1){
                  if(bola_x != -150){
                     bola_x--;
                  }else{
                     flagx=0;
                  }
              }
        }

        switch(flagy){
            case 1:
                 if(bola_y <= MAX_Y){
                    bola_y++;
                 }else{
                    flagy = 3;
                    if(audio == 1){
                       play_sample(bolaA, 555, 528, 1000, FALSE);
                    }
                 }
            break;
            case 2:
                 flagy = 3;
            break;
            case 3:
                 if(bola_y != 0){
                    bola_y--;
                 }else{
                    if(audio == 1){
                       play_sample(bolaA, 555, 528, 1000, FALSE);
                    }
                    flagy = 1;
                 }
            break;
        }
        tempo = 0;
     }
}  

void move_computador1() {
     comp_posicao1++;
     if (comp_posicao1 > i1){
        jogador1_y = bola_y-(JOGADOR_H/2)-i1;
        comp_posicao1 = 0;
        flag1 = 0;
        flag2 = 0;
     }
}

void move_computador2() {
     comp_posicao2++;
     if (comp_posicao2 > i2){
        jogador2_y = bola_y-(JOGADOR_H/2)-i2;
        comp_posicao2 = 0;
        flag1 = 0;
        flag2 = 0;
     }
}

void verificaGanhador(){
    if(bola_x <= -150 &amp;&amp; flag1 == 0){
        textout(screen, font, "Jogador 2 Ganhou!", (MAX_X/2)+130, (MAX_Y+10), makecol( 255, 0, 0));
        jogador2_pontos++;
        flag1 = 1;
        flag2 = 0;
        bola_x = (MAX_X - 30);
        bola_y = (MAX_Y/2);
        jogador1_y = (MAX_Y/2)-20;
        jogador2_y = (MAX_Y/2)-20;
        blit (buffer3, screen, 0, 0, (MAX_X/2)+10, (MAX_Y+10), 100, 20);
        BOLA_VELOCIDADE = 1;
        i1 = rand()%40;
        i2 = rand()%40;
        if(audio == 1){
           play_sample(perdeuA, 555, 528, 1000, FALSE);
        }
    } else {
        if(bola_x == (MAX_X+150) &amp;&amp; flag2 == 0){
           textout(screen, font, "Jogador 1 Ganhou!", (MAX_X/2)+130, (MAX_Y+10), makecol( 255, 0, 0));
           jogador1_pontos++;
           flag2 = 1;
           flag1 = 0;
           bola_x = 30;
           bola_y = (MAX_Y/2);
           jogador1_y = (MAX_Y/2)-20;
           jogador2_y = (MAX_Y/2)-20;
           blit (buffer3, screen, 0, 0, 10, (MAX_Y+10), 100, 20);
           BOLA_VELOCIDADE = 1;
           i1 = rand()%10;
           i2 = rand()%10;
           if(audio == 1){
              play_sample(perdeuA, 555, 528, 1000, FALSE);
           }
        }
    }
}

int main() {
  struct sprite jogador1;
  struct sprite jogador2;
  struct sprite risco;
  struct sprite riscoP;
  struct sprite bola;

  allegro_init();
  install_keyboard();
  install_mouse();
  install_sound(SOUND_CARD, MIDI_CARD, NULL);
  set_color_depth (16);
  set_gfx_mode (GFX_AUTODETECT, MAX_X, MAX_Y+30, 0, 0);

  tempo = 0;

  jogador1.x      = JOGADOR_W;
  jogador1.y      = JOGADOR_H;
  jogador1.img    = create_bitmap(JOGADOR_W,JOGADOR_H);
  clear_to_color(jogador1.img, makecol(JOGADOR_COLOR));
  jogador1.height = jogador1.img->h;
  jogador1.width  = jogador1.img->w;

  jogador2.x      = (MAX_X - (JOGADOR_W*2));
  jogador2.y      = JOGADOR_H;
  jogador2.img    = create_bitmap(JOGADOR_W,JOGADOR_H);
  clear_to_color(jogador2.img, makecol(JOGADOR_COLOR));
  jogador2.height = jogador2.img->h;
  jogador2.width  = jogador2.img->w;

  risco.img   = create_bitmap(RISCO_W,RISCO_H);
  clear_to_color(risco.img, makecol(RISCO_COLOR));

  riscoP.img  = create_bitmap(MAX_X,RISCO_W);
  clear_to_color(riscoP.img, makecol(RISCO_COLOR));

  bola.x      = BOLA_W;
  bola.y      = BOLA_H;
  bola.img    = create_bitmap(BOLA_W,BOLA_H);
  clear_to_color(bola.img, makecol(BOLA_COLOR));
  bola.height = bola.img->h;
  bola.width  = bola.img->w;

  buffer  = create_bitmap (MAX_X, MAX_Y+2);
  buffer2 = create_bitmap (MAX_X, MAX_Y+100);
  buffer3 = create_bitmap (MAX_X, MAX_Y+100);
  buffer4 = create_bitmap (MAX_X, MAX_Y+100);

  bolaA    = load_sample("bola.wav");
  jogadorA = load_sample("jogador.wav");
  perdeuA  = load_sample("perdeu.wav");
  logo     = load_bitmap("logo.bmp", NULL);

  while (!key[KEY_ESC]){

        if(key[KEY_1] || key[KEY_1_PAD]){
          op = 1;
          blit (buffer, screen, 0, 0, 0, 0, MAX_X, MAX_Y+2);
          clear (buffer);
          blit (buffer4, screen, 0, 0, MAX_X, MAX_Y+100, 300, 20);
          clear (buffer4);
          textout(screen, font, "                                                                             ", 0, (MAX_Y+10), makecol( 255, 0, 0));
          bola_x = 30;
          bola_y = (MAX_Y/2);
          jogador1_pontos = 0;
          jogador2_pontos = 0;
          jogador1_y = (MAX_Y/2)-20;
          jogador2_y = (MAX_Y/2)-20;
          computador2 = 1;
          computador1 = 0;
        }
        if(key[KEY_0] || key[KEY_0_PAD]){
          op = 0;
          blit (buffer, screen, 0, 0, 0, 0, MAX_X, MAX_Y+2);
          clear (buffer);
          blit (buffer4, screen, 0, 0, MAX_X, MAX_Y+100, 300, 20);
          clear (buffer4);
          clear(buffer2);
          clear(buffer3);
        }

        if(key[KEY_S]){
           if(audio == 1){
             audio = 0;
           }else{
             audio = 1;
           }
        }

        if(key[KEY_P] &amp;&amp; op == 3){
             op = 1;
        }

        if(key[KEY_P] &amp;&amp; op == 1){
            op = 3;
        }

        if(flagLogo == 0){
            draw_sprite(buffer, logo, DIS_X-180, DIS_Y-100);
            flagLogo = 1;
            blit (buffer, screen, 0, 0, 0, 0, MAX_X, MAX_Y+2);
            clear (buffer);
        }

        if(op == 0){
          draw_sprite(buffer, logo, DIS_X-180, DIS_Y-100);
          textout(screen, font, "[", DIS_X-100, DIS_Y, makecol( 255, 255, 255));
          textout(screen, font, "0", DIS_X-85, DIS_Y, makecol( 255, 0, 0));
          textout(screen, font, "] Menu", DIS_X-69, DIS_Y, makecol( 255, 255, 255));
          textout(screen, font, "[", DIS_X-100,(DIS_Y+10), makecol( 255, 255, 255));
          textout(screen, font, "1", DIS_X-85,(DIS_Y+10), makecol( 255, 0, 0));
          textout(screen, font, "] Novo jogo", DIS_X-69,(DIS_Y+10), makecol( 255, 255, 255));
          textout(screen, font, "[", DIS_X-100,(DIS_Y+20), makecol( 255, 255, 255));
          textout(screen, font, "F1", DIS_X-89,(DIS_Y+20), makecol( 255, 0, 0));
          textout(screen, font, "] Liga/Desliga Computador01", DIS_X-69, (DIS_Y+20), makecol( 255, 255, 255));
          textout(screen, font, "[", DIS_X-100,(DIS_Y+30), makecol( 255, 255, 255));
          textout(screen, font, "F2", DIS_X-89,(DIS_Y+30), makecol( 255, 0, 0));
          textout(screen, font, "] Liga/Desliga Computador02", DIS_X-69,(DIS_Y+30), makecol( 255, 255, 255));
          textout(screen, font, "[", DIS_X-100,(DIS_Y+40), makecol( 255, 255, 255));
          textout(screen, font, "S", DIS_X-85,(DIS_Y+40), makecol( 255, 0, 0));
          if(audio == 1){
            textout(screen, font, "] Liga/Desliga Som [ON ]", DIS_X-69,(DIS_Y+40), makecol( 255, 255, 255));
          }else{
            textout(screen, font, "] Liga/Desliga Som [OFF]", DIS_X-69,(DIS_Y+40), makecol( 255, 255, 255));
          }
          textout(screen, font, "[", DIS_X-100,(DIS_Y+50), makecol( 255, 255, 255));
          textout(screen, font, "P", DIS_X-85,(DIS_Y+50), makecol( 255, 0, 0));
          textout(screen, font, "] Pause", DIS_X-69,(DIS_Y+50), makecol( 255, 255, 255));
          textout(screen, font, "[", DIS_X-100,(DIS_Y+60), makecol( 255, 255, 255));
          textout(screen, font, "ESC", DIS_X-93,(DIS_Y+60), makecol( 255, 0, 0));
          textout(screen, font, "] Sair", DIS_X-69,(DIS_Y+60), makecol( 255, 255, 255));
          textout(screen, font, "v0.11                              by Edson Kuzniewski (Br0w) / 2008-09-05", 0, (MAX_Y+10), makecol( 255, 0, 0));
        }

        if(op == 1){
            bola.x = bola_x;
            bola.y = bola_y;

            if(computador1 == 0){
                jogador1_x = jogador1.x;
                jogador1_y = jogador1.y;
            }else{
                jogador1_x = jogador1.x;
                jogador1.y = jogador1_y;
            }

            if(computador2 == 0){
               jogador2_x = jogador2.x;
               jogador2_y = jogador2.y;
            }else{
               jogador2_x = jogador2.x;
               jogador2.y = jogador2_y;
            }

            if(computador1 == 0){
                if (key[KEY_UP]) {
                  if (jogador1.y > 0) {
                    jogador1.y -= 2;
                  }
                }
                if (key[KEY_DOWN]) {
                  if (jogador1.y < MAX_Y-JOGADOR_H) {
                    jogador1.y += 2;
                  }
                }
            }else{
                  move_computador1();
            }

            if(key[KEY_F2]){
              if(computador2 == 0){
                 computador2 = 1;
              }else{
                 computador2 = 0;
              }
            }
            if(key[KEY_F3]){
              jogador2_y++;
            }
            if(key[KEY_F4]){
              jogador2_y--;
            }
            if(key[KEY_F1]){
              if(computador1 == 0){
                 computador1 = 1;
              }else{
                 computador1 = 0;
              }
            }

            if(computador2 == 0){
                if (key[KEY_8_PAD] || mouse_b &amp; 1) {
                  if (jogador2.y > 0) {
                    jogador2.y -= 2;
                  }
                }
                if (key[KEY_2_PAD] || mouse_b &amp; 2) {
                  if (jogador2.y < MAX_Y-JOGADOR_H) {
                    jogador2.y += 2;
                  }
                }
            }else{
                move_computador2();
            }

            if (colisao_jogador(jogador1, bola)) {
              flagx=0;
              flagy=rand()%3;
              flag1 = 0;
              flag2 = 0;
              BOLA_VELOCIDADE = (rand()%5)*-1;
              i1 = rand()%50;
              i2 = rand()%50;
              blit (buffer3, screen, 0, 0, MAX_X-200, 310, 300, 20);
              if(audio == 1){
                 play_sample(jogadorA, 555, 528, 1000, FALSE);
              }
            }else{
              if(colisao_jogador(jogador2, bola)){
                 flagx=1;
                 flagy=rand()%3;
                 flag1 = 0;
                 flag2 = 0;
                 BOLA_VELOCIDADE = (rand()%5)*-1;
                 i1 = rand()%40;
                 i2 = rand()%40;
                 blit (buffer3, screen, 0, 0, MAX_X-200, 310, 300, 20);
                 if(audio == 1){
                    play_sample(jogadorA, 555, 528, 1000, FALSE);
                 }
              }
            }
            mover_bola();
            draw_sprite (buffer, jogador1.img, jogador1.x, jogador1.y);
            draw_sprite (buffer, jogador2.img, jogador2.x, jogador2.y);
            draw_sprite (buffer, bola.img, bola.x, bola.y);
            draw_sprite (buffer, risco.img, (MAX_X/2), 0);
            draw_sprite (buffer, riscoP.img, 0, MAX_Y);
            blit (buffer, screen, 0, 0, 0, 0, MAX_X, MAX_Y+2);
            clear (buffer);
            verificaGanhador();
            textprintf_ex(screen, font, (MAX_X/2)+10, (MAX_Y+10), makecol(255, 100, 200), -1, "Pontos: %d", jogador2_pontos);
            textprintf_ex(screen, font, 10, (MAX_Y+10), makecol(255, 100, 200), -1, "Pontos: %d", jogador1_pontos);
        }
  }
  remove_sound();
  fade_out(4);
  allegro_exit();

 return 0;
}
END_OF_MAIN();


♫ bola
♫ jogador
♫ bola

One thought on “Pong-Pong C++ / Allegro”

Deixe um comentário

O seu endereço de e-mail não será publicado.