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

Usuwanie elementów z listy

Ostatnio zmodyfikowano 2010-06-06 15:04
Autor Wiadomość
Lukas1art
Temat założony przez niniejszego użytkownika
Usuwanie elementów z listy
» 2010-06-03 23:42:56
Witam, mam na zajęcia zrobić grę komputerową. Do realizacji zadania wybrałem bibliotekę allegro, gdyż wydała mi się w miarę prosta, a przy ocenie liczyć się będzie prawie tylko sam algorytm, jednak choćby do samych testów warto mieć interfejs graficzny.
Chodzi o prostą grę, którą "gra się na papierze" na nudnych lekcjach/zajęciach- piłkę.

Nie zagłębiając się za bardzo, mam graf (tablicę list). Każde pole z gry ma indeks (od 0 do 100) odpowiadający nr tabeli. Każdemu polu przypisana jest lista wierzchołków, do których można dojść. Klikając na jakiś punkt jest zaIFowane, że jeśli kursor jest na punkcie, i jeśli wciśnięty jest przycisk myszy, i jeśli punkt w którym obecnie jest piłka ma wśród dostępnych dróg w liście ten wierzchołek na który kliknięto, to rysujemy linię, i usuwamy daną ściężkę z listy dostępnych.


Wszystko było fajnie do momentu, w którym poza grafiką doszła właśnie operacja usuwania (lub dodawania) elementu do listy.

Ja dopiero zaczynam, no i szlag mnie trafił, bo zrobiłem sobie interfejs graficzny, i wychodzi na to, że jest bezużyteczny, ale do rzeczy:

