Skocz do zawartości

[php]Wczytywanie danych z pliku


Hunter

Rekomendowane odpowiedzi

Mam plik tekstowy w którym znajdują sie pozycje y i x mapy. Wyglada on nastepująco(fragment):

1,1=0 1,2=0 1,3=0 1,4=0 1,5=0 1,6=0 1,7=0 1,8=0 1,9=0 1,10=0 1,11=0 1,12=0 1,13=0 1,14=0 1,15=0 1,16=0 1,17=0 1,18=0 1,19=0 1,20=0 1,21=0 1,22=0 1,23=0 1,24=0
1,25=0 1,26=0 1,27=0 1,28=0 1,29=0 1,30=0 1,31=0 1,32=0 1,33=0 1,34=0 1,35=0 1,36=0 1,37=0 1,38=0 1,39=0
1,40=0 1,41=0 1,42=0 1,43=0 1,44=0 1,45=0 1,46=0 1,47=0 1,48=0 1,49=0 1,50=0 2,1=0 2,2=0 2,3=0 2,4=0 2,5=0 2,6=0 2,7=0 2,8=0 2,9=0 2,10=0 2,11=0

 

i tak do pozycji 50,50=0

 

mapa ma 50 na 50 pozycji, kazda pozycja oddzielona jest spacją.

 

 

podajac w $_GET'ach daną pozycję np x=5&y=4 chcę sprawdzić czy na około tego pola wartości pozostałych pól są mniejsze niż 3, czyli po = mają liczbe mniejsza niz 3.

w tym celu musze sprawdzic 8 pozycji na około. napisałem funkcje:

 

 

 

function CheckBuildingsAround($x,$y,$type)
    {
        $x = $x;
        $y = $y;
        
        $x1 = $x-1;
        $y1 = $y-1;
        
        $x2 = $x;
        $y2 = $y-1;
        
        $x3 = $x+1;
        $y3 = $y-1;
        
        $x4 = $x-1;
        $y4 = $y;
        
        $x5 = $x;
        $y5 = $y;
        
        $x6 = $x+2;
        $y6 = $y;
        
        $x7 = $x-1;
        $y7 = $y+1;
        
        $x8 = $x;
        $y8 = $y+1;
        
        $x9 = $x+1;
        $y9 = $y+1;
        
        print $x1.'/'.$y1.'<br/> ';
        print $x2.'/'.$y2.'<br/> ';
        print $x3.'/'.$y3.'<br/> ';
        print $x4.'/'.$y4.'<br/> ';
        print $x5.'/'.$y5.'<br/> ';
        print $x6.'/'.$y6.'<br/> ';
        print $x7.'/'.$y7.'<br/> ';
        print $x8.'/'.$y8.'<br/> ';
        print $x9.'/'.$y9.'<br/> ';
                
        $path = 'maps/';
        $file = fopen( $path.'file.txt', 'r+');
        $data = fread( $file, filesize( $path.'file.txt'));
        fclose( $file );
        $text= explode( " ", $data );
        print '<br>';
        $res = 0;


            for ($j=1;$j<=2499;$j++)
            {
                $text2 = explode( "=", $text[$j] );
                if ( $text2[0] == $y1.','.$x1 )//sprawdzenie czy jest pole
                {
                    if ( $text2[1] > 3 AND $text2[1] != $type )
                    {
                        return 1;    
                    }
                }
                
                if ( $text2[0] == $y2.','.$x2 )//sprawdzenie czy jest pole
                {
                    if ( $text2[1] > 3 AND $text2[1] != $type)
                    {
                        return 1;    
                    }
                }
                
                if ( $text2[0] == $y3.','.$x3 )//sprawdzenie czy jest pole
                {
                    if ( $text2[1] > 3 AND $text2[1] != $type)
                    {
                        return 1;    
                    }
                }
                
                if ( $text2[0] == $y4.','.$x4 )//sprawdzenie czy jest pole
                {
                    print 'a';
                    if ( $text2[1] > 3 AND $text2[1] != $type)
                    {
                        return 1;    
                    }
                }
                
                
                if ( $text2[0] == $y6.','.$x6 )//sprawdzenie czy jest pole
                {
                    print 'b';
                    if ( $text2[1] > 3 AND $text2[1] != $type)
                    {
                        return 1;    
                    }
                }
                
                if ( $text2[0] == $y7.','.$x7 )//sprawdzenie czy jest pole
                {
                    if ( $text2[1] > 3 AND $text2[1] != $type)
                    {
                        return 1;    
                    }
                }
                
                if ( $text2[0] == $y8.','.$x8 )//sprawdzenie czy jest pole
                {
                    if ( $text2[1] > 3 AND $text2[1] != $type)
                    {
                        return 1;    
                    }
                }
                
                if ( $text2[0] == $y9.','.$x9 )//sprawdzenie czy jest pole
                {
                    if ( $text2[1] > 3 AND $text2[1] != $type)
                    {
                        return 1;    
                    }
                }
                
            }
    
    }

 

 

