我正在创建一个 2P Connect 4 游戏,但我似乎无法让圆形区域均匀地放置令牌。
这是初始化每个圆的位置的代码:
POINT tilePos;
for (int i = 0; i < Board::Dims::MAXX; ++i)
{
tileXY.push_back (std::vector<POINT> (Board::Dims::MAXY)); //add column
for (int j = 0; j < Board::Dims::MAXY; ++j)
{
tilePos.x = boardPixelDims.left + (i + 1./2) * (boardPixelDims.width / Board::Dims::MAXX);
tilePos.y = boardPixelDims.top + (j + 1./2) * (boardPixelDims.height / Board::Dims::MAXY);
tileXY.at (i).push_back (tilePos); //add circle in column
}
}
我使用POINT
s,的 2D 向量tileXY
来存储位置。回想一下,棋盘宽 7 圈,高 6 圈。
我的逻辑是,第一个圆圈(对于 X)从以下位置开始:
left + width / #circles * 0 + width / #circles / 2
width / #circles
并且每次都增加,这对于较小数量的圆圈很容易描绘。
后来,我画了这样的圆圈:
for (const std::vector<POINT> &col : _tileXY)
{
for (const POINT pos : col)
{
if (g.FillEllipse (&red, (int)(pos.x - CIRCLE_RADIUS), pos.y - CIRCLE_RADIUS, CIRCLE_RADIUS, CIRCLE_RADIUS) != Gdiplus::Status::Ok)
MessageBox (_windows.gameWindow, "FillEllipse failed.", 0, MB_SYSTEMMODAL);
}
}
这些循环遍历向量的每个元素,并用红色绘制每个圆圈(此时突出)。int 转换是为了消除函数调用的歧义。刷后的前两个参数是左上角,CIRCLE_RADIUS
是50。
问题是我的电路板看起来像这样(对不起,如果它有点伤害你的眼睛):
正如你所看到的,这些圆圈太左太高了。它们也太小了,但这很容易解决。我尝试将一些整数更改为双精度数,但最终以这是我最接近真实模式的结果。位置的扩展公式(扩展 (i + 1./2))看起来也一样。
我错过了一个小细节,还是我背后的整个逻辑都没有?
编辑: 根据要求,类型:
tilePos.x
: POINT (windows API一,使用的类型是LONG)
boardPixelDims.*
: double
Board::Dims::MAXX/MAXY
: 枚举值(整数,分别包含7和6)