-1

我有一个任务,我需要使用 8x8 矩阵在 MATLAB 中重新制作游戏Reversi / Othello,其中黑色为 1,白色为-1,并具有功能性 GUI。

我已经能够自己完成 GUI 等操作,但是当我达到只需要允许有效移动的地步时,我就有点卡住了。

我很好奇你们中是否有人知道可以做到这一点的方法,因为我遇到了障碍。基本上我需要从中心点扫描矩阵的所有 8 个方向,并在一行中找到一个有效的 player_number*-1 组合,以 player_number 结尾(其中 player_number 是当前玩家轮到的),但我不确定如何做到这一点。

棋盘上的每个位置都使用 [i,j] 的常规定位系统,并在数组 game_state 中找到。

4

2 回答 2

1

假设性能不是问题,这里有一个算法:

For each empty gap
   for each direction
      move as long as you find your opponents stones
         if you found at least 1 opponent stone and you end up on your own stone
            then the current empty gap is a legal move

至于方向,您只需要一个坐标变化列表,这些变化对应于每个方向的移动,例如,可能看起来像这样:

direction_left = [0; -1]; % zero rows, -1 columns
direction_up = ...;
direction_right = ...; 
... you fill in the rest

然后,您可以通过将它们连接成方向矩阵来构建完整列表

directions = [direction_left direction_up ....]; % you fill in the rest

当然,如果这在代码中的多个地方使用,你应该将它构建到一个函数中。

于 2013-06-04T08:23:22.947 回答
0

我不是 100% 确定我记得黑白棋的规则,但对于它的价值,这里有一个建议

currentPlayer = -1 ; % this should be either +1 or -1 depending on whose turn it is
board; % 8x8 matrix of 0 (unused) +/-1 (occupied positions)
candidateMovesMask = ( board == 0 ) & ( imdilate( board == -CurrentPlayer, true(3) ) );
[r c] = find( candidateMovesMask );

一个简短的解释:

imdilate( board == -CurrentPlayer, true(3) )

true在每个对手的棋子旁边创建一个二进制掩码。将此掩码(使用逻辑和&)与所有空位(board == 0)相交会为您提供所有候选移动的掩码。
最后,find( candidateMovesMask )返回每个候选移动的行/列。

您仍然需要检查候选动作并找出其中哪一个确实是合法的动作。

于 2013-06-04T08:05:45.157 回答