1

我正在尝试像这样创建一个棋盘。

在此处输入图像描述

我确实创建了一张桌子,但不知道如何给它上色。A 还需要打印电路板名称(如 A1、A2、... H8)并能够将任何图形放入任何单元格中。

首先,这是创建表的代码:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>ChessBoard</title>

    <script type="text/javascript">
        function CreateTable(){
            var poz = document.getElementById('space');

            // createing table adn inserting into document
            tab = document.createElement('table');
            poz.appendChild(tab);

            tab.border = '5';

            for (var i = 0; i < 8; i++){
                // creating row and inserting into document
                var row = tab.insertRow(i);

                for(var j = 0; j < 8; j++){
                    // creating cells and fill with data (numbers)
                    var cell = row.insertCell(j);
                    cell.innerHTML = i*j;
                    cell.style.backgroundColor = 'blue';
                    cell.style.color = 'white';
                    cell.style.height = '50px';
                    cell.style.width = '50px';

                };
            };

        }
    </script>
</head>

<body onload="CreateTable()" id ="space">

</body>
</html>

如何用图形填充特定单元格(如 A3、E5、H8、...)?图是图像。

第 2 部分:我确实在您的帮助下创建了一个板。现在我正试图从这段代码中做更多的事情。

  1. 如何将多个不同的图像放入多个单元格中?我正在尝试获得正确的工作代码,但没有成功。此图像应在加载表格时出现(当我按下按钮 CreateTable 时)。我尝试使用以下代码创建:

  2. 在这一点上,我想把数字放在船上。当我创建表时,它应该是空白的。然后会有按钮来添加数字。开头为每个不同的图自己的按钮

像这样的东西:

function addKing(idStr){
  cell =  document.getElementById(idStr);    
  if(cell != null){
  // works for color, doesn't work for images!!
  //  cell.style.backgroundColor = 'red';
      cell.src = 'http://akramar.byethost8.com/images/SplProg/DN3/images/50px/king_m.png'
  }
}

html中的按钮addKing:

<button id="king" onclick="addKing(prompt('Insert field'))">Add King</button>
  1. 如果我可以将所有代码放在一起并选择我喜欢插入的那个,则将previousu代码升级到更好(提示窗口1:什么数字:'king,queen,...',提示窗口2:你想在什么位置插入:'A1,B3,...'))。

    函数 addImage(类型,位置){ var img = ?? }

当我按下按钮添加图像时,应出现提示窗口并询问类型(国王,王后,根,...)和位置(A1,B4,...)(进一步更新甚至颜色(黑色或白色)但让我们一步一步构建)。

我想用javascript和dom构建所有的棋盘。

链接到不工作的例子:jsfiddle

4

5 回答 5

3

假设您只需要支持现代浏览器,则棋盘完全可以使用 CSS 使用计数器和生成的内容:

table {
    empty-cells: show;
}

td {
    width: 2em;
    height: 2em;
    line-height: 2em;
    text-align: center;
    border: 1px solid #000;
}

tbody tr:nth-child(odd) td:nth-child(even),
tbody tr:nth-child(even) td:nth-child(odd) {
    color: #fff;
    background-color: #00f;
}

tbody tr:nth-child(even) td:nth-child(even),
tbody tr:nth-child(odd) td:nth-child(odd) {
    background-color: #999;
}

tbody {
    counter-reset: rowNumber;
}

tr {
    counter-increment: rowNumber;
    counter-reset: cellNumber;
}

td {
    counter-increment: cellNumber;
}

td::before {
    content: counter(rowNumber, upper-alpha) counter(cellNumber, decimal);
}

JS 小提琴演示

以上在 Ubuntu 12.10 上的 Chromium 24 和 Firefox 19 中进行了测试。

对于 JavaScript 方法:

