我正在编写简单的井字游戏来测试Minimax 算法。这个想法是这样的:在 xaml 中,我创建了一个大小约为窗口 3/4 的常规 Canvas,在其中绘制 3 x 3 按钮,结果如下:
此外,我这样做:当点击按钮时,如果点击次数是偶数,我画一个十字,否则在按钮中间画一个圆圈。这是代码:
private void BoardButton_Click(object sender, RoutedEventArgs e)
{
if (ClickCount > xDimension * yDimension) //3 * 3 = 9
throw new Exception(); //Всего 9 клеток, если кликнули 9 раз - все клетки заполнены
Button _clicked = sender as Button;
if (ClickCount % 2 == 0)
{
//Нарисовать крестик
}
else
{
Ellipse toDraw = CopyPlayer2Object; //Создает Ellipse со стандартными параметрами Width, Height, Stroke
//Нужно нарисовать круг так, чтобы его центр был центром кнопки
Canvas.SetLeft(toDraw, Canvas.GetLeft(_clicked) / 2);
Canvas.SetTop(toDraw, Canvas.GetTop(_clicked) / 2);
CurrentLocation.Children.Add(toDraw); //Мой Canvas
}
ClickCount++;
}
不幸的是,圆圈并没有绘制在按钮的中间,而且根本没有绘制在按钮本身中。告诉我如何画一个圆
PS 我对 WPF 的经验很少,所以欢迎提供有关如何使井字游戏的创建更方便以及井字游戏本身更漂亮的提示!

首先,让我们的领域成为正方形。简单的解决方案是写
(稍后会有更好的解决方案)。
现在,我们需要显示相同大小的单元格,为此它将执行
UniformGrid:现在,井字游戏本身。要绘制它们,最好将它们
Path与合适的几何形状一起使用。由于几何将被重用,我们将其放入资源中。几何体将自由拉伸,所以让我们将其设为单一尺寸。对于零,这很简单:
有了十字,就复杂一点了,我们来整理一下“乌龟图形”:
现在,让我们画出我们的
Button. 让我们缩进、拉伸几何图形并使线条更粗:我们得到类似这样的代码:
结果:
我们立即看到很多重复的代码需要扔进样式中。由于我们内部有控件,所以我们将它们放在
ContentTemplate. 他自己Content要么是X,要么O。现在按钮的样式很简单:
结果:
现在关于方形字段的问题。为什么原来的解决方案不太好?让我们看看调整窗口大小时它的行为:
在宽度太小的情况下,结果很难看。
如何处理?没有代码它不会工作,但你可以
AspectRatioDecorator从这里使用帮助类:我们得到这个结果:
我不喜欢上一张截图中的那个,当字段减少时,十字和零“崩溃”。他们的边界最好按比例减少。为此,我们将稍微更改几何形状,包括从边缘缩进 15%。
对于十字,很简单,在开头添加“spacers”:
对于零,您必须稍微修改一下。如果我们只是减小半径,什么都不会改变,因为我们仍然将它拉伸到按钮的整个宽度。因此,您必须放置一个单独的隐形垫片:
不要忘记
Padding从样式中删除!我们得到: