在WPF中创建国际象棋GUI

首先:道歉,如果这是一个重复的职位。 事情有点混乱,因为我试图同时发布/注册。

我开始研究从简单的WPF窗口运行UCI国际象棋引擎,得到了让国际象棋引擎在不同线程上运行的界面,并创建了一个合理的基于服务的文本前端。

我现在变得更加野心勃勃,并且想要开始构建一个带有棋子的GUI,它将把玩家的动作提供给国际象棋引擎,并代表引擎在棋盘上的移动。 我瞄准的是可拖曳的棋子,而不是点击方块。

我目前的尝试涉及在<canvas>元素上使用可拖动的用户控件。 我真的很想知道其他更有经验的WPF / .NET程序员会如何解决这个问题,因为我并不完全确信自己正处在正确的轨道上。

例如:使用统一网格并在子元素之间拖动块数据会更好吗? 我应该创建一个抽象的“棋子”类,从中可以派生出棋子这样的棋子吗? 那种事。

有什么想法吗? 这不是一项家庭作业或任何事情,只是我闲暇时候用作练习的东西。


我为我的Silverlight在线国际象棋系统实施了一个国际象棋棋盘。

这是我如何做到的。

  • 我为棋盘做了一个单独的用户控制
  • 我在控件上添加了一个8x8的网格
  • 然后,我添加64边框为每个不同的颜色着色(黑色方块和浅色方块)确保命名每一个。 使用Grid.Row和Grid.Col属性将每个边框放置在网格上。
  • 在每个边框内,我添加了一个可以放置棋子图像的图像。
  • 根据您当前的游戏状态,您必须编写一些方法来将图像设置为正确的棋子。
  • 每个图像收到相同的事件(这很重要),所有64个图像调用相同的代码:

    MouseLeftButtonDown =“Image_MouseLeftButtonDown”MouseMove =“Image_MouseMove”MouseLeftButtonUp =“Image_MouseLeftButtonUp”

  • 这3个事件背后的想法是,我们记录当我点击图像时(MouseLeftButtonDown),它让我成为点击的起源,然后当鼠标移动时我调用该事件,这允许我更新屏幕,因为该片是移动以及我放开鼠标按钮(MouseLeftButtonUp)时记录的最后一个事件,这可以让我获取目标并将移动发送到我的国际象棋引擎。 一旦移动被国际象棋引擎录制,我只需重新画一个棋盘即可。

    private void Image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        Image image = (Image)sender;
        Border border = (Border)image.Parent;
    
        image.CaptureMouse();
        isMouseCapture = true;
        mouseXOffset = e.GetPosition(border).X;
        mouseYOffset = e.GetPosition(border).Y;
    
        var chessPiece = (Image) sender;
        var chessSquare = (Border) chessPiece.Parent;
    
        var row = (byte) (Grid.GetRow(chessSquare));
        var column = (byte) (Grid.GetColumn(chessSquare) - 1);
    
        if (engine.HumanPlayer == ChessPieceColor.White)
        {
            SelectionChanged(row, column, false);
        }
        else
        {
            SelectionChanged((byte)(7 - row), (byte)(7 - column), false);
        }
    }
    

    SelectionChanged是我自己记录用户选择的信号源的方法。 isMouseCapture也是我自己的变量,用于在用户开始播放时录制。

    private void Image_MouseMove(object sender, MouseEventArgs e)
    {
    
        Image image = (Image)sender;
        Border border = (Border)image.Parent;
    
    
        if (!currentSource.Selected)
        {
            image.ReleaseMouseCapture();
            isMouseCapture = false;
    
            translateTransform = new TranslateTransform();
    
            translateTransform.X = 0;
            translateTransform.Y = 0;
    
            mouseXOffset = 0;
            mouseYOffset = 0;
        }
    
    
    
        if (isMouseCapture)
        {
            translateTransform = new TranslateTransform();
    
            translateTransform.X = e.GetPosition(border).X - mouseXOffset;
            translateTransform.Y = e.GetPosition(border).Y - mouseYOffset;
    
            image.RenderTransform = translateTransform;
    
            CalculateSquareSelected((int)translateTransform.X, (int)translateTransform.Y, false);
    
    
        }
    }
    

    在上面的CalculareSquareSelected将像素移动到我认为棋子移动到8x8棋盘上的位置。 例如,我说我移动了100个像素,棋盘正方形只有50个像素,比我移动了2个棋盘正方形。

    private void Image_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        if (translateTransform == null)
        {
            return;
        }
    
        Image image = (Image)sender;
    
        image.ReleaseMouseCapture();
        isMouseCapture = false;
    
        if (translateTransform.X > 10 || translateTransform.Y > 10 || translateTransform.X < -10 || translateTransform.Y < -10)
        {
            CalculateSquareSelected((int)translateTransform.X, (int)translateTransform.Y, true);
        }
        translateTransform = new TranslateTransform();
    
        translateTransform.X = 0;
        translateTransform.Y = 0;
    
        mouseXOffset = 0;
        mouseYOffset = 0;
    
        image.RenderTransform = translateTransform;
    
    }
    

    如果您有任何问题,请随时与我联系。

    链接地址: http://www.djcxy.com/p/2429.html

    上一篇: Creating chess GUI in WPF

    下一篇: Why can't I switch on a String?