var chess = {
    createBoard: function (dimension) {
        if (!dimension || isNaN(dimension) || !parseInt(dimension, 10)) {
            return false;
        } else {
            dimension = typeof dimension === 'string' ? parseInt(dimension, 10) : dimension;
            var table = document.createElement('table'),
                tbody = document.createElement('tbody'),
                row = document.createElement('tr'),
                cell = document.createElement('td'),
                rowClone,
                cellClone;
            table.appendChild(tbody);
            for (var r = 0; r < dimension; r++) {
                rowClone = row.cloneNode(true);
                tbody.appendChild(rowClone);
                for (var c = 0; c < dimension; c++) {
                    cellClone = cell.cloneNode(true);
                    rowClone.appendChild(cellClone);
                }
            }
            document.body.appendChild(table);
            chess.enumerateBoard(table);
        }
    },
    enumerateBoard : function (board) {
        var rows = board.getElementsByTagName('tr'),
            text = document.createTextNode(),
            rowCounter,
            len,
            cells;
        for (var r = 0, size = rows.length; r<size; r++){
            rowCounter = String.fromCharCode(65 + r);
            cells  = rows[r].getElementsByTagName('td');
            len = cells.length;
            rows[r].className = r%2 == 0 ? 'even' : 'odd';
            for (var i = 0; i<len; i++){
                cells[i].className = i%2 == 0 ? 'even' : 'odd';
                cells[i].appendChild(text.cloneNode());
                cells[i].firstChild.nodeValue = rowCounter + i;
            }
        }
    }
};

chess.createBoard(10);

JS 小提琴演示

于 2013-03-26T23:39:41.910 回答
2

您可以将 ID 绑定到单元格,然后根据需要使用该 ID 来引用和更新背景。这是使用您的代码的一个示例:http: //jsfiddle.net/7Z6hJ

function CreateTable(){
            var poz = document.getElementById('space');

            // createing table adn inserting into document
            tab = document.createElement('table');
            poz.appendChild(tab);

            tab.border = '5';

            for (var i = 0; i < 8; i++){
                // creating row and inserting into document
                var row = tab.insertRow(i);

                for(var j = 0; j < 8; j++){
                    // creating cells and fill with data (numbers)
                    var cell = row.insertCell(j);
                    var idStr = String.fromCharCode(97 + i).toUpperCase() + (j+1);
                    cell.innerHTML = idStr;
                    cell.id = idStr;
                    cell.style.backgroundColor = 'blue';
                    cell.style.color = 'white';
                    cell.style.height = '50px';
                    cell.style.width = '50px';

                };
            };

        }
function updateRow(idStr)
{
    cell =  document.getElementById(idStr);    
    if(cell != null)
    {
        cell.style.backgroundColor = 'red';
    }
}

正如一些人所提到的,可能有更好的方法来解决这个问题(使用 css 和 jQuery 等),但这个答案与你迄今为止所拥有的一致。

于 2013-03-26T23:41:28.657 回答
1

在顶部循环中创建一个新变量以保存行的“字母”名称(例如 A、B、C)。

// creating row and inserting into document
var row = tab.insertRow(i);
var row_letter = String.fromCharCode(65 + i);

然后在第二个循环中结合行名和列号。

cell.innerHTML = row_letter + j;
于 2013-03-26T23:32:59.130 回答
1

Actually, you need to do some math for correctly coloring and adding labels. Here is the part of code for doing magic:

             1       cell.innerHTML = String.fromCharCode(65 + i) + (j + 1);
             2       if((i+j)%2){ cell.style.backgroundColor = 'white'; }
             3       else{ cell.style.backgroundColor = 'blue'; }
             4       cell.style.color = 'black';
             5       cell.style.height = '50px';
             6       cell.style.width = '50px';

Let me explain. In first line, you take constant 65, which is ASCII code for letter 'A'. While you change the letter by rows, you add i counter to it, so you get 65+0, 65+1, ..., 65+7. Their ASCII equivalents (which you get with String.fromCharCode()) are A, B, ..., H. Now when you have that letter, easily add number of cell to it (j + 1). You can remove '1' and leave just j and make inner loop go from 1 to 8.

Lines 2, 3: Colors are alternating - every second row have the same color. So, just test if is i+j dividable by 2.

For adding figure, you have to make some function that will do cell.innerHTML = <SOME IMAGE>. But, I guess, it's for second question.

Hope I helped you understand the logic.

于 2013-03-26T23:50:16.887 回答
0

如果有人正在寻找一种使用 JS 来可视化棋盘的方法(正如我正在做的那样并且不小心遇到了这个问题),那么这里有一个出色的JS 库来执行此操作。

它可以创建这样的东西

在此处输入图像描述

只需执行以下操作即可立即获得更多信息:

JavaScript

var ruyLopez = 'r1bqkbnr/pppp1ppp/2n5/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R';
var board = new ChessBoard('board', ruyLopez);

HTML

<div id="board" style="width: 400px"></div>
于 2013-11-24T11:15:43.390 回答