当前位置: 首页 > 知识库问答 >
问题:

如何在D3中画棋盘?

顾鸣
2023-03-14

我想在D3中画一个棋盘:

我会满足于仅仅能够画出初始的游戏位置(如上)。

可能不需要king、queen、knight等的图像文件(有12个不同的部分),因为它们都是Unicode的一部分,作为代码点2654-265f:

Unicode字符出现在任何现代浏览器中:

这是一个很好的例子

这是一个很好的例子

任何指示或帮助将非常感谢。

共有1个答案

麹浩瀚
2023-03-14

这是解决方案的代码。

所有棋子的枚举类型定义:

var pieces = {
    NONE :          {name: "None",          code: " "}, 
    WHITE_KING :    {name: "White King",    code: "\u2654"}, 
    WHITE_QUEEN :   {name: "White Queen",   code: "\u2655"}, 
    WHITE_ROOK :    {name: "White Rook",    code: "\u2656"}, 
    WHITE_BISHOP :  {name: "White Bishop",  code: "\u2657"}, 
    WHITE_KNIGHT :  {name: "White Knight",  code: "\u2658"}, 
    WHITE_POWN :    {name: "White Pown",    code: "\u2659"}, 
    BLACK_KING :    {name: "Black King",    code: "\u265A"}, 
    BLACK_QUEEN :   {name: "Black Queen",   code: "\u265B"}, 
    BLACK_ROOK :    {name: "Black Rook",    code: "\u265C"}, 
    BLACK_BISHOP :  {name: "Black Bishop",  code: "\u265D"}, 
    BLACK_KNIGHT :  {name: "Black Knight",  code: "\u265E"}, 
    BLACK_POWN :    {name: "Black Pown",    code: "\u265F"}, 
};    

板初始化:

    var board =[];

    for(var i = 0; i < boardDimension*boardDimension; i++) {
        board.push({
            x: i % boardDimension,
            y: Math.floor(i / boardDimension),
            piece: pieces.NONE
        });
    };

    board[0].piece = pieces.BLACK_ROOK
    board[1].piece = pieces.BLACK_KNIGHT
    board[2].piece = pieces.BLACK_BISHOP
    board[3].piece = pieces.BLACK_QUEEN
    board[4].piece = pieces.BLACK_KING
    board[5].piece = pieces.BLACK_BISHOP
    board[6].piece = pieces.BLACK_KNIGHT
    board[7].piece = pieces.BLACK_ROOK

    board[8].piece = pieces.BLACK_POWN
    board[9].piece = pieces.BLACK_POWN
    board[10].piece = pieces.BLACK_POWN
    board[11].piece = pieces.BLACK_POWN
    board[12].piece = pieces.BLACK_POWN
    board[13].piece = pieces.BLACK_POWN
    board[14].piece = pieces.BLACK_POWN
    board[15].piece = pieces.BLACK_POWN

    board[6*8 + 0].piece = pieces.WHITE_POWN
    board[6*8 + 1].piece = pieces.WHITE_POWN
    board[6*8 + 2].piece = pieces.WHITE_POWN
    board[6*8 + 3].piece = pieces.WHITE_POWN
    board[6*8 + 4].piece = pieces.WHITE_POWN
    board[6*8 + 5].piece = pieces.WHITE_POWN
    board[6*8 + 6].piece = pieces.WHITE_POWN
    board[6*8 + 7].piece = pieces.WHITE_POWN

    board[7*8 + 0].piece = pieces.WHITE_ROOK
    board[7*8 + 1].piece = pieces.WHITE_KNIGHT
    board[7*8 + 2].piece = pieces.WHITE_BISHOP
    board[7*8 + 3].piece = pieces.WHITE_QUEEN
    board[7*8 + 4].piece = pieces.WHITE_KING
    board[7*8 + 5].piece = pieces.WHITE_BISHOP
    board[7*8 + 6].piece = pieces.WHITE_KNIGHT
    board[7*8 + 7].piece = pieces.WHITE_ROOK
    svg.append("rect")
         .style("class", "fields")
         .style("class", "rects")
         .attr("x", function (d) {
             return d.x*fieldSize;
         })
         .attr("y", function (d) {
             return d.y*fieldSize;
         })
         .attr("width", fieldSize + "px")
         .attr("height", fieldSize + "px")
         .style("fill", function (d) {
             if ( ((d.x%2 == 0) && (d.y%2 == 0)) ||
                  ((d.x%2 == 1) && (d.y%2 == 1))    ) 
                 return "beige";
             else
                 return "tan";
         });

绘图片,使用Unicode字符:

    svg.append("text")
        .attr("x", function (d) {
            return d.x*fieldSize;
        })
        .attr("y", function (d) {
            return d.y*fieldSize;
        })
        .style("font-size", "40")
        .attr("text-anchor", "middle")
        .attr("dy", "35px")
        .attr("dx", "20px")
        .text(function (d) {
            return d.piece.code;
         })
        .append("title")
        .text(function(d) {
            return d.piece.name;
        });
 类似资料:
  • 我正在使用在固定深度工作的alpha-beta修剪算法对Chess AI进行编程。我相当惊讶地看到,通过将AI设置为更高的深度,它玩得更糟。但我认为我想通了为什么会这样。 它目前是这样工作的:所有的职位都被列出来了,对于每个职位,其他的职位都会被列出来,以此类推。。。直到达到固定深度:通过检查存在哪些工件,并为每种工件类型设置一个值来评估电路板。然后,使用带有alpha-beta的minimax算

  • 上面的代码显示了一个可以上下移动的部分的示例。这不是一个有效的棋步。所以,如果我要移动一个皇后,我该怎么做呢?我们只是假设我们已经有了一个矩阵(x,y)8×8的板。

  • 我有一条使用绘制的垂直线。假设我想像条形码一样重复一行几次。我该怎么做呢? 我知道这必须使用来完成,但我不知道如何做。 建议将非常有用。 小提琴 这是代码: 提前感谢。

  • 问题内容: 我一直在尝试在Node.js中调用D3。我首先尝试使用脚本标签从D3的网站导入d3.v2.js D3的作者建议一个人应该“ npm install d3” …我做到了,我可以在节点控制台中成功调用它: 但是,当尝试使用“ node app.js”从app.js调用它时,我得到: 我意识到,D3的作者在其他地方已经明确规定了应该使用画布: https://github.com/mbost

  • 我目前正在进行一个小型家谱实验,并希望实现一个简单的家谱,如下图所示。 到目前为止,最好的搜索结果只产生了子节点只能有父节点的示例。但是我需要的是在实体之间创建链接(从父亲到母亲)以及节点和其他链接之间的链接(从孩子到父亲-母亲链接)的能力。目前我没有固定的数据模式。 我选择d3.js是因为它看起来能够完成这项工作。我只是不知道如何甚至从哪里开始。关于d3.js的教程只涵盖像条形图这样的标准图表。

  • 我正在使用Python Chess在Python中使用NegaScout实现一个国际象棋引擎。我发现了一个方便的函数它反转棋盘,使黑色为白色,反之亦然。这对于Negamax和NegaScout来说是必不可少的。但是,这会删除移动堆栈。我可以手动反转移动堆栈中的所有移动,将其复制到列表中,反转每个移动并将其分配回翻转的棋盘,但是否有更简单的方法来做到这一点?我需要自树的基础(文本移动)以来的位置的完