Long time no see

This commit is contained in:
2026-02-21 10:47:00 +07:00
parent 0d54fe176e
commit b7df98a55c
198 changed files with 3249 additions and 1 deletions
+32
View File
@@ -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
+50
View File
@@ -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;
}
+225
View File
@@ -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;
}
+69
View File
@@ -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;
}