2013-08-23 12 views
6

Zrobiłem grę trałowiec w javascript, który w końcu działał całkiem sprawnie, aż dodałem funkcję "expand()" (patrz poniżej). Mam 3 problemy:javascript minesweeper rozwiń zwijanie kontuaru

  1. Gdy rozszerza dodaje zbyt wiele do „flippedCount” (patrz kod poniżej) - na zdjęciu poniżej div na prawo wyświetlaczy „flippedCount” i jego 39 zamiast 35.
  2. W rezultacie, jeśli gracz przekroczy 90 kwadratów (kwota do wygrania) podczas "expand()", wygrywa ekran nie pokazuje.
  3. Również nie rozszerza się prawidłowo (patrz zdjęcia poniżej).

Odpowiedni kod i link jest poniżej tych 2 obrazów

Image showing a partly completed minesweeper field

Image showing an 'empty' minesweeper field

var flippedCount = 0; 
var alreadySetAsZero = []; 
var columnAmount = 10; 

function processClick(clicked) { //i use a "(this)" to pass as "(clicked)" 
    nextToBombCheck(parseInt(clicked.id)); 
    checkWin(); 
} 

nextToBombCheck(boxNum) { 
    flippedCount++; 
    document.getElementById("flipped").innerHTML = flippedCount; 
    //long function setting "bombCount" to # bombs around clicked square goes here 
    if (bombCount !== 0) { 
    //blah blah blah 
    } else { 
    alreadySetAsZero[ boxNum ] = "yes"; 
    expand(boxNum); 
    } 
} 

function expand(emptyBoxId) { 
    checkRightOfEmpty(emptyBoxId + 1); 
    checkLeftOfEmpty(emptyBoxId - 1); 
    checkAboveEmpty(emptyBoxId - columnAmount); 
    checkBelowEmpty(emptyBoxId + columnAmount); 
} 

function checkRightOfEmpty(boxToTheRightId) { 
    //check if already marked as zero 
    if (alreadySetAsZero[ boxToTheRightId ] === "yes") 
    return; 
    //if box is at the edge 
    if (boxToTheRightId % columnAmount === (0)) { 
    //do nothing 
    } else { 
    nextToBombCheck(boxToTheRightId); 
    } 
} 

//and the rest are 3 similar functions 

nie byłem w stanie znaleźć wzór z braku rozbudowy lub numerów dodanej przeliczyć liczbę.

link here

PS: przepraszam za tytuł Nie wiem, co jeszcze można nazwać to:

+0

Jeśli mogę podać sugestię: sformatuj poprawnie swój kod (właściwe wcięcie) i zwróć uwagę na gramatykę zwrotów (fraza zaczyna się na przykład od kapitału i zwykle kończy się kropką). Ludzie są bardziej skłonni odpowiedzieć na pytanie, czy jest to łatwe do odczytania. – Sumurai8

Odpowiedz

4

Otrzymujesz niepoprawną liczbę, ponieważ twój algorytm nie uwzględnia kwadratów, które zostały już odwrócone - w wyniku tego kwadraty są liczone dwukrotnie.

Najprostszym sposobem na zachowanie dokładnej liczby jest wykorzystanie faktu, że "getElementsByClassName" zwraca listę węzłów na żywo.

Uwaga: getElementsByClassName ma pretty good browser support, ale jeśli wymagania twojej przeglądarki są inne, będziesz musiał to nieco zmienić.

Na wejściu, zainicjować listy (nazwy zmiennej tylko do odróżnienia od poprzedniego nazwa):

var newFlippedCount = document.getElementsByClassName('flipped'); 

każdym razem, gdy zaktualizować kwadrat z klasą count bomba użycia zamiast tego (dodaje przerzucony klasa, jak również) :

document.getElementById(boxNum).className = classList[bombCount] + ' flipped'; 

Podczas aktualizacji UI z nowym przewracanej użytku count:

document.getElementById("flipped").innerHTML = newFlippedCount.length; 

Twoja liczba jest teraz magicznie poprawna :)

Uwaga: możesz również rozwiązać ten problem, sprawdzając, czy pudełko zostało już odwinięte przed inkrementowaniem flippedCount.

Byłaś także okresowo otrzymuję błąd w konsoli:

Uncaught TypeError: Cannot set property 'className' of null 

na tej linii (około line: 298):

document.getElementById (boxNum).className = classList [bombCount];

Należy chronić że poprzez kontrolowanie granic lub po prostu przez sprawdzanie wartości zwracanej przed użyciem go:

var ele = document.getElementById(boxNum); 
if(!ele) return; 

ele.className = classList[bombCount] + ' flipped'; 

Demo

Edycja: Jeśli jesteś zainteresowany, tutaj jest przegląd wysoki poziom Minesweeper Cascade Algorithm

Update - kaskada błędów znalezionych

Jednym z powodów, dla których kaskada nie działała poprawnie podczas kolejnych powtórek, jest to, że zmienna używana do śledzenia komórek, które zostały już ustawione na zero, nie została zresetowana w nowej grze. Dla Fix:

function start() { 
    … 
    // Reset to empty array 
    alreadySetAsZero = []; 
    ... 
} 

Updated skrzypce z dodatkowych sprawozdań debugowania, aby pomóc znaleźć problem:

Demo

+0

Nie myślę "document.getElementById (" flipped ") innerHTML = newFlippedCount.length;" zadziała, edytuj odpowiedź lub wyjaśnij ten kod i dziękuję za pomoc –

+0

Nie twierdziłem, że były to jedyne miejsca do zmiany lub że twój kod został całkowicie usunięty z debugowania. Istnieje kilka miejsc, w których kontrola logiczna przerzuci Count - każda z nich również powinna zostać zmieniona. To powinno ci zacząć ... – dc5

+0

Naprawiłem odwróconą liczbę głównie na podstawie innej odpowiedzi tutaj, nadal wydaje się być trochę podsłuchana. ale o wiele mniej i nadal mam problem z odrzucaniem wszystkich skrzynek, które powinien. –

1

Chociaż użyć "alreadySetAsZero", aby zatrzymać kwadraty liczone kilka razy, to nie robi weź pod uwagę kwadraty z liczbą bomb. Będą one policzone wiele razy w twojej metodzie rozwijania.

+0

dzięki drugiej odpowiedzi nie wskazałem powodu, dla którego mój kod dawał mi ten problem –

0

i okazało się, że problem, który został daje mi (LICZNIK) Obliczono kwadraty „-1” i „100”

Następnie dodano || boxToTheRightId > (cellAmount - 1) do checkRightOfEmpty i || boxToTheRightId < 0 do checkLeftOfEmpty (w ich if sprawozdania) i działa dobrze, dzięki, chłopaki.