Visual Studio 在C++翻转游戏中寻找其他棋子

cyvaqqii  于 2022-12-14  发布在  其他
关注(0)|答案(2)|浏览(110)

我正在用C++制作一个Reversi游戏,但我很难弄清楚一旦玩家将自己的棋子放在棋盘上,如何检查连续的敌方棋盘棋子。
电路板是一个8x8 2D数组,值为0、-1或1。

  • -1是白色,
  • 1是黑色棋子,
  • 0是空单元格。

函数ApplyMove只会将当前玩家的棋子放到棋盘上,并检查是否有敌人的棋子在任何方向上移动。然后它会将所有的棋子都朝那个方向翻转。
我的函数将具有以下参数:

void ApplyMove(char board[BOARD_SIZE][BOARD_SIZE], int row, int col, char currentPlayer)

我希望程序使用循环遍历从玩家放置的棋子开始的所有8个可能的方向。如果没有一堆if和elses,如何以最简单的方式完成这一任务?

mw3dktmi

mw3dktmi1#

我认为一个简单的方法是使用变量xoffsetyoffset,它们的值为1、0、-1。对这些变量的值使用for循环,然后使用while循环来跟踪连续的片段。

smdncfj3

smdncfj32#

问得好!
我建议你从思考如何决定一个棋子是否应该翻转开始。在你的八个方向中的任何一个方向上,你翻转你的棋子和第一个相同颜色的棋子之间的任何相反颜色的棋子,如果在到达该棋子之前还有空格,则不要翻转任何棋子。(请注意,这是一种非常方便的方法,即使是在两个颜色之间有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没有意义,花点时间看看什么是可迭代的。无论你在这里做什么,这个概念都非常有用!
祝你好运!

相关问题