2011-05-11 3 views
0

Im essayant de faire un jeu de dragueur de mines dans jquery.jquery fonction récursive

Lorsqu'un utilisateur clique sur une cellule de tableau, une vérification est effectuée pour voir s'il y a un nombre ou un x dans le carré. Si ce n'est pas le cas, cette fonction est appelée et la cellule du tableau lui est transmise.

La fonction renvoie tous les carrés adjacents au carré cliqué et ils sont ensuite découverts. La question est, à partir de la sélection des carrés adjacents initialement retournés, comment puis-je vérifier si l'un d'entre eux est vide, et s'ils le sont, obtenir les carrés adjacents, les découvrir et vérifier si l'un d'entre eux est vide .... jusqu'à ce que tous les carrés vides qui étaient adjacents à des carrés adjacents à celui qui a été cliqué soient découverts?

if (isEmptySquare(this)) { 
    emp = adjacentSquares(this); 
    $(emp).each(function() { 
     $(this).removeClass('covered').addClass('uncovered'); 
    }); 
} 

function adjacentSquares(square) { 
    //Find the row and column of the current td(square) 
    var thisRow = $(square).parent().parent().children().index($(square).parent()); 
    var thisCol = $(square).parent().children().index($(square)); 
    var prevRow = (thisRow - 1); 
    var nextRow = (thisRow + 1); 

    if (thisCol == 0) { 
     sliceFrom = 0; 
    } else { 
     sliceFrom = (thisCol - 1); 
    } 

    //Select all the adjacent td's to the current td, then merge the adjacent cells into a variable 
    var above = $('tr:eq(' + prevRow + ')').children('td').slice((sliceFrom), (thisCol + 2)); 
    var below = $('tr:eq(' + nextRow + ')').children('td').slice((sliceFrom), (thisCol + 2)); 
    var aboveBelow = $.merge(above, below); 
    var prevNext = $.merge(($(square).next('td')), ($(square).prev('td'))); 
    var adjacents = $.merge(aboveBelow, prevNext); 

    return adjacents; 
} 

function isEmptySquare(square) { 
    if ($(square).filter(function() { 
     return !/[0-9]/.test($(square).text()); 
    }).not(":contains('x')").length > 0) { 
     return true; 
    } 
    else { 
     return false; 
    } 
} 

Répondre

1

Ceci est un problème plus familier que vous ne le pensez. Vous pouvez réaliser ce dont vous avez besoin en implémentant le Flood Fill algorithm.

+0

Bravo pour ça. Après avoir regardé dans le remplissage de l'inondation, j'ai trouvé exactement ce dont j'avais besoin @ http://www.htmlgoodies.com/primers/jsp/article.php/3622321/Javascript-Basics-Part-12.htm – callumander