Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Allegro] Problem Saper

Ostatnio zmodyfikowano 2012-01-23 22:32
Autor Wiadomość
dawid9406
Temat założony przez niniejszego użytkownika
[Allegro] Problem Saper
» 2012-01-08 22:36:08
Witam mam problem z gra saper .
Otóż mam funkcje sprawdzającą czy w pobliżu jest bomba ale nie zawsze działa, tak jak na screenie.
Oto kod funkcji


C/C++
void sprawdz_liczbe()
{
    if( mouse_b == 1 )
    {
        liczba = 0;
        if(( bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) ] == true & bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) ] == false ) ) liczba++;
       
        if(( bomb[( mouse_x / 40 ) - 1 ][( mouse_y / 40 ) ] == true & bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) ] == false ) ) liczba++;
       
        if(( bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) + 1 ] == true & bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) ] == false ) ) liczba++;
       
        if(( bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) - 1 ] == true & bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) ] == false ) ) liczba++;
       
        if(( bomb[( mouse_x / 40 ) + 1 ][( mouse_y / 40 ) + 1 ] == true & bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) ] == false ) ) liczba++;
       
        if(( bomb[( mouse_x / 40 ) - 1 ][( mouse_y / 40 ) + 1 ] == true & bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) ] == false ) ) liczba++;
       
        if(( bomb[( mouse_x / 40 ) + 1 ][( mouse_y / 40 ) - 1 ] == true & bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) ] == false ) ) liczba++;
       
        if(( bomb[( mouse_x / 40 ) - 1 ][( mouse_y / 40 ) - 1 ] == true & bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) ] == false ) ) liczba++;
       
    }
}
link do zdjecia: http://patrz.pl/zdjecia/saper-d
Czy jest ona dobra?
P-47686
pekfos
» 2012-01-08 22:43:49
if(( bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) ] == true & bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) ] == false ) ) liczba++;
wtf?
P-47689
dawid9406
Temat założony przez niniejszego użytkownika
saper
» 2012-01-08 22:54:02
bomb[][]-tablica w której przechowuje współrzędne bomb;
mouse_\40-współrzędne myszki\40 bo kafelki w mapie mam po 40px;
liczba-ile bomb jest w pobliżu;
P-47691
ison
» 2012-01-08 23:23:12
chodziło raczej o
&
P-47695
pekfos
» 2012-01-09 19:42:48
chodziło także o to, że ten zapis jest równoznaczny z
C/C++
bool sth;
//..
if( sth == true && sth == false ) impossible++;
w skrócie:
C/C++
if( false ) /**/;


zamień & na &&. AND bitowe != AND logiczne!
P-47753
dawid9406
Temat założony przez niniejszego użytkownika
» 2012-01-09 20:21:04
C/C++
#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
short int map[ 11 ][ 11 ] =
{
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};
// Funkcja wyœwietlaj¹ca mapê:
void wys_mape()
{
    int licznik_x, licznik_y;
    for( licznik_x = 0; licznik_x < 11; licznik_x++ )
    {
        for( licznik_y = 0; licznik_y < 11; 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 );
        }
    }
};

//tablica bomb
bool bomb[ 11 ][ 11 ];
int liczba = 0;