Oto fragment, ze tak powiem pętli głównej
C/C++
while( !key[ KEY_ESC ] )
{
    myszka(); //inicjalizacja myszki (pobiera pozycje x,y kursora oraz stan klawiszy)
   
    //Caly ponizszy fragment sluzy do ustalenia przy jakim punkcie na boisku stoi kursor (raczej nieistotne w kwestii błedu) 
    TMP =(( mx - 75 ) / 50 ) +((( my - 75 ) / 50 ) - 1 ) * 9;
    TMP2 =(( PILKA.X - 75 ) / 50 ) +((( PILKA.Y - 75 ) / 50 ) - 1 ) * 9;
    if( my < 125 ) TAB2[ TMP ].indeks = 0;
   
    if( my > 675 ) TAB2[ TMP ].indeks = 100;
   
    textprintf_ex( screen, font, 20, 20, makecol( 200, 200, 200 ), - 1, "Myszka x = %d, y = %d, klawisz = %d !, punkt nr %d, pilka w punkcie %d", mx, my, mb, TAB2[ TMP ].indeks, TAB2[ TMP2 ].indeks );
    rectfill( screen, 0, 0, 800, 80, makecol( 128, 128, 128 ) );
   
   
    //plansza jest narysowana i sie odswieza w while`u, az ktoś nacisnie przycisk myszki (mb=1)  
   
    if(( mb == 1 ) )
    { //wtedy to rysuje sie linia od pozycji pilki, az do punktu na ktory kliknal kursor
        line( screen, PILKA.X, PILKA.Y, TAB2[ TMP ].X, TAB2[ TMP ].Y, makecol( 0, 0, 0 ) );
        PILKA.X = TAB2[ TMP ].X;
        PILKA.Y = TAB2[ TMP ].Y;
       
        G.Usun_krawedz( TAB2[ TMP2 ].indeks, TAB2[ TMP ].indeks );
        //z listy dostepnych ruchow dla danej pozycji pilki usuwamy ten ktory wlasnei zrobilismy (bo nei mozna nadrysowywac lini)
    }
   
   
}
No i właśnie w miejscu w którym usuwam pojawia się błąd, to znaczy program śmiga, ale w momencie naciśnięcia przycisku myszy (mb==1) linia się ładnie rysuje, ale przy dojściu do usuniecia od razu się wywala (komunikat:"Program Pilka.exe przestałdziałać").
Myślałem, że to dlatego, że będąc w while`u kliknięcie myszki trwa na tyle, że usuwa to z 100 razy i się zawiesza, ale próbowałem dać Sleep(1000) zaraz po usunięciu, to do lini Sleepa nawet nie dochodzi (w sensie, że nie zdąży poczekać tej sekundy, tylko momentalnie po kliknięciu rysuje się linia i się wykrzacza)

Dodam, że bez allegro, w zwykłym pliku cpp funkcje dodaj i usuń śmigają aż miło :/
Dodam również, że korzystam z szablonu list
Dodam również cały kod http://notepub.com/?note=36630
Korzystam z Dev C++ V. 4.9.9.2 z zaktualizowaną biblioteką allegro

Ktoś się zna na tym i może pomóc?
Z góry dziękuje za pomoc :)
P-17534
malan
» 2010-06-04 21:26:41
Będę wdzięczny, jeżeli wrzucisz kod na http://wklej.org/ :).
P-17575
Lukas1art
Temat założony przez niniejszego użytkownika
» 2010-06-04 23:52:29
wklejone :)
właśnie takiej stronki szukałem, ale znalazłem tylko tamtego notepada ;) wiem, słabo szukałem :D

http://wklej.org/id/345590/

/ edit:
teraz zauważyłem że wszystkie includy ucięło :/
jakby co, to powinny tam być:
C/C++
#include <allegro.h>
#include <winalleg.h>
#include <iostream>
#include <list>
#include <stdlib.h>
#include <iomanip>

#include <windows.h>
P-17581
malan
» 2010-06-05 01:19:29
Ucięło includy, pododawało jakieś <br> oraz (nie wiem jak to nazwać):
C/C++
for( i = 0; i {
    zmiana = 0;
Co to jest? :o To też wina źle wklejonego kodu? ;)
P-17582
Lukas1art
Temat założony przez niniejszego użytkownika
» 2010-06-05 14:07:44

Wkleiłem raz jeszcze,
http://wklej.org/id/345785/

nie wiem czemu się tak porobiło :/

a to na co zwróciłeś uwagę, to zasadniczo jest przy sortowaniu bąbelkowym (artefakt z poprzedniej wersji, jak na strukturze grafowej robiłem algorytmy dijkstry, prima, belmana-forda i kruskala), które nie jest obecnie używane w kodzie, ale zostawione, bo wiem, że później będzie wykorzystane ;)
P-17602
malan
» 2010-06-05 21:36:23
Kod niby się skompilował, ale program się nie uruchamiał. W końcu doszedłem co jest nie tak:
C/C++
set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 800, 0, 0 );
Rozmiar okna w Allegro musi być proporcjonalny (np. 800 x 600, 1024 x 786) inaczej mogę być problemy z uruchomieniem :).
Ok, ale udało się uruchomić. Teraz po pierwsze- jeżeli używasz Allegro to nie std::cout, a allegro_message. Po drugie- zamień sobie:
C/C++
//int GRAF::Usun_krawedz(int V1, int V2)
if( V1 > l_wierzch || V1 < 1 ) { cout << "Nie ma takiego wierzcholka V1" << endl; return( 0 ); }
if( V2 > l_wierzch || V2 < 1 ) { cout << "Nie ma takiej wierzcholka V2" << endl; return( 0 ); }
if( V1 == V2 ) { cout << "Nie mozna zapetlic wierzcholka" << endl; return( 0 ); }
... na:
C/C++
if( V1 > l_wierzch || V1 < 1 ) allegro_message( "Nie ma takiego wierzcholka V1" );

if( V2 > l_wierzch || V2 < 1 ) allegro_message( "Nie ma takiego wierzcholka V2" );

if( V1 == V2 ) allegro_message( "Nie mozna zapetlic wierzcholka" );

... i zobacz co się dzieje :).
P-17645
Lukas1art
Temat założony przez niniejszego użytkownika
» 2010-06-06 00:56:59
dzięki za rady, ale kurcze dalej mam ten sam problem. Zmieniłem tak jak poradziłeś, a program dalej się zwiesza przy usuwaniu.
P-17653
malan
» 2010-06-06 10:16:25
Wiem :). Mi przy każdym ruchu wyświetla się komunikat "Nie można zapętlić wierzchołka" ;p. Coś musiałeś pomieszać ;p.

/ edit
Sory, to ja pomieszałem- bawiłem się kodem i zapomniałem zmienić czegoś ;p. Komunikat już nie wyskakuje, ale program nadal się zawiesza, ale nie mogę znaleźć błędu ;p.
P-17657
« 1 » 2
  Strona 1 z 2 Następna strona