Having issues with clearing area around blank squares in minesweeper

217 Views Asked by At

Ok i finally got my minesweeper game made just needing one more thing if anyone could help me with. The part when you click on an unnumbered square and it will reveal some of the board. I have been playing around on this for sometime just drawing a blank. This is a simple minesweeper game just in java script. I have everything labeled where things should go to make it easier to find and i will bold it on where my code ive been working on is.

 //Global 
//store the value of each square
    var gaValue = new Array(8)
    for (i = 0; i <= 8; i++)
        gaValue[i] = new Array(8)
    for (i = 0; i <= 8; i++)
    {
        //loop through each item in those row
        for (j = 0; j <= 8 ; j++)
            gaValue[i][j] = 0
    }
    //Store the status of each square
    var gaSquare = new Array(8)
    for (j = 0; j <= 8; j++)
        gaSquare[j] = new Array(8)
    for (j = 0; j <= 8; j++)
    {
        //loop through each item in those row
        for (i = 0; i <= 8 ; i++)
            gaSquare[i][j] = "C"        
    }
    //Track of whether the game is over or not (starts this with false)
    var gbGameOver = false

    function vInit()
    {
        var strHTML
        var i
        var j

        strHTML = "<table style='margin-left:auto;margin-right:auto'>"
        strHTML += "<tr><td colspan='8' style='text-align:center'>MineSweeper</td></tr>"
        strHTML += "<tr><td colspan='8' style='text-align:center'><input type='button' id='btnNew' value='New Game' onclick='vNewGame()'></td></tr>"

        //Loop through the rows to build the table of tiles
        for (i = 0; i < 8; i++)
        {
            strHTML += "<tr>"
            for (j = 0; j < 8; j++)

            strHTML += '<td><img src="images/sqt0.png" id="square' + i + ', ' + j + '" onclick="vClick(' + i + ', ' + j + ')"/></td>';

            strHTML += "<tr>";
        }
        strHTML += '<tr><td colspan="8" style="text-align:center"><textarea id="taOut" cols="18" rows="10"></textarea></td></tr>'
        strHTML += "</table>"
        frmGrid.innerHTML = strHTML    

//Place bombs
        var iBomb = 0
        var iRow = Math.floor(Math.random() * 8)
        var iCol = Math.floor(Math.random() * 8)

        while (iBomb < 8)
        {
            while (gaValue[iRow][iCol] == 9)
            {
                iRow = Math.floor(Math.random() * 8)
                iCol = Math.floor(Math.random() * 8)
            }
            gaValue[iRow][iCol] = 9
            iBomb++
        }
        //Calculate clue values around mines
        var iMine = 0        
        for (i = 0; i < 8; i++)
        {
            for (j = 0; j < 8; j++)
            {
                for (k = (i - 1) ; k <= (i + 1) ; k++)
                    for (m = (j - 1) ; m <= (j + 1) ; m++)
                        if (k >= 0 && k <= 9 && j >= 0 && j <= 9)
                            if (gaValue[k][m] == 9)
                                iMine++
                if (gaValue[i][j] != 9)
                    gaValue[i][j] = iMine
                iMine = 0
            }
        }
    }
    //Get the ID of the image I need to change
    function vClick(iRow, iCol)

    {      
        var gaSquare = "square" + iRow + ", " + iCol
        var strOut = ""

        gaSquare[iRow][iCol] = 'o';
        document.getElementById(gaSquare).src = "images/" + gaValue[iRow][iCol] + ".png"
        if (gaValue[iRow][iCol] == 9)
        { 
            gbGameOver = true
            strOut = "Game Over"
            vOver()
        }
      else if (gaValue[iRow][iCol] == 0)

            vZero(iRow, iCol)

        document.getElementById('taOut').value = strOut
    }
    //GameOver       
    function vOver()    
    {
        var i
        var j
        var strID;

        for (i = 0; i < 8; i++)
            for (j = 0; j < 8; j++) {
                strID = "square" + i + ", " + j;
                document.getElementById(strID).src = "images/" + gaValue[i][j] + ".png"
            }
    }
**//Clearing area
    function vZero(iRow, iCol, i, j) {
        for (i = iRow - 1; i <= iRow + 1; i++) {
            for (j = iCol - 1; j <= iCol + 1; j++) {
                if (k >= 0 && k <= 8 && j >= 0 && j <= 8)
                    vClick(i, j)
            }**

            //Start new game
            function vNewGame() {
                vInit()
                    }

                    //no menu on right click
                    function bIsRightButtonClicked(e) {
                        var rightclick = false
                        e = e || window.event
                        if (e.which) {
                            rightclick = (e.which == 3)
                        }
                        else if (e.button) {
                      rightclick = (e.button == 2)
                        }
                        return rightclick
                    }
                }
            }
1

There are 1 best solutions below

3
On

I believe the main mistake is that you are referring to k inside vZero() when that variable is not defined. You also appear to be missing a closing curly bracket or two on that function.

Try changing that function to as follows:

//Clearing area
function vZero(iRow, iCol) {
    for (var i = iRow - 1; i <= iRow + 1; i++) {
        for (var j = iCol - 1; j <= iCol + 1; j++) {
            if (i >= 0 && i <= 8 && j >= 0 && j <= 8) vClick(i, j);
        }
    }
}

You'll note that I changed the i and j parameters to be local variables, because they are only used by that function for the purposes of the for loops. You don't need to have them as parameters. Doing so only confuses other developers because that implies that you need to pass a value for them into the function for it to work, whereas you only need to pass in iRow and iCol. Does that make sense?