first draft (HAS BUGS, DOES NOT WORK)

This commit is contained in:
Odweta
2026-02-18 18:16:56 +01:00
parent b40d016e67
commit 51ff3b37d8
6 changed files with 55 additions and 15 deletions
+8 -8
View File
@@ -1,12 +1,11 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include "chess.h" #include "chess.h"
#include "util.h" #include "util.h"
void init_board(board_t *board) { void init_board(board_t board) {
for (int i = 0; i < BOARD_VERTICAL; i++) { for (int i = 0; i < BOARD_VERTICAL; i++) {
for (int j = 0; j < BOARD_HORIZONTAL; j++) { for (int j = 0; j < BOARD_HORIZONTAL; j++) {
*board[i][j] = BOARD_DEFAULT_CONFIG[i][j]; board[j][i] = BOARD_DEFAULT_CONFIG[i][j];
} }
} }
} }
@@ -52,10 +51,9 @@ bool is_move_in_bounds(move_t move) {
} }
bool get_move(move_t *move) { bool get_move(move_t *move) {
clear_stdin();
char _x_from, _x_to; char _x_from, _x_to;
int _y_from, _y_to; int _y_from, _y_to;
printf("move >> ");
scanf(" %c%d %c%d", scanf(" %c%d %c%d",
&_x_from, &_x_from,
&_y_from, &_y_from,
@@ -202,11 +200,11 @@ bool check_captures(board_t *board, player_e player, captured_t *captured, move_
if (is_dest_opponent(*board, player, move)) { if (is_dest_opponent(*board, player, move)) {
switch (player) { switch (player) {
case WHITE: case WHITE:
captured->white[captured->white_n++] = abs(*board[move.to.y][move.to.x]); captured->white[captured->white_n++] = *board[move.to.y][move.to.x];
*board[move.to.y][move.to.x] = NONE; *board[move.to.y][move.to.x] = NONE;
break; break;
case BLACK: case BLACK:
captured->white[captured->white_n++] = abs(*board[move.to.y][move.to.x]); captured->white[captured->white_n++] = *board[move.to.y][move.to.x];
*board[move.to.y][move.to.x] = NONE; *board[move.to.y][move.to.x] = NONE;
break; break;
} }
@@ -378,7 +376,9 @@ end_condition_e check_end(board_t board, player_e player, move_t move) {
} }
end_condition_e perform_move(board_t *board, player_e player, captured_t *captured, move_t move) { end_condition_e perform_move(board_t *board, player_e player, captured_t *captured, move_t move) {
if (validate_move(*board, player, move)) { bool valid = validate_move(*board, player, move);
printf("move valid? %d", valid);
if (valid) {
if ( if (
*board[move.to.y][move.to.x] != WKING || // accounting for both players *board[move.to.y][move.to.x] != WKING || // accounting for both players
*board[move.to.y][move.to.x] != BKING // you cannot capture a king *board[move.to.y][move.to.x] != BKING // you cannot capture a king
+4 -4
View File
@@ -21,8 +21,6 @@
// type abstractions // type abstractions
typedef enum { WHITE, BLACK } player_e; typedef enum { WHITE, BLACK } player_e;
typedef int board_t[BOARD_VERTICAL][BOARD_HORIZONTAL];
#define PIECE_COUNT 13 // how many unique pieces are there #define PIECE_COUNT 13 // how many unique pieces are there
#define MAX_PIECE_MOVE_COUNT 27 // the max possible num of options where to move in one moment #define MAX_PIECE_MOVE_COUNT 27 // the max possible num of options where to move in one moment
typedef enum { typedef enum {
@@ -43,6 +41,8 @@ typedef enum {
BKING BKING
} piece_e; } piece_e;
typedef piece_e board_t[BOARD_VERTICAL][BOARD_HORIZONTAL];
typedef struct { typedef struct {
int x; int x;
int y; int y;
@@ -95,7 +95,7 @@ typedef struct {
* absolute x,y values -> e.g. the rook can move * absolute x,y values -> e.g. the rook can move
* up, down, left, right * n -> and then bounds & edge cases are checked * up, down, left, right * n -> and then bounds & edge cases are checked
*/ */
#define DEFAULT_VALID_MOVES (valid_move_t[PIECE_COUNT]){\ #define DEFAULT_VALID_MOVES {\
{NONE, {}, 0},\ {NONE, {}, 0},\
\ \
{WPAWN, {\ {WPAWN, {\
@@ -169,7 +169,7 @@ typedef struct {
} captured_t; } captured_t;
// initializes the board with the default configuration of pieces // initializes the board with the default configuration of pieces
void init_board(board_t *board); void init_board(board_t board);
// selects the player to currently play // selects the player to currently play
// if it is the first round, it selects white // if it is the first round, it selects white
+5 -1
View File
@@ -1,7 +1,9 @@
// a chess implementation in pure C :) // a chess implementation in pure C :)
#include "chess.h" #include "chess.h"
#include "render.h"
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h>
/** /**
* steps to victory: * steps to victory:
@@ -27,7 +29,7 @@ int main() {
// algo begin // algo begin
init_board(&board); init_board(board);
show_help(); show_help();
@@ -36,6 +38,8 @@ int main() {
select_player(&player, round_count); select_player(&player, round_count);
show_board(board, player);
get_move(&move); get_move(&move);
end_condition = perform_move(&board, player, &captured, move); end_condition = perform_move(&board, player, &captured, move);
+28
View File
@@ -0,0 +1,28 @@
#include "render.h"
#include "chess.h"
#include <stdio.h>
void show_board(board_t board, player_e player) {
printf("\n ");
for (int i = 0; i < BOARD_HORIZONTAL; i++) {
printf("%-2c ", i+97);
}
printf("\n\n");
for (int i = 0; i < BOARD_VERTICAL; i++) {
printf("%-2d [", i+1);
for (int j = 0; j < BOARD_HORIZONTAL-1; j++) {
printf("%-2d ", board[j][i]);
}
printf("%d]\n", board[BOARD_HORIZONTAL-1][i]);
}
printf("\ncurrently plays: ");
switch (player) {
case WHITE:
printf("WHITE\n");
break;
case BLACK:
printf("BLACK\n");
break;
}
}
+8
View File
@@ -0,0 +1,8 @@
#ifndef RENDER_H
#define RENDER_H
#include "chess.h"
void show_board(board_t board, player_e player);
#endif // RENDER_H
+1 -1
View File
@@ -2,7 +2,7 @@
#include <stdio.h> #include <stdio.h>
void clear_stdin() { void clear_stdin() {
while (getchar() != '\n'); while ((getchar()) != '\n');
} }
bool is_int_in_range(int x, int start, int end) { bool is_int_in_range(int x, int start, int end) {