使用数组作为棋盘,我如何编写一个可以检测可用移动的循环

时间:2017-11-07 01:23:07

标签: matlab chess

我正在使用MATLAB进行Hexapawn游戏(每个玩家有3个棋子的3 3乘棋盘游戏)。目前,我正在使用一个代表棋盘的数组(棋盘= [1 1 1; 0 0 0; 2 2 2];):

1 1 1

0 0 0

2 2 2

1代表球员1的棋子,0代表空位,2代表球员2的棋子。默认的国际象棋规则适用于这些棋子,他们只能向前移动一个空间,并且只能攻击与他们直接对角的棋子。我不确定如何编写一个循环,以便我可以根据他的棋子在棋盘上的位置通知用户他的可用动作。

我目前的代码在这里:

%% START OF GAME

start_input = input('Would you like to play a game of Hexapawn? Y/N : ', 's');
while strcmpi(start_input, 'Y') == 0 && strcmpi(start_input, 'N') == 0
    start_input = input('ERROR: PLEASE ANSWER WITH THE AVAILABLE RESPONSES : ', 's');
end

%% GAMEPLAY
if strcmpi(start_input, 'Y') == 1
    fprintf('\n')
    % CHESSBOARD BASIC
    chessboard = [1 1 1; 0 0 0; 2 2 2];
    disp(chessboard)


else
    fprintf('Goodbye!')
end

2 个答案:

答案 0 :(得分:1)

以下是您问题的部分答案。下面的函数将采用当前的板布局和给定的pawn。然后确定单个Pawn是否有可用移动。它将返回一个与电路板大小相符的逻辑矩阵

给定棋盘的示例检查左上方的棋子。

board = [1 1 1;...
         0 2 0;...
         2 0 2];
pawn = [1 0 0;...
        0 0 0;...
        0 0 0];
>> [availMoves] = checkMoves(board,pawn)

availMoves = 
    3x3 logical array
    0   0  0
    1   1  0
    0   0  0

所以你可以看到左上方的棋子可以直接向下或对角线移动以接收敌人。

示例:同一块棋盘,但检查中心的#2棋子:

pawn = [0 0 0;...
        0 2 0;...
        0 0 0];
>> [availMoves] = checkMoves(board,pawn)
availMoves = 
    3x3 logical array
    1   0  1
    0   0  0
    0   0  0

该棋子可以在对角线上移动......

所以使用这个功能你可以在棋盘上循环玩家的棋子,或者他们的每个棋子一起移动,然后看看返回的矩阵是否包含任何ex。 if ~any(availMoves);disp('You Lose!');end或类似的。

function [availMoves] = checkMoves(board,pawn)
%Check if a given pawn can move or not
%Returns a logical matrix the size of the board for that pawns moves.

%Init output    
availMoves = false(size(board));   

%Get Pawn in question's current r,c position
[pR,pC] = find(pawn);  

%Determine pawn's relative forward movement.  If pawn is a 1 then
%"forward" means increase row. IF pawn is a 2 then "forward" is a decrease.
fwdDir = (pawn(~pawn==0) == 1)*1 + (pawn(~pawn==0) == 2)*-1;

%At the edge already so no available moves. 
fwdR = pR+fwdDir;
if fwdR > 3 || fwdR <0
    return % Return all false.
end

%Pawn can step directly forward if empty.   
availMoves(fwdR,pC) = board(fwdR,pC) == 0;  %Space is empty 

%Get the # of the enemy pawn.  If current is 1 then enemy is 2 etc
enemyPawn = 2*(pawn(~pawn==0) == 1) + 1*(pawn(~pawn==0) == 2);

%Pawn can step diagonal if occupied by enemy. 
fwdC = [pC+1 pC-1];
fwdC(fwdC > 3 | fwdC <= 0) = []; %kill moves outside of the board
availMoves(fwdR,fwdC) = board(fwdR,fwdC) == enemyPawn;  %Space has enemy

答案 1 :(得分:0)

添加与棋盘大小相同的n个矩阵,每个矩阵显示一个可能的移动。也许就像当前数字的1和他可以移动到的3。

每次移动都可以通过获取当前数字的指数并检查他是否可以向上/向侧移动(只要他没有超出范围)来计算。我建议你用flipud镜像棋盘,这样你就可以对两个玩家使用相同的规则。