Kółko i krzyżyk allegro

0

Witam
Pisze prostą gre kółko i krzyżyk i mam problem otóż w grze może wygrać tylko krzyżyk a gdy kółko ustawi znaki w rzędzie nic się nie dzieje
kod:

#include <allegro.h>
#include <iostream>
#include<cstdlib>
#include<time.h>
// Inicjowanie timera
volatile long speed = 0;
void increment_speed()
{
   speed++;
}
END_OF_FUNCTION(increment_speed);
LOCK_VARIABLE(speed);
LOCK_FUNCTION(increment_speed);

// Zmienne potrzebne do mapy
int mapa_x = 0, mapa_y = 0;
BITMAP *teren = NULL;
BITMAP *bufor = NULL;
// DEFINICJA MAPY
int map[5][5] =
 {
    0,0,0,0,0,
    0,1,1,1,0,
    0,1,1,1,0,
    0,1,1,1,0,
    0,0,0,0,0,
  };
// Funkcja wyswietlajaca mape:
void  wys_mape()
{
      int licznik_x, licznik_y;
      for (licznik_x = 0; licznik_x < 5 ; licznik_x++)
      {
      for (licznik_y = 0; licznik_y < 5 ; licznik_y++)
      {
           masked_blit(teren,bufor,
           (map[licznik_y + mapa_y][licznik_x + mapa_x]%4) * 40,
           (map[licznik_y + mapa_y][licznik_x + mapa_x]/4) * 40,
           licznik_x * 40,licznik_y * 40,40,40);
      }
      }
};


//klasa odpowiedzialna za gracza
class gracz
{
    public:
    int znak;
    //funkcja sprawdzająca czy gracz wygrał
    bool wygrana()
    {
        if(
            (pola[0][0]&&pola[1][0]&&pola[2][0])||
            (pola[0][1]&&pola[1][1]&&pola[2][1])||
            (pola[0][2]&&pola[1][2]&&pola[2][2])||
            (pola[0][0]&&pola[0][1]&&pola[0][2])||
            (pola[1][0]&&pola[1][1]&&pola[1][2])||
            (pola[2][0]&&pola[2][1]&&pola[2][2])||
            (pola[0][0]&&pola[1][1]&&pola[2][2])||
            (pola[2][0]&&pola[1][1]&&pola[0][2])
                                                   )
        {
            return true;
        }
    };
    std::string znaki;
    //tablica z miejscami znaków
    bool pola[3][3];
    //funkcja stawiająca znak
    bool znakowanie()
    {

        if (mouse_x>40&&mouse_y>40&&mouse_x<150&&mouse_y<150&&mouse_b==1)
        {
            pola[(mouse_x/40)-1][(mouse_y/40)-1]=true;
            map[mouse_y/40][mouse_x/40]=znak;
        }
            return true;
        }
};
int main()
  {
     gracz kulko;
     gracz krzyzyk;
     allegro_init();
     install_mouse();
     install_keyboard();
     set_color_depth(16);
     set_gfx_mode(GFX_AUTODETECT_WINDOWED,200,200,0,0);
     install_timer();
     install_int_ex(increment_speed, BPS_TO_TIMER(10));

     // Tworzenie bufora
     BITMAP*bufor1=NULL;
     BITMAP*menu=NULL;
     bufor =create_bitmap(250,250);

     // ³adowanie grafiki
     teren = load_bmp("grafika/teren.bmp",default_palette);
     // Czyszczenie bufora
     clear_to_color(bufor, makecol(150,150,150));
     //ukazanie myszki
     show_mouse(screen);
     unscare_mouse();
     for (int i=0;i<3;i++)
     {
         for (int j=0;j<3;j++)
         {
           kulko.pola[i][j]=false;
           krzyzyk.pola[i][j]=false;
         }
     }
     kulko.znak=2;
     krzyzyk.znak=3;
     kulko.znaki="kulko";
     krzyzyk.znaki="krzyzyk";

     //wyswietlanie grafiki
    bool kliknieto = false;
    int nrKlikniecia=0;

     while ((!krzyzyk.wygrana())||(!kulko.wygrana()))
     {
         if( !kliknieto && mouse_b== 1 )
         {
            kliknieto = true;
            nrKlikniecia++;
         }

        if( mouse_b == 0 )
        {
            kliknieto = false;
        }
        if( nrKlikniecia % 2 == 0 )
        {
            krzyzyk.znakowanie();
        }
         else
        {
           kulko.znakowanie();
        }
        wys_mape();
        blit(bufor,screen,0,0,0,0,250,250);
     }
     remove_int( increment_speed);
     rest(100);
     //destruktory wskazników
     destroy_bitmap(teren);
     destroy_bitmap(bufor);
     allegro_exit();
     return 0;
}
END_OF_MAIN();

 
0

Najpierw popraw kilka rzeczy:

  1. Wywal bool pola[3][3]; z klas gracza, po co ci mapa bitowa dla kazdego z nich?
  2. int map[5][5] zmień na jakąś klasę(w ogóle po co ci 5x5??), która będzie miała metody:
    a) public wyczysc() <- wprowadzającą zera do map[5][5]
    b) public ustaw(gracz g, x, y) <- która wstawi do map[x][y] = gracz.znak
    c) public bool sprawdz_wygrana(gracz g) <- tutaj zmieniasz te sprawdzenia if (pola[0][0]&&pola[1][0]&&pola[2][0]...) na pola[0][0] == gracz.znak && pola[1][0] == gracz.znak && pola[2][0] == gracz.znak ...)

i w głównej pętli mała modyfikacja :

if( nrKlikniecia % 2 == 0 ) {
    mapa.ustaw(krzyzyk,  x, y);
    if (mapa.sprawdz_wygrana(krzyzyk)) {
       break;
    }    
}
else {
    mapa.ustaw(kulko,  x, y);
    if (mapa.sprawdz_wygrana(kulko)) {
       break;
    }
}
  1. Do ustawienia pól graczy użyj konstruktora, a pola rób prywatnymi.

i popraw "kulko" na "kolko" ... lepiej wygląda ...

Jak po lekkim uporządkowaniu nadal nie będzie działać to wtedy sie pomyśli

1 użytkowników online, w tym zalogowanych: 0, gości: 1