我在c++中制作了一个逆转游戏,但我很难弄清楚如何检查连续的敌人棋盘棋子,一旦玩家将他们的棋子放在棋盘上。
板是一个8x8的2D数组,值为0、-1或1。
- -1是白色的,
- 1为黑色块,
- 0为空单元格。
函数ApplyMove将简单地将当前玩家的棋子放在棋盘上,并检查是否在任何方向上都有敌人的棋子。然后它会把所有的碎片朝那个方向翻转。
我的函数将有这些参数:
void ApplyMove(char board[BOARD_SIZE][BOARD_SIZE], int row, int col, char currentPlayer)
我希望程序使用循环从玩家放置的片段开始,遍历所有8个可能的方向。如何在没有一堆"如果"one_answers"其他"的情况下,以尽可能简单的方式完成这一任务?
一种让我觉得简单的方法是使用变量xoffset
和yoffset
,它们的值为1,0,-1。对这些变量的值使用for
循环,然后使用while
循环来跟踪连续的片段。
问得好!
我建议你首先考虑如何确切地你决定一个棋子是否应该翻转。在你的八个方向中,你可以在你的棋子和第一个相同颜色的棋子之间翻转任何一个相反颜色的棋子,如果在你到达那个棋子之前有任何空白的地方,就不要翻转任何一个。(请注意,这是一种非常方便的方法,即使在两种颜色之间有0块相反的情况下,因为你会翻转"全部为0";它们。)
当你使用+/- 1时,你也可以做一些很酷的事情——检查值的乘积,看看颜色是否匹配(+1)或不匹配(-1),或者翻转标记乘以-1。
这个概念的快速模型,我们检查选项的行,以及确保我们不离开板-我使用!=
不等于,以防你不熟悉:
set current_player // +1 or -1
set current_space // say [3, 4]
directions = [[-1, -1], [-1, 0], ...]
for direction in directions:
spaces_away = 1
check_space = direction*spaces_away + current_space
while (check_space has values between 1 and 8 for both x and y) and (check_space != 0)
if current_player * (direction*spaces_away + current_space) = -1
spaces_away += 1 // add one so we can check the next space out
check_space = direction*spaces_away + current_space
else
for i from 1 to spaces_away
flip_space = direction*spaces_away + current_space
flip_space * -1 // this will change the color
这里有一些实现需要考虑,主要是我忽略了如何为64个空格中的每个分配-1,0或1。希望没有这个,伪代码已经足够清晰了。
如果for direction in directions
没有意义,请花点时间查找可迭代对象是什么。超级有用的概念,不管你在这里做什么!