niestety niewiadomo czemu funkcja ta sprawdza tylko pierwsze 4 warunki -.- nie wiem co jest grane mecze sie z tym juz 2 dzień ;/

 

prosze o pomoc webmasterów i królów PHP.

Odnośnik do komentarza
Udostępnij na innych stronach

Czy wszystkie pola myszą spełniać warunek < 3?

 

Swoją drogą, to co prezentujesz tutaj to bardzo toporna metoda. Plik mapy jest za duży, a jego obsługa toporna. Mogę zaproponować inne rozwiązanie?

Odnośnik do komentarza
Udostępnij na innych stronach

Dobra, więc tak.

 

Co do mapy. Plik to zlepek znaków, bajtów o wartościach z przedziału 0-255. Dlaczego by tego nie wykorzystać? W końcu jedyne co musisz przechować w pliku to wartość pola, pozycję pola może określać pozycja bajtu w pliku, w końcu mapa ma stałą wielkość. Nawet jeśli nie to jej rozmiary zawsze można wgrać na początku pliku i kazać programowi odczytywać ją i dostosowywać odpowiednio parametry.

 

Co do sprawdzania pól. Cóż. Musisz sprawdzić pola na około jakiegoś punktu (x,y), powiedzmy w odległości delta=1, sprawdzasz wtedy pola spełniające warunki <x-delta,x+delta> i <y-delta,y+delta> oraz (x,y) != (punkt odniesienia). Jak to ogarnąć? Dwie pętle for, w nich warunek który ignoruje sprawdzanie punktu odniesienia. Proste?

 

EDIT

Prosty systemik mapy 50x50, na funkcjach, obiektowo jeszcze nie programujesz. Good luck. ;)

<?php

    // stałe określające rozmiary mapy
    define( 'MAP_WIDTH', 50 );
    define( 'MAP_HEIGHT', 50 );

    // stała wyliczająca rozmiar pliku mapy
    define( 'MAP_SIZE', MAP_WIDTH * MAP_HEIGHT );

    function map_open( $file ) { // otworzenie mapy
        if( !file_exists( $file ) ) { // brak pliku
            $handle = fopen( $file, 'w+' );
            fwrite( $handle, str_repeat( chr( 0 ), MAP_SIZE ) );
        }
        else if( filesize( $file ) < MAP_SIZE ) { // plik za mały
            $handle = fopen( $file, 'a+' );
            fwrite( $handle, str_repeat( chr( 0 ), MAP_SIZE - filesize( $file ) - 1 ) ); // dopisz brakujące znaki
        }
        else { // plik ma się dobrze
            $handle = fopen( $file, 'r+' );
        }
        return $handle;
    }

    function map_close( $handle ) { // zamknięcie mapy
        fclose( $handle );
    }

    function map_check( $x, $y ) { // sprawdzenie czy pole jest ok
        if( $x < 0 || $x > MAP_WIDTH || $y < 0 || $y > MAP_HEIGHT ) {
            return false;
        }
        return true;
    }

    function map_get( $handle, $x, $y ) { // pobranie wartości pola
        if( !map_check( $x, $y ) ) { // pole jest złe!
            return 0;
        }
        fseek( $handle, $x + $y * MAP_WIDTH );
        return ord( fgetc( $handle ) );
    }

    function map_set( $handle, $x, $y, $value ) { // zmiana wartości pola
        if( !map_check( $x, $y ) ) { // pole jest złe!
            return false;
        }
        fseek( $handle, $x + $y * MAP_WIDTH );
        fwrite( $handle, chr( $value & 0xFF ) );
        return true;
    }

    $map = map_open( 'mapa.txt' );

     // losowa zmiana wartości losowego pola
    $x = round( rand( 0, MAP_WIDTH ) );
    $y = round( rand( 0, MAP_HEIGHT ) );
    $value = round( rand( 0, 255 ) );
    map_set( $map, $x, $y, $value );
    echo $x . ',' . $y . '=' . $value;

    // wyświetlenie mapy w tabelce
    echo '<table border=1>';
    for( $y = 0; $y < MAP_HEIGHT; $y++ ) {
        echo '<tr>';
        for( $x = 0; $x < MAP_WIDTH; $x++ ) {
            echo '<td>' . $x . ',' . $y . '=' . map_get( $map, $x, $y ) . '</td>';
        }
        echo '</tr>';
    }
    echo '</table>';

    map_close( $map );

?>

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...