Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 反向有效移动检查器_Matlab - Fatal编程技术网

Matlab 反向有效移动检查器

Matlab 反向有效移动检查器,matlab,Matlab,我一直在做一项作业,要求我在matlab中重新创建reversi 我遇到了一个转折点,在这个转折点上,如果不将代码段转换为线性索引,我就无法找出如何执行代码段 基本上,我需要做的是找到一种方法,将方向向量(即[1;0]垂直)添加到我已经存在的game_状态向量中,以便找到上面的数据块 function legal = legalMove() d_l = [0, -1]; d_r = [0, 1]; d_u = [-1, 0]; d_d = [1, 0]; d_ul = [-1, -1];

我一直在做一项作业,要求我在matlab中重新创建reversi

我遇到了一个转折点,在这个转折点上,如果不将代码段转换为线性索引,我就无法找出如何执行代码段

基本上,我需要做的是找到一种方法,将方向向量(即[1;0]垂直)添加到我已经存在的game_状态向量中,以便找到上面的数据块

    function legal = legalMove()
d_l = [0, -1];
d_r = [0, 1];
d_u = [-1, 0];
d_d = [1, 0];
d_ul = [-1, -1];
d_ur = [-1, 1];
d_dl = [1, -1];
d_dr = [1, 1];
directions = [d_l d_ul d_u d_ur d_r d_dr d_d d_dl];
valid_moves = zeros(8,8);

for ci = 1:8
    for cj = 1:8
        if game_state(ci,cj) == 0   %check element = 0 before continuing
                for count = 1:8
                    d = directions(count);
                    selected = 
                    while selected == player_number * -1 %while the selected piece is of enemy type

                          %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

                         else
                         end
                    end
                end

        else
        end
    end
end
   end
我接下来的第二个问题是实际的循环本身。 虽然我认为可以使用While循环来确定是否保持当前方向,但我自己似乎无法找到一种方法

任何协助都将不胜感激


谢谢你的时间

方向
更改为包含字符串的单元格数组:

...
directions = { 'd_l' 'd_ul' 'd_u' 'd_ur' 'd_r' 'd_dr' 'd_d' 'd_dl' };
...
然后代码的下一部分将是这样的(填空!):


如果我正确地理解了您正在努力解决的问题,那么您只需执行类似于
sel_I=ci+directions(1,count)的操作即可
,然后类似于
sel_j
,并检查
sel_i
sel_j
是否在电路板的范围内。当OP已经在矩阵中的方向由
count
索引时,为什么要为此使用
eval
和单元格数组?此外,在检查
ti
tj
是否在范围内之前,您的代码访问
gamestate
。@wakjah 1)当OP执行
directions=[d_l d_u d_ur d_r d_d_d_dl]时,他得到1x16大小的向量。当然,可以在不使用
eval
的情况下对该向量进行索引,但也不能不丢失OP所隐含的一些语义。我想保留他的
dul
duul
等变量的含义。若我想写一个更干净的解决方案,我会完全删除那个些,但我想会混淆OP。2) 我认为解决方案在检查
ti
tj
之前不会访问
gamestate
。上述代码中有两个点上的检查。您可能错过了第一个?实际上,当我尝试使用它时,一旦完成,它将返回错误“未定义的函数'eval'用于'cell'类型的输入参数”。裁判员/legalMove(第204行)中的错误d=eval(方向(计数));裁判员/buttonPress(第85行)中的错误legal=legalMove();计算uicontrol回调时出错”有什么想法吗?佐兰,有没有办法在评论区之外联系你?
for count = 1:8
    d = eval( directions{count} );
    ti = ci+d(1);
    tj = cj+d(2);

    % Check if out of the board
    ...

    % Number of enemy pieces you went over
    cnt = 0;
    selected = gamestate(ti, tj)  

    % Move while going over enemy pieces
    while selected == player_number * -1
        ti = ti + d(1);
        tj = tj + d(2);
        selected = gamestate(ti, tj);

        % Check if out of the board
        ...

        % Count pieces you went over
        cnt = cnt + 1;
    end

    % Check if you moved over enemy pieces & whether you landed on your piece
    ...

end