Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Delphi - Saper-odkrywanie pustych pól

03 Gru 2012 16:22 2070 19
  • Poziom 9  
    Elo.Robię sapera i muszę odkryć puste komórki(w moim przypadku są to zera). Mam taki oto kod

    Kod: delphi
    Zaloguj się, aby zobaczyć kod



    p odpowiada za współrzędne odkrywanych komórek(jak widać zaczyna od lewej górnej). Wiem,że trzeba użyć repeat until aby zautomatyzować to lecz nie wiem jak.

    2.Da się ukryć wybrane kolumny i wiersze w stringgridzie(chcę to zrobić ponieważ gdy 0 będzie na pozycji 0,0 to wychodzi poza stringgrid/tablicę(wartości -1,-1).
  • Poziom 42  
    1. Tak najprościej i najłatwiej to należy zrobić 4-krotnie rekurencyjna procedurę, która będzie sprawdzać pola sąsiadujące, a każde sprawdzenie to znów wywołanie tej procedury.

    2. Nie należy nic ukrywać, tylko zabezpieczyć ;)
  • Moderator Programowanie
    Co do pkt 1.; to nie jest takie proste. Pozycja pojedynczego punktu nic ci nie da, bo musisz odkryć cały obszar wolny od "min".
    Tutaj masz gotowy program napisany w Delphi. Po prostu podejrzyj jak to jest zrobione : http://delphi.about.com/od/gameprogramming/ss/minesweeper.htm
    pkt 2 : Wydaje mi się, że zastosowanie StringGrid-a do Twoich celów jest błędem.
    Nie do tego został stworzony. Najlepszym chyba pomysłem, byłoby dynamiczne generowanie Panel-i albo jakiejś formy Button-ów.
  • Poziom 9  
    Dżyszla napisał:
    1. Tak najprościej i najłatwiej to należy zrobić 4-krotnie rekurencyjna procedurę, która będzie sprawdzać pola sąsiadujące, a każde sprawdzenie to znów wywołanie tej procedury.

    2. Nie należy nic ukrywać, tylko zabezpieczyć ;)


    1.Dasz radę napisać kod?

    2.Możesz napisać coś więcej.

    arnoldziq napisał:
    Co do pkt 1.; to nie jest takie proste. Pozycja pojedynczego punktu nic ci nie da, bo musisz odkryć cały obszar wolny od "min".
    Tutaj masz gotowy program napisany w Delphi. Po prostu podejrzyj jak to jest zrobione : http://delphi.about.com/od/gameprogramming/ss/minesweeper.htm
    pkt 2 : Wydaje mi się, że zastosowanie StringGrid-a do Twoich celów jest błędem.
    Nie do tego został stworzony. Najlepszym chyba pomysłem, byłoby dynamiczne generowanie Panel-i albo jakiejś formy Button-ów.


    1.Wiem chcę zrobić tak aby odkrył te 8 pól w okół zera a potem gdy jakieś z tych pól też zero wtedy odkrywa kolejne 8 pól w okół tego 0. Nie wiem jak zrobić tak aby przechodził dalej.

    2.Inaczej zrobić nie potrafię.
  • Poziom 42  
    1. Tu nie ma co pisać ;p Tu trzeba po prostu sprawdzić wartość pola i odkryć, a jeśli jest 0, to wykonać dla 4 (czy tam 8 - dawno nie grałem ;p) otaczających, czyli 4 (8) razy wywołać znów tą samą instrukcję. Nie jest to najładniejsze, ale spokojnie wystarczy.
    2. ... No jesli masz np warunek, na sprawdzenie pola 0,0 to już nie sprawdzasz -1,0 ani 0,-1 bo wychodzi poza zakres.
  • Poziom 9  
    Dżyszla napisał:
    1. Tu nie ma co pisać ;p Tu trzeba po prostu sprawdzić wartość pola i odkryć, a jeśli jest 0, to wykonać dla 4 (czy tam 8 - dawno nie grałem ;p) otaczających, czyli 4 (8) razy wywołać znów tą samą instrukcję. Nie jest to najładniejsze, ale spokojnie wystarczy.


    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    No i odrywam te 8 pól lecz teraz nie wiem jak przejść do kolejnego pola z tych 8 gdy jest 0.Mam zapisywać pozycję tych pól z 0 w tablicy czy co?
  • Poziom 9  
    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    Kod: delphi
    Zaloguj się, aby zobaczyć kod



    Taki błąd wyskakuje(błądzę we mgle).

    Delphi - Saper-odkrywanie pustych pól

    Jeśli możesz to dokończ tak aby działało a ja wtedy dokładnie przeanalizuję kod. Długo już się męczę z tym odkrywaniem i chciałbym mieć już to za sobą.

    Pytanie numer 2 nie jest już aktualne(poradziłem sobie z tym).
  • Moderator Programowanie
    Wyjątek AccessViolation jest generowany w przypadku, gdy Delphi próbuje się odwołać do do zmiennej która nie istnieje lub do zmiennej, której nie jest przyznany adres w pamięci.
    W Twoim przypadku, bez znajomości całego kodu, ciężko ustalić dokładnie gdzie błąd jest generowany. Natomiast podejrzewam, że odwołujesz się do komórki TStringDrid-a, która nie istnieje. Np. cells[-1,0] albo coś podobnego.
    Pokarz chociaż którą linię kodu, zaznacza kompilator, jako tę która generuje błąd.
  • Poziom 9  
    Przyczepia się do
    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    Ale po dodaniu tego aby omijał komórki z (-1,0)

    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    oraz aby nie odkrywał po raz kolejny komórki na którą klikniemy

    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    Przyczepia się do

    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    @Mogę podesłać program na pw.
  • Poziom 9  
    Dżyszla napisał:
    poza warunkiem "od dołu" musisz też sprawdzić warunek "od góry" aby nie przekroczyć rozmiaru tablicy.


    Jeśli chodziło o to aby nie przekraczał tablicy poniżej 0 i powyżej 9(tak mam w moim przypadku) to dodałem

    Kod: delphi
    Zaloguj się, aby zobaczyć kod



    Nadal jednak ten sam błąd

    Kod: delphi
    Zaloguj się, aby zobaczyć kod
  • Moderator Programowanie
    Zamieść cały, spakowany projekt wraz z kodem.
    Na pewno znajdziemy miejsce, które stwarza problemy.
  • Poziom 28  
    A może kolega zapoznał by się z DEBUGGEREM w Delphi. Do takiego celu właśnie został stwożony.
  • Poziom 9  
    arnoldziq napisał:
    Zamieść cały, spakowany projekt wraz z kodem.
    Na pewno znajdziemy miejsce, które stwarza problemy.


    Dodane.Proszę ignorować kod który jest pomiędzy {}.
  • Moderator Programowanie
    Przeanalizowałem ten kod odkrywający "puste" pola.
    Jest z nim jeden problem. Ten kod zapętla się, w nieskończoność.
    Nawet ograniczenie zasięgu odkrywania z góry i z dołu nic nie pomoże.
    Trzeba wymyślić metodę która spowoduje omijanie już odkrytych pól i nie pokrywanie ponownie ich "otoczenia".
  • Poziom 9  
    arnoldziq napisał:
    Przeanalizowałem ten kod odkrywający "puste" pola.
    Jest z nim jeden problem. Ten kod zapętla się, w nieskończoność.
    Nawet ograniczenie zasięgu odkrywania z góry i z dołu nic nie pomoże.
    Trzeba wymyślić metodę która spowoduje omijanie już odkrytych pól i nie pokrywanie ponownie ich "otoczenia".


    Zrobiłem tak aby przeszukiwał 8 stron od naciśniętej komórki i sprawdzał czy są zera i odkrywał 8 pól wokół tej komórki.Na razie działa tak sobie.

    Teraz mam pytanie jak dodać tak aby po naciśnięciu 2 przycisków równocześnie na myszy dodawał do tej komórki na którą klikam 2 PM literę M?
  • Poziom 9  
    Poradziłem sobie z oznaczaniem min przez użytkownika.Dacie radę coś pomyśleć o tym odkrywaniu pól?
  • Poziom 9  
    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    Jest tutaj możliwe aby liczbamin przyjęła większą wartość niż 10?