【问题标题】:Chess Logic in XNAXNA 中的国际象棋逻辑
【发布时间】:2009-12-01 22:09:09
【问题描述】:

所以我使用 XNA 库创建了一个包含所有棋子的 2D 棋盘。但是,如果我单击它们,我不知道如何使它们移动。这就是我对其中一件骑士棋子的逻辑所拥有的。

if(mouse.LeftButton == ButtonState.Pressed 
      && mouse.X == wknight1.position.X 
      && mouse.Y == wknight1.position.Y)
{
}

如何选择棋子然后让它移动?

【问题讨论】:

    标签: c# xna chess


    【解决方案1】:

    我对 XNA 并不特别熟悉,但我会给出一些建议。一方面,您可能希望将片段保存在 2D 数组或类似数组中,而不是将它们放在自己的变量中(如 wknight1)。否则,您必须在用户每次点击时检查每个变量。

    我假设您想要一个系统,其中用户单击一块以选择它,然后单击一个空方块将其移动到那里。这里有一些类似的伪代码(我在这里使用空板位置来表示空方格):

    if(mouse.LeftButton == ButtonState.Pressed
      && board[mouse.x][mouse.y] != null && pieceSelected == null)
    {
        pieceSelected = board[mouse.x][mouse.y];
        selectedX = mouse.x;
        selectedY = mouse.y
    }
    else if (mouse.LeftButton == ButtonState.Pressed
      && board[mouse.x][mouse.y] == null && pieceSelected != null)
    {
        board[selectedX][selectedY] == null;
        board[mouse.x][mouse.y] = pieceSelected;
        pieceSelected = null;
    }
    

    您可以添加更多条件,例如 isAValidMove(pieceType, startx, starty, finishx, finishy) 以检查玩家是否正在尝试移动自己的棋子并且这是合法的国际象棋移动等。您可能会做得更多优雅和面向对象(和/或事件驱动)(并添加点击和拖动等),但我保持简单以说明基本逻辑。

    【讨论】:

    • 我如何设置二维数组来保存所有的碎片?我有所有的精灵图像。
    • 该数组实际上并不包含碎片的图像或其他任何东西,它包含对碎片的逻辑引用(无论是像“white_knight”这样的字符串,还是自定义的 Piece 对象,甚至只是一个数字)。然后你可以通过看板数组知道如何渲染图形板。基本上,棋盘数组是游戏状态的逻辑模型,图形显示是该游戏状态的视图。您应该尽量避免过多地混淆模型和视图 - 将它们分开将便于以后进行更改。
    猜你喜欢
    • 2022-06-17
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 2016-07-06
    相关资源
    最近更新 更多