1

このようなチェス盤を作ろうとしています。

ここに画像の説明を入力

テーブルを作成しましたが、色を付ける方法がわかりません。また、ボード名 (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. すべてをまとめて、挿入したいものを選択できる場合は、以前のコードをさらに良くアップグレードします(プロンプトウィンドウ1:どの図:「キング、クイーン、...」、プロンプトウィンドウ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

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 に答える
1

行の「文字」名 (例: A、B、C) を保存するために、一番上のループ内に新しい変数を作成します。

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

次に、2 番目のループで行名と列番号を結合します。

cell.innerHTML = row_letter + j;
于 2013-03-26T23:32:59.130 に答える
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 に答える