2017-11-07 16 views
2

저는 현재 MATLAB을 사용하여 Hexapawn (3 x 3 체스 보드 게임과 각 3 플레이어의 포니 게임) 게임을하고 있습니다. 현재, I는 체스를 나타내는 배열을 사용하고 (체스 = [1 1 1 0 0 0 2 2 2) :배열을 체스 보드로 사용하면 사용 가능한 동작을 감지하는 루프를 코딩 할 수 있습니다.

1 1 1

0 0 0

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 
+0

사람들이 당신을 더 잘 안내 할 수 있도록 실제 코드를 게시 할 수 있습니다. – Brett

+0

@Brett 오, 내 잘못입니다. –

답변

0

추가 N 행렬. 어쩌면 현재의 모습이 1 인 곳, 그리고 그가 움직일 수있는 곳과 같을 것입니다.

각 이동은 현재 숫자의 색인을 가져 와서 그가 위쪽/옆쪽으로 이동할 수 있는지 (범위를 벗어나지 않는 한) 계산할 수 있습니다. 체스 판을 flipud으로 미러링 해 두 사람 모두에게 똑같은 규칙을 적용 할 것을 제안합니다.

1

여기에 귀하의 질문에 대한 부분적인 대답이 나와 있습니다. 아래 함수는 현재 게시판 배열과 주어진 폰을 사용합니다. 그런 다음 해당 단일 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 

그 폰이 대각선으로 이동 할 수 있습니다 ...이 기능 그래서

당신이 할 수있는 플레이어의 폰을 통해 루프 보드에서 또는 각각의 폰이 함께 움직이고, 반환 된 행렬에 이전 문자가 포함되어 있는지 확인합니다. 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