Add move validation for pawns
This commit is contained in:
47
chess.c
47
chess.c
@@ -19,11 +19,11 @@
|
|||||||
#define BLACK -1
|
#define BLACK -1
|
||||||
|
|
||||||
int get_piece(char* str);
|
int get_piece(char* str);
|
||||||
void setcolor(int mode, int r, int g, int b);
|
void setcolor(const int mode, const int r, const int g, const int b);
|
||||||
void print_board(int* board);
|
void print_board(int* board);
|
||||||
void init_board(int* board);
|
void init_board(int* board);
|
||||||
void do_turn(int turn_no, int* board);
|
void do_turn(int turn_no, int* board);
|
||||||
|
int is_valid(int* board, const int from, const int to, const int player);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* main
|
* main
|
||||||
@@ -52,7 +52,7 @@ int main(){
|
|||||||
* - 1: change foreground
|
* - 1: change foreground
|
||||||
* - 2: reset colors
|
* - 2: reset colors
|
||||||
*/
|
*/
|
||||||
void setcolor(int mode, int r, int g, int b){
|
void setcolor(const int mode, const int r, const int g, const int b){
|
||||||
if( mode == 2 )
|
if( mode == 2 )
|
||||||
printf("\033[0m");
|
printf("\033[0m");
|
||||||
else
|
else
|
||||||
@@ -168,6 +168,12 @@ void do_turn(int turn_no, int* board){
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
to = tmp;
|
to = tmp;
|
||||||
|
|
||||||
|
if(!is_valid(board, from, to, turn_no%2?BLACK:WHITE )){
|
||||||
|
printf("bad value");
|
||||||
|
from = -1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
board[to] = board[from];
|
board[to] = board[from];
|
||||||
@@ -202,3 +208,38 @@ int get_piece(char *str){
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int is_valid(int* board, const int from, const int to, const int player){
|
||||||
|
int movedelta = (from - to) * player;
|
||||||
|
|
||||||
|
printf("attempting to move %lc to %lc\t%i", 0x2659 + board[from], 0x2659 + board[to], movedelta);
|
||||||
|
|
||||||
|
switch(board[from]){
|
||||||
|
case P: case -P:
|
||||||
|
switch(movedelta){
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 8:
|
||||||
|
if(board[to] == E)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 7: case 9:
|
||||||
|
if(board[to] * board[from] < 0)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 16:
|
||||||
|
if(board[to] == E && board[from - 8*player] == E && (from/8 == 1 || from/8 == 6 ))
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user