1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
#include "board.hpp"
#include <cassert>
#include <cctype>
#include <cstdio>
#include <iostream>
#include <print>
#include <string>
char toChar(pieceType type) {
switch (type) {
case NONE:
return '.';
case PAWN:
return 'P';
case KNIGHT:
return 'N';
case BISHOP:
return 'B';
case ROOK:
return 'R';
case QUEEN:
return 'Q';
case KING:
return 'K';
default:
std::cout << "\n" << type << "\n";
assert(false && "Unknown piece" && type);
return '?';
}
}
Piece createPiece(pieceType type, bool color, bool moved) {
Piece piece;
piece.type = type;
piece.color = color;
piece.moved = moved;
return piece;
};
void printBoard(Board *b) {
std::string line = " +-----------------+\n";
std::string whiteLetters = " a b c d e f g h\n";
std::string blackLetters = " h g f e d c b a\n";
std::cout << (b->turn ? whiteLetters : blackLetters);
std::cout << line;
if (b->turn) {
for (int rank = 0; rank < 8; rank++) {
std::printf("%d |", 8 - rank);
for (int file = 0; file < 8; file++) {
Piece piece = b->pieces[rank * 8 + file];
char symbol = toChar(piece.type);
if (!piece.color)
symbol = std::tolower(static_cast<unsigned char>(symbol));
std::printf(" %c", symbol);
}
std::printf(" | %d\n", 8 - rank);
}
} else {
for (int rank = 7; rank >= 0; rank--) {
std::printf("%d |", 8 - rank);
for (int file = 7; file >= 0; file--) {
Piece piece = b->pieces[rank * 8 + file];
char symbol = toChar(piece.type);
if (!piece.color)
symbol = std::tolower(static_cast<unsigned char>(symbol));
std::printf(" %c", symbol);
}
std::printf(" | %d\n", 8 - rank);
}
}
std::cout << line;
std::cout << (b->turn ? whiteLetters : blackLetters);
std::println();
std::println("Turn: {}", b->turn ? "White" : "Black");
assert(b->castle != "");
std::println("Castling: {}", b->castle);
}
void PlayMove(Move move, Board *b) {
// TODO: add all fide behavior
Piece piece = b->pieces[PositionToIndex(move.From)];
Piece piece2 = b->pieces[PositionToIndex(move.To)];
if (piece2.type != NONE) {
if (piece2.color == b->turn) {
assert(false && "capturing friendly piece error");
}
}
b->pieces[PositionToIndex(move.To)] = piece;
b->pieces[PositionToIndex(move.From)] = {false, NONE, false};
return;
}
int PositionToIndex(Position i) { return i.rank * 8 + i.file; }
|