//sprawdzanie czy w pobliżu jest bomba
void sprawdz_liczbe()
{
    if( mouse_b == 1 )
    {
        liczba = 0;
        if(( bomb[( mouse_x / 40 ) + 1 ][( mouse_y / 40 ) ] == true && bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) ] == false ) ) liczba++;
       
        if(( bomb[( mouse_x / 40 ) - 1 ][( mouse_y / 40 ) ] == true && bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) ] == false ) ) liczba++;
       
        if(( bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) + 1 ] == true && bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) ] == false ) ) liczba++;
       
        if(( bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) - 1 ] == true && bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) ] == false ) ) liczba++;
       
        if(( bomb[( mouse_x / 40 ) + 1 ][( mouse_y / 40 ) + 1 ] == true && bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) ] == false ) ) liczba++;
       
        if(( bomb[( mouse_x / 40 ) - 1 ][( mouse_y / 40 ) + 1 ] == true && bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) ] == false ) ) liczba++;
       
        if(( bomb[( mouse_x / 40 ) + 1 ][( mouse_y / 40 ) - 1 ] == true && bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) ] == false ) ) liczba++;
       
        if(( bomb[( mouse_x / 40 ) - 1 ][( mouse_y / 40 ) - 1 ] == true && bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) ] == false ) ) liczba++;
       
        std::cout << liczba;
    }
}
void wypisz_liczbe()
{
    if( mouse_b == 1 & bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) ] == false && mouse_x / 40 > 0 && mouse_x / 40 < 10 && mouse_y / 40 > 0 && mouse_y / 40 < 10 )
    {
        switch( liczba )
        {
        case 1:
            {
                map[( mouse_y / 40 ) ][( mouse_x / 40 ) ] = 4;
                break;
            }
        case 2:
            {
                map[( mouse_y / 40 ) ][( mouse_x / 40 ) ] = 2;
                break;
            }
        }
    }
   
}
// Funkcja G³ówna
int main()
{
    allegro_init();
    install_mouse();
    install_keyboard();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 440, 440, 0, 0 );
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 10 ) );
    // Tworzenie bufora
    BITMAP * bufor1 = NULL;
    BITMAP * bombka = NULL;
    bufor = create_bitmap( 440, 440 );
    bombka = load_bitmap( "grafika/bomba.bmp", default_palette );
   
    int i, j;
    for( i = 0; i < 11; i++ )
    {
        for( j = 0; j < 11; j++ )
        {
            bomb[ i ][ j ] = false;
        }
    }
   
    //losowanie bomb;
    int x, y;
    srand(( unsigned ) time( NULL ) );
    for( i = 0; i < 10; i++ )
    {
        x = rand() % 9 + 1;
        y = rand() % 9 + 1;
        bomb[ x ][ y ] = true;
    }
    // ł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();
    //zapisywanie bomb w tablicy
    int miejsce_x[ 10 ] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
    int miejsce_y[ 10 ] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
    int q = 0, w = 0;
    for( i = 0; i < 10; i++ )
    {
        for( j = 0; j < 10; j++ )
        {
           
            if( bomb[ i ][ j ] == true )
            {
                miejsce_y[ q ] = i;
                q++;
                miejsce_x[ w ] = j;
                w++;
            }
           
        }
    }
    for( i = 0; i < 10; i++ ) std::cout << miejsce_x[ i ] << "," << miejsce_y[ i ] << "  ";
    //wyswietlanie grafiki
    while( !key[ KEY_ESC ] )
    {
        wys_mape();
       
        //sprawdzanie czy trafiłeś bombe
        for( i = 0; i < 10; i++ )
        {
            if( mouse_x > miejsce_x[ i ] * 40 && mouse_x <( miejsce_x[ i ] + 1 ) * 40 && mouse_y > miejsce_y[ i ] * 40 && mouse_y <( miejsce_y[ i ] + 1 ) * 40 && mouse_b == 1 )
            {
                map[( mouse_y / 40 ) ][( mouse_x / 40 ) ] = 3;
            }
        }
        blit( bufor, screen, 0, 0, 0, 0, 440, 440 );
        sprawdz_liczbe();
        wypisz_liczbe();
    }
    remove_int( increment_speed );
    destroy_bitmap( teren );
    destroy_bitmap( bufor );
    allegro_exit();
    return 0;
}
END_OF_MAIN();
P-47765
dawid9406
Temat założony przez niniejszego użytkownika
» 2012-01-10 20:18:54
Pozmieniałem współrzędne mouse_x na mouse_y i odwrotnie.Juz prawie wszystko działa tylko niekiedy wartości zmiennej liczba są złe.
C/C++
void sprawdz_liczbe()
{
    if( mouse_b == 1 )
    {
        liczba = 0;
        if(( bomb[( mouse_y / 40 ) + 1 ][( mouse_x / 40 ) ] == true && bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) ] == false ) ) liczba++;
       
        if(( bomb[( mouse_y / 40 ) - 1 ][( mouse_x / 40 ) ] == true && bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) ] == false ) ) liczba++;
       
        if(( bomb[( mouse_y / 40 ) ][( mouse_x / 40 ) + 1 ] == true && bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) ] == false ) ) liczba++;
       
        if(( bomb[( mouse_y / 40 ) ][( mouse_x / 40 ) - 1 ] == true && bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) ] == false ) ) liczba++;
       
        if(( bomb[( mouse_y / 40 ) + 1 ][( mouse_x / 40 ) + 1 ] == true && bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) ] == false ) ) liczba++;
       
        if(( bomb[( mouse_y / 40 ) - 1 ][( mouse_x / 40 ) + 1 ] == true && bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) ] == false ) ) liczba++;
       
        if(( bomb[( mouse_y / 40 ) + 1 ][( mouse_x / 40 ) - 1 ] == true && bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) ] == false ) ) liczba++;
       
        if(( bomb[( mouse_y / 40 ) - 1 ][( mouse_x / 40 ) - 1 ] == true && bomb[( mouse_x / 40 ) ][( mouse_y / 40 ) ] == false ) ) liczba++;
       
        std::cout << liczba;
    }
}
P-47895
dawid9406
Temat założony przez niniejszego użytkownika
» 2012-01-11 22:52:54
Mam jeszcze jedno pytanie:
Jak zrobić że gdy klikne puste pole to sąsiadujące puste pola też mają sie odsłonić?
P-47986
« 1 » 2
  Strona 1 z 2 Następna strona