Long time no see
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
#ifndef HEAD
|
||||
#define HEAD
|
||||
|
||||
// LIBC
|
||||
#include <stdio.h>
|
||||
#include <limits.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
// DEFINE
|
||||
#define CHARS_IN_INPUT_MAX 40
|
||||
|
||||
// TYPEDEF
|
||||
typedef struct{
|
||||
unsigned char currCol;
|
||||
unsigned char currRow;
|
||||
unsigned char nextCol;
|
||||
unsigned char nextRow;
|
||||
unsigned char whosTurn;
|
||||
}__TURN;
|
||||
|
||||
// FUNC
|
||||
// === === io.c === ===
|
||||
char input_(char *_input, char *charsInInput);
|
||||
void print_board(char* _board);
|
||||
|
||||
// === === logic.c === ===
|
||||
char match_turn(char currFigure,char whosTurn);
|
||||
char match_move(char _board[8][8],__TURN* __turn,char currFigure);
|
||||
void move(char _board[8][8],__TURN *__turn);
|
||||
int abs(int n);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,50 @@
|
||||
#include "head.h"
|
||||
|
||||
char input_(char *_input, char *charsInInput){
|
||||
|
||||
// INPUT
|
||||
do{
|
||||
*charsInInput = 0;
|
||||
char ch;
|
||||
while((ch=getchar())>' '&&*charsInInput<CHARS_IN_INPUT_MAX){
|
||||
*(_input+*charsInInput)=ch;
|
||||
(*charsInInput)++;
|
||||
}
|
||||
if(ch<= 4)return -1;
|
||||
if(*_input>= '0' && *_input<='9'){
|
||||
for(int i = 0;i<*charsInInput;i++)
|
||||
putchar(_input[i]);
|
||||
putchar(' ');
|
||||
continue;}
|
||||
if((*_input>= 'A' && *_input<='A'+7) ||
|
||||
(*_input>= 'a' && *_input<='a'+7)||
|
||||
(*_input=='N'||*_input=='Q'||*_input=='R'||*_input=='K'||*_input=='P')){
|
||||
for(int i = 0;i<*charsInInput;i++)
|
||||
putchar(_input[i]);
|
||||
putchar('\n');
|
||||
break;}
|
||||
|
||||
}while(*_input>4);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void print_board(char* _board){
|
||||
for (int i = 0;i<8;i++){
|
||||
putchar('8'-i);
|
||||
putchar(' ');
|
||||
for(int j = 0;j<8;j++){
|
||||
putchar(_board[i*8+j]);
|
||||
putchar(' ');
|
||||
}
|
||||
putchar('\n');
|
||||
}
|
||||
putchar(' ');putchar(' ');
|
||||
for(int i = 0; i<8;i++){
|
||||
putchar('a'+i);
|
||||
putchar(' ');
|
||||
}
|
||||
putchar('\n');
|
||||
putchar('\n');
|
||||
return;
|
||||
}
|
||||
@@ -0,0 +1,225 @@
|
||||
#include "head.h"
|
||||
|
||||
|
||||
char match_turn(char currFigure,char whosTurn){
|
||||
if((currFigure>='a' && currFigure<='z' && whosTurn-1)
|
||||
// a-z white && turn !white
|
||||
||(currFigure>='A' && currFigure<='Z' && whosTurn)){
|
||||
// A-Z black && turn white
|
||||
printf("Err, turn missmatch");
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
char match_move(char board[8][8], __TURN* turn, char currFigure)
|
||||
{
|
||||
int rowD = turn->nextRow - turn->currRow;
|
||||
int colD = turn->nextCol - turn->currCol;
|
||||
|
||||
if (turn->nextRow < 0 || turn->nextRow > 7 ||
|
||||
turn->nextCol < 0 || turn->nextCol > 7)
|
||||
{
|
||||
printf("Err, move out of board\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
switch (currFigure)
|
||||
{
|
||||
case 'P':
|
||||
case 'p':
|
||||
{
|
||||
int dir = (currFigure == 'P') ? -1 : 1;
|
||||
|
||||
if (colD == 0)
|
||||
{
|
||||
if (board[turn->nextRow][turn->nextCol] != ' ')
|
||||
return 1;
|
||||
|
||||
if (rowD == dir)
|
||||
return 0;
|
||||
|
||||
if ((currFigure == 'P' && turn->currRow == 6 && rowD == 2*dir &&
|
||||
board[turn->currRow + dir][turn->currCol] == ' ') ||
|
||||
(currFigure == 'p' && turn->currRow == 1 && rowD == 2*dir &&
|
||||
board[turn->currRow + dir][turn->currCol] == ' '))
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (abs(colD) == 1 && rowD == dir)
|
||||
{
|
||||
if (board[turn->nextRow][turn->nextCol] != ' ')
|
||||
return 0;
|
||||
}
|
||||
|
||||
printf("Err, pawn move mismatch\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
case 'R':
|
||||
case 'r':
|
||||
{
|
||||
if (rowD != 0 && colD != 0)
|
||||
{
|
||||
printf("Err, rook move mismatch\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (rowD == 0)
|
||||
{
|
||||
int step = (colD > 0) ? 1 : -1;
|
||||
for (int c = turn->currCol + step;
|
||||
c != turn->nextCol;
|
||||
c += step)
|
||||
{
|
||||
if (board[turn->currRow][c] != ' ')
|
||||
{
|
||||
printf("Err, rook blocked\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int step = (rowD > 0) ? 1 : -1;
|
||||
for (int r = turn->currRow + step;
|
||||
r != turn->nextRow;
|
||||
r += step)
|
||||
{
|
||||
if (board[r][turn->currCol] != ' ')
|
||||
{
|
||||
printf("Err, rook blocked\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
case 'N':
|
||||
case 'n':
|
||||
{
|
||||
if ((abs(rowD) == 2 && abs(colD) == 1) ||
|
||||
(abs(rowD) == 1 && abs(colD) == 2))
|
||||
return 0;
|
||||
printf("Err, knight move mismatch\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
case 'B':
|
||||
case 'b':
|
||||
{
|
||||
if (abs(rowD) != abs(colD))
|
||||
{
|
||||
printf("Err, bishop move mismatch\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
int stepR = (rowD > 0) ? 1 : -1;
|
||||
int stepC = (colD > 0) ? 1 : -1;
|
||||
int r = turn->currRow + stepR;
|
||||
int c = turn->currCol + stepC;
|
||||
|
||||
while (r != turn->nextRow && c != turn->nextCol)
|
||||
{
|
||||
if (board[r][c] != ' ')
|
||||
{
|
||||
printf("Err, bishop blocked\n");
|
||||
return 1;
|
||||
}
|
||||
r += stepR;
|
||||
c += stepC;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
case 'Q':
|
||||
case 'q':
|
||||
{
|
||||
if (abs(rowD) == abs(colD))
|
||||
{
|
||||
int stepR = (rowD > 0) ? 1 : -1;
|
||||
int stepC = (colD > 0) ? 1 : -1;
|
||||
|
||||
int r = turn->currRow + stepR;
|
||||
int c = turn->currCol + stepC;
|
||||
|
||||
while (r != turn->nextRow && c != turn->nextCol)
|
||||
{
|
||||
if (board[r][c] != ' ')
|
||||
{
|
||||
printf("Err, queen blocked\n");
|
||||
return 1;
|
||||
}
|
||||
r += stepR;
|
||||
c += stepC;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (rowD == 0 || colD == 0)
|
||||
{
|
||||
if (rowD == 0)
|
||||
{
|
||||
int step = (colD > 0) ? 1 : -1;
|
||||
for (int c = turn->currCol + step;
|
||||
c != turn->nextCol;
|
||||
c += step)
|
||||
{
|
||||
if (board[turn->currRow][c] != ' ')
|
||||
{
|
||||
printf("Err, queen blocked\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int step = (rowD > 0) ? 1 : -1;
|
||||
for (int r = turn->currRow + step;
|
||||
r != turn->nextRow;
|
||||
r += step)
|
||||
{
|
||||
if (board[r][turn->currCol] != ' ')
|
||||
{
|
||||
printf("Err, queen blocked\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
printf("Err, queen move mismatch\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
case 'K':
|
||||
case 'k':
|
||||
{
|
||||
if (abs(rowD) <= 1 && abs(colD) <= 1)
|
||||
return 0;
|
||||
printf("Err, king move mismatch\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void move(char board[8][8], __TURN *turn)
|
||||
{
|
||||
board[turn->nextRow][turn->nextCol] =
|
||||
board[turn->currRow][turn->currCol];
|
||||
|
||||
board[turn->currRow][turn->currCol] = ' ';
|
||||
|
||||
turn->whosTurn = turn->whosTurn == 0 ? 1 : 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int abs(int n){
|
||||
n = n<0 ? n*-1:n;
|
||||
return n;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
#include "head.h"
|
||||
|
||||
|
||||
int main()
|
||||
{
|
||||
char _board[8][8];
|
||||
{ //Set Def desk
|
||||
char _cleanDesk[] = {"rnbqkbnrpppppppp"};
|
||||
for(int i = 0;i<8;i++)
|
||||
for(int j = 0;j<8;j++)
|
||||
_board[i][j] = ' ';
|
||||
for (int i = 0; i < 2;i++)
|
||||
for(int j = 0; j <8;j++)
|
||||
_board[i][j] = _cleanDesk[i*8+j];
|
||||
for (int i = 6; i < 8;i++)
|
||||
for(int j = 0; j < 8;j++)
|
||||
_board[i][j] = i==6? (_cleanDesk[8+j])-32 : (_cleanDesk[j])-32;
|
||||
print_board(*_board);
|
||||
}
|
||||
|
||||
char charsInInput=1;
|
||||
char _input[CHARS_IN_INPUT_MAX];
|
||||
__TURN __turn;
|
||||
__turn.whosTurn = 0; // 0 - white 1 - black
|
||||
while(charsInInput>0){
|
||||
if (input_(_input,&charsInInput)) return 0;
|
||||
unsigned char ptr;
|
||||
{//Turn info
|
||||
ptr = (*_input>='A'&&*_input<='Z')?3:2; // Qe2-e4
|
||||
__turn.currCol = _input[ptr-2]-'a';
|
||||
__turn.currRow = 8-(_input[ptr-1]-'0');
|
||||
__turn.nextCol = _input[ptr+1]-'a';
|
||||
__turn.nextRow = 8-(_input[ptr+2]-'0');
|
||||
}
|
||||
|
||||
{//Rules
|
||||
char currFigure = _board[__turn.currRow][__turn.currCol];
|
||||
{ // 'Q'e2-e5 Missmatch
|
||||
if(ptr==3)
|
||||
if(*_input!=currFigure&&*_input!=currFigure-32){
|
||||
printf("Err, figure missmatch");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
if(match_turn(currFigure,__turn.whosTurn))return 1;
|
||||
|
||||
{ // TAKE MISMATCH
|
||||
if
|
||||
((_board[__turn.nextRow][__turn.nextCol]!=' ' && _input[ptr]!='x'
|
||||
)||(
|
||||
_board[__turn.nextRow][__turn.nextCol]==' ' && _input[ptr]=='x'))
|
||||
{
|
||||
printf("Err, take missmatch");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
if(match_move(_board,&__turn,currFigure))return 1;
|
||||
}
|
||||
|
||||
move(_board,&__turn);
|
||||
print_board(*_board);
|
||||
if(_input[charsInInput-1]=='#')break;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user