summaryrefslogtreecommitdiff
path: root/chess.c
diff options
context:
space:
mode:
authorKaiStevenson <kai@kaistevenson.com>2022-12-06 22:16:12 -0800
committerKaiStevenson <kai@kaistevenson.com>2022-12-06 22:16:12 -0800
commit7ef39a806620b05555125f4fdb99889442a4d6e3 (patch)
tree9a0da2f851f9d70536635a4ec1599d301750665a /chess.c
parente8e00b9eb6e3979dd1066fc3a73f39565e8ec9cf (diff)
separated code into multiple files
Diffstat (limited to 'chess.c')
-rw-r--r--chess.c192
1 files changed, 3 insertions, 189 deletions
diff --git a/chess.c b/chess.c
index 7464497..13145f9 100644
--- a/chess.c
+++ b/chess.c
@@ -1,121 +1,10 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include "vector.h"
+#include "console.h"
+#include "chesshelpers.h"
-#define ANSI_COLOR_RED "\x1b[31m"
-#define ANSI_COLOR_GREEN "\x1b[32m"
-#define ANSI_COLOR_YELLOW "\x1b[33m"
-#define ANSI_COLOR_BLUE "\x1b[34m"
-#define ANSI_COLOR_MAGENTA "\x1b[35m"
-#define ANSI_COLOR_CYAN "\x1b[36m"
-#define ANSI_COLOR_RESET "\x1b[0m"
-
-typedef enum {
- pawn = 1,
- knight = 2,
- bishop = 3,
- rook = 4,
- queen = 5,
- king = 6,
-} piece_t;
-typedef struct Vector {
- int mx;
- int my;
-} vector_t;
-vector_t init_vector(int mx, int my) {
- vector_t vector;
- vector.mx = mx;
- vector.my = my;
- return vector;
-}
-typedef struct VectorP {
- vector_t* vectors;
- int length;
-} vectorp_t;
-vectorp_t init_vectorp(vector_t* vectors, int length) {
- vectorp_t vectorP;
- vectorP.vectors = vectors;
- vectorP.length = length;
- return vectorP;
-}
-void draw_board(int board[8][8]) {
- printf(" A B C D E F G H\n");
- int tileColor = 1;
- for(int r = 0; r < 8; r++) {
- tileColor = !tileColor;
- char* line = calloc(2 + (8 * 10), sizeof(char));
- line[0] = '8' - r;
- line[1] = ' ';
- for(int c = 0; c < 8; c++) {
- tileColor = !tileColor;
- strcat(line, tileColor == 0 ? ANSI_COLOR_RED : ANSI_COLOR_RESET);
- if(board[c][r] <= 6) {
- switch(board[c][r]) {
- case 0:
- strcat(line, "# ");
- break;
- case pawn:
- strcat(line, "P ");
- break;
- case knight:
- strcat(line, "N ");
- break;
- case bishop:
- strcat(line, "B ");
- break;
- case rook:
- strcat(line, "R ");
- break;
- case queen:
- strcat(line, "Q ");
- break;
- case king:
- strcat(line, "K ");
- break;
- }
- }
- else {
- switch(board[c][r] - 6) {
- case pawn:
- strcat(line, "p ");
- break;
- case knight:
- strcat(line, "n ");
- break;
- case bishop:
- strcat(line, "b ");
- break;
- case rook:
- strcat(line, "r ");
- break;
- case queen:
- strcat(line, "q ");
- break;
- case king:
- strcat(line, "k ");
- break;
- }
- }
- }
- printf(line);
- printf("\n" ANSI_COLOR_RESET);
- free(line);
- }
-}
-int in_board(vector_t position) {
- return position.mx < 8 && position.mx >= 0 && position.my < 8 && position.my >= 0;
-}
-int is_empty(int board[8][8], vector_t position) {
- return board[position.mx][position.my] == 0;
-}
-int is_color(int board[8][8], vector_t position, int color) {
- if(color == 0) {
- return board[position.mx][position.my] >= 1 && board[position.mx][position.my] <= 6;
- }
- else {
- return board[position.mx][position.my] >= 7;
- }
-}
vectorp_t get_pawn_moves(int board[8][8], vector_t position, int color) {
vector_t* moves = malloc(6 * sizeof(vector_t));
int moveCount = 0;
@@ -283,81 +172,6 @@ vectorp_t get_moves(int board[8][8], vector_t position, piece_t piece) {
return get_queen_moves(board, position, color);
}
}
-vector_t user_input_pos() {
- char* inputString = malloc(3 * sizeof(char));
- vector_t pos;
- printf("Enter coordinates: ");
- scanf("%2s", inputString);
- for(int i = 0; i < 2; i++) {
- if(inputString[i] <= '9' && inputString[i] >= '0') {
- pos.my = 8 - (inputString[i] - '0');
- }
- else if(inputString[i] <= 'Z' && inputString[i] >= 'A') {
- pos.mx = inputString[i] - 'A';
- }
- else if(inputString[i] <= 'z' && inputString[i] >= 'a') {
- pos.mx = inputString[i] - 'a';
- }
- else {
- return init_vector(-1, -1);
- }
- }
- free(inputString);
- return pos;
-}
-//converts board coordinates into algebraic notation
-char* get_readable_coords(vector_t position) {
- char* output = malloc(3 * sizeof(char));
- output[0] = 'a' + position.mx;
- output[1] = '8' - position.my;
- output[2] = '\0';
- return output;
-}
-//gets the proper algebraic notation for the move
-char* get_move_name(int board[8][8], vector_t origin, vector_t end) {
- int piece = board[origin.mx][origin.my];
- if(piece > 6) {
- piece -= 6;
- }
- if(piece != 1) {
- char cPiece = piece == pawn ? 'P' : piece == knight ? 'N' : piece == bishop ? 'B' : piece == rook ? 'R' : piece == queen ? 'Q' : 'K';
- int isCapture = board[end.mx][end.my] != 0;
- char* output = calloc(isCapture ? 5 : 4, sizeof(char));
- output[0] = cPiece;
- if(isCapture) {
- output[1] = 'x';
- }
- char* rEnd = get_readable_coords(end);
- strcat(output, rEnd);
- free(rEnd);
- output[isCapture ? 4 : 3] = '\0';
- return output;
- }
- else {
- int isCapture = board[end.mx][end.my] != 0;
- char* output = calloc(isCapture ? 5 : 3, sizeof(char));
- if(isCapture) {
- output[0] = 'a' + origin.mx;
- output[1] = 'x';
- }
- char* rEnd = get_readable_coords(end);
- strcat(output, rEnd);
- free(rEnd);
- output[isCapture ? 4 : 2] = '\0';
- return output;
- }
-}
-void clear_screen() {
- system("@cls||clear");
-}
-void warn_user(char* message) {
- clear_screen();
- printf("\n");
- printf(message);
- printf("\nPress any key to continue...\n");
- while(getchar() != '\n');
- getchar();
-}
int main() {
int board[8][8] = {
{ rook + 6, pawn + 6, 0, 0, 0, 0, pawn, rook },