0

我正在尝试用 C# 构建一个 Checkers/Drafts 游戏。该项目是使用 Windows 窗体构建的。

我所做的是分解游戏板。所以我有一个“董事会”课程。和“BoardSquare”类(这个类在正确的位置和颜色绘制一个正方形)

该板由 8 X 8 BoardSquare 构建。

我想到了这个方案,方块需要知道它是否为空,如果它不为空则意味着它上面有一个“GameSoldier”。

因此,当我想将士兵移动到另一个方格时,我需要单击当前方格以获取 GameSoldier,然后按下目标方格。

所以我想做的是在 BoardSquare 类中添加鼠标功能来获取正方形的属性,比如位置。有任何想法吗?

4

3 回答 3

1

单击板时,您可以从 EventArgs 中获取光标的坐标。要将这些坐标转换为板上的正方形,您必须跨行从左上角到右下角布置图块,并将它们存储在索引列表或数组中。

然后 X 坐标(在“tiles”中)是Math.Floor(X_Clicked / TileWidth)

Y坐标是Math.Floor(Y_Clicked / TileHeight)

例如,如果您的图块是 50 像素宽和 50 像素高,并且用户点击 (329, 186) 这将是图块:

329 / 50 = 6,58 = 6

186 / 50 = 3,72 = 3

单击 (6, 3) 处的图块。要将其转换为列表/数组中的索引:

x + (y * tiles_in_a_row) = 6 + (3 * 8) = 30,所以 Tile[30] 被点击了。

请记住,这是一个从零开始的坐标系,因此第一个图块位于 (0, 0)。

于 2013-02-20T15:53:46.530 回答
1

有几种方法可以解决这个问题,您的 boardsquare 课程可能会妨碍简单的课程,因为它会集中注意力。

当你点击一个被占用的棋盘格时,它的鼠标事件就会触发。它在板上的位置可以通过它的顶部/高度和左侧/宽度来识别,然后您可以将其传递给板上定义的 BoardSquareSelected 事件处理程序。当您单击未占用的正方形鼠标位置时,x / 正方形宽度,y / 正方形高度您需要更多的逻辑来确定第一次单击被占用,第二次不是合法移动等。您也可以查看拖放导数。但就我个人而言,我会摆脱 boardsquare 作为一个组件。如果 board 有一个 8x8 的正方形数组,并且您使用 Invalidate(rect) 来避免在任何更改时重新绘制整个事物,那么您实际上并不需要它。然后,您所有的选择内容都完全由 board 类封装。

于 2013-02-20T15:55:42.690 回答
0

您要做的是为您正在渲染的控件的 MouseClick 事件添加一个 Eventhandler。在该事件的 EventArgs 中,您将能够检索鼠标坐标。然后,您可以将该信息与控件本身的大小相结合,以计算单击了哪个方块。

以下是更多信息:

在 DoubleClick 事件上获取鼠标点击的位置/按钮

(尤其是穆斯的回答)

于 2013-02-20T15:50:13.300 回答