首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >javascript游戏(3行)行检查逻辑

javascript游戏(3行)行检查逻辑
EN

Stack Overflow用户
提问于 2014-05-24 02:21:28
回答 1查看 374关注 0票数 0

从昨天开始,我就一直在为解决这个问题而斗争,我担心我已经有了隧道般的视野。

游戏:

第一位玩家做出一种类型的3行(xxx或000)获胜。http://jsfiddle.net/brunobliss/YANAW/

捕获:

只有第一条水平线起作用了!--我可以用大量的IFS使它全部工作,但是一遍又一遍地重复相同的代码常常是一个很好的指示,表明我做错了什么

问题:

Bruno.checkWin()将检查是否有一行,给我这个游戏粉笔的人告诉我,用for循环检查行是可能的,我应该使用它而不是IFS。如果没有不幸的话我解决不了这个问题..。

代码语言:javascript
复制
<!doctype html>
<html>
    <head>
        <meta charset="iso-8859-1">
        <title> </title>
        <style>
            #jogo {
                border: #000 1px solid;
                width: 150px;
                position: absolute;
                left: 50%;
                top: 50%;
                margin-left: -75px;
                margin-top: -75px;
            }
            #jogo div {
                display: inline-block;
                vertical-align: top;
                width: 28px;
                height: 28px;
                padding: 10px;
                font-size: 20px;
                border: #000 1px solid;
                border-collapse: collapse;
                text-align: center;
            }
            #reset {
                font-family: Verdana;
                width: 153px;
                height: 30px;
                background-color: black;
                color: white;
                text-align: center;
                cursor: pointer;
                left: 50%;
                top: 50%;
                position: absolute;
                margin-left: -76px;
                margin-top: 100px;
            }
        </style>
        <script> </script>
    </head>
    <body>
        <div id="jogo"> </div>
        <div id="reset"> RESET </div>
        <script>
        var ultimo = "0";
        var reset = document.getElementById('reset');
                    var jogo = document.getElementById('jogo');
            var cell = jogo.getElementsByTagName('div');
        var bruno = {
            init: function () {
                var jogo = document.getElementById('jogo');
                for ( i = 0 ; i < 9 ; i++ ) {
                    var cell = document.createElement('div');
                    cell.onclick = function () {
                        // variavel publica dentro do obj?
                        ultimo = (ultimo == "x") ? 0 : "x";
                        this.innerHTML = ultimo;
                        bruno.checkWin();   
                    };
                    jogo.appendChild(cell);
        }
            },
            checkWin: function () {
                var jogo = document.getElementById('jogo');
                var cell = jogo.getElementsByTagName('div');
                // as diagonais nao verificar por loop
                for ( i = 0 ; i < cell.length ; i=i+4 ) {
                    switch(i) {
                        case 0:
                        if (cell[0].innerHTML != '') {
                            bruno.checkFirst();
                        }
                        case 4:
                        if (cell[4].innerHTML != '') {
                            bruno.checkFirst();
                        }
                        case 8:
                        if (cell[8].innerHTML != '') {
                            bruno.checkFirst();
                        }                       
                    }
                        /*
                    } else 
                    if (i == 4 && cell[4].innerHTML != '') {
                        bruno.checkCenter();
                    } else 
                    if (i == 8 && cell[8].innerHTML != '') {
                        bruno.checkLast();
                    }*/
            }
        },
        reset: function () {
            var jogo = document.getElementById('jogo');
            var cell = jogo.getElementsByTagName('div');
            for ( j = 0 ; j < cell.length ; j++ ) {
                cell[j].innerHTML = "";
            }
        },
        checkFirst: function () {
            if (cell[0].innerHTML == cell[1].innerHTML && cell[1].innerHTML == cell[2].innerHTML) {
                alert("linha horizontal");
                return false;
            } else 
            if (cell[0].innerHTML == cell[3].innerHTML && cell[3].innerHTML == cell[6].innerHTML) {
                alert("linha vertical");
                return false;
            }
        },
        checkMiddle: function () {
            // check vertical and horizontal lines from the center
        },
        checkLast: function () {
            // check last horizontal and right edge vertical
        }

};
        window.onload = function () {
            bruno.init();
        };
        reset.onclick = function () {
            bruno.reset();
        };
        </script>
    </body>
</html>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-24 03:25:04

我想出了一个更“紧凑”的版本你的代码。没有交换声明。看一看:http://jsfiddle.net/YANAW/1/

这是代码,给那些喜欢在这里阅读的人。重要/更新的函数是checkWin()checkCells()

代码语言:javascript
复制
var bruno = {
    init: function () {
        var jogo = document.getElementById('jogo');
        for ( i = 0 ; i < 9 ; i++ ) {
            var cell = document.createElement('div');
            cell.onclick = function () {
                // variavel publica dentro do obj?
                ultimo = (ultimo == "x") ? 0 : "x";
                this.innerHTML = ultimo;
                bruno.checkWin();   
            };
            jogo.appendChild(cell);
        }
    },
    checkWin: function () {
        var jogo = document.getElementById('jogo');
        var cells = jogo.getElementsByTagName('div');

        // Scan through every cell
        var numRows = 3;
        var numColumns = 3;
        for (var i = 0; i < cells.length; i++)
        {
            // Determine cell's position
            var isHorizontalFirstCell = ((i % numColumns) === 0);
            var isVerticalFirstCell = (i < numColumns);
            var isTopLeftCorner = (i == 0);
            var isTopRightCorner = (i == 2);

            // Check for horizontal matches
            if (isHorizontalFirstCell
                && bruno.checkCells(
                    cells, i, 
                    (i + 3), 1))
            {
                alert('Horizontal');
            }

            // Check for vertical matches
            if (isVerticalFirstCell
                && bruno.checkCells(
                    cells, i,
                    (i + 7), 3))
            {
                alert('Vertical');   
            }

            // Check for diagonal matches
            if (isTopLeftCorner
                && bruno.checkCells(
                    cells, i,
                    (i + 9), 4))
            {
                alert('Diagonal');
            }

            if (isTopRightCorner
                && bruno.checkCells(
                    cells, i,
                    (i + 5), 2))
            {
                alert('Diagonal');
            }            
        }
    },
    reset: function () {
        var jogo = document.getElementById('jogo');
        var cell = jogo.getElementsByTagName('div');
        for ( j = 0 ; j < cell.length ; j++ ) {
            cell[j].innerHTML = "";
        }
    },
    checkCells: function(cells, index, limit, step) {
        var sequenceChar = null;
        for (var i = index; i < limit; i += step)
        {
            // Return false immediately if one
            // of the cells in the sequence is empty
            if (!cells[i].innerHTML) 
                return false;

            // If this is the first cell we're checking,
            // store the character(s) it holds.
            if (sequenceChar === null)
                sequenceChar = cells[i].innerHTML;

            // Otherwise, confirm that this cell holds
            // the same character(s) as the previous cell(s).
            else if (cells[i].innerHTML !== sequenceChar)
                return false;
        }

        // If we reached this point, the entire sequence
        // of cells hold the same character(s).
        return true;
    }
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23840728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档