2013-08-23 9 views
6

Ho realizzato un gioco minesweeper in javascript, che alla fine si è svolto senza intoppi, fino a quando non ho aggiunto la funzione "expand()" (vedi sotto). Ho 3 problemi:javascript minesweeper expand messing counter

  1. Quando si espande aggiunge troppi per "flippedCount" (vedi codice qui sotto) - nell'immagine qui sotto il div a destra viene visualizzato "flippedCount", e il suo 39 invece di 35.
  2. Di conseguenza, se un giocatore supera i 90 quadrati (importo da vincere) durante un "espandi()", la schermata vincente non viene visualizzata.
  3. Inoltre non si espande correttamente (vedere le immagini di seguito).

Il codice in questione e un link è qui sotto queste 2 immagini

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 

non ero in grado di trovare un modello con la mancanza di espansione o aggiunti dei numeri conteggio capovolto.

link here

P.S. scusate per il titolo non so cos'altro chiamarlo

+0

Se posso dare un suggerimento: formattare il codice correttamente (indentazione corretta) e prestare attenzione alla grammatica delle frasi (una frase inizia con una maiuscola per esempio e di solito finisce in un punto). È più probabile che le persone rispondano a una domanda se è facile da leggere. – Sumurai8

risposta

4

Si sta ottenendo un conteggio errato perché il proprio algoritmo non tiene conto dei quadrati già capovolti - risultando che i quadrati vengono contati due volte.

Il modo più semplice per mantenere un conteggio accurato di è utilizzare questo fatto che "getElementsByClassName" restituisce un elenco di nodi attivi.

Nota: getElementsByClassName ha pretty good browser support, ma se i requisiti del browser sono diversi, sarà necessario regolarlo leggermente.

Al momento dell'ingresso, inizializzare l'elenco (nome della variabile solo per differenziarsi dal nome precedente):

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

Ogni volta che si aggiorna una piazza con una classe di utilizzo conteggio bomba questo posto (aggiunge la classe capovolto pure) :

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

Quando si aggiorna l'interfaccia utente con il nuovo uso conteggio capovolto:

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

Il conteggio ora è magicamente corretto :)

Nota: è anche possibile risolvere questo problema controllando se la casella è già stata capovolta prima di incrementare lo flippedCount.

Lei è stato anche periodicamente trovato un errore nella console:

Uncaught TypeError: Cannot set property 'className' of null 

a questa linea (attorno alla riga: 298):

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

Si dovrebbe proteggere, che mediante il controllo dei limiti o semplicemente controllando il valore di ritorno prima di utilizzarlo:

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

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

Demo

Edit: Se siete interessati, ecco un panoramica di alto livello di il Minesweeper Cascade Algorithm

Update - cascata bug trovati

Uno dei motivi per cui la cascata non funzionava correttamente nei replay successivi è che la variabile usata per tracciare celle che erano già state impostate a zero non veniva ripristinata in una nuova partita. Per una correzione:

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

violino Aggiornato con istruzioni di debug aggiuntive per aiutare a trovare il problema:

Demo

+0

non penso "document.getElementById (" capovolto "). InnerHTML = newFlippedCount.length;" funzionerà per favore modifica la risposta o spiega quel codice e grazie per il tuo aiuto –

+0

Non ho affermato che questi erano gli unici punti da cambiare o che il tuo codice era completamente debugato. Ci sono molti posti in cui la logica controlla flippedCount - ognuno di questi dovrebbe essere cambiato. Questo dovrebbe farti iniziare comunque ... – dc5

+0

Ho risolto il conteggio inverso principalmente basato sull'altra risposta qui sembra ancora essere un po 'disturbata. ma è molto meno e ho ancora il problema di non capovolgere tutte le scatole che dovrebbe. –

1

Anche se si utilizza "alreadySetAsZero" per fermare le piazze di essere contati più volte, questo non lo fa prendere in considerazione i quadrati con un conteggio delle bombe. Questi verranno conteggiati più volte nel metodo di espansione.

+0

grazie l'altra risposta non ha sottolineato il motivo per cui il mio codice mi stava dando quel problema –

0

ho trovato il problema che mi (contatore) dava fastidio ha contato piazze "-1" e "100"

Ho poi aggiunto || boxToTheRightId > (cellAmount - 1) a checkRightOfEmpty e || boxToTheRightId < 0 a checkLeftOfEmpty (nelle if dichiarazioni) e funziona bene, grazie comunque ragazzi.