summaryrefslogtreecommitdiff
path: root/board.h
blob: a714de0b7b5c9db491532537f77774c3c85a5110 (plain)
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
#pragma once

#include <iostream>
#include <vector>
#include "move.h"

using namespace std;


const int WHITE = 0;
const int BLACK = 1;

const int EMPTY = 0, PAWN = 1, ROOK = 2, KNIGHT = 3, BISHOP = 4, KING = 5, QUEEN = 6;

// WHITE WHITE WHITE  y = 0
// ...
// ...
// BLACK BLACK BLACK  y = 7


#define IDX(x_, y_) (8 * (y_) + (x_))


class Board {
	int bd[64];  // 0 = empty, >0 = white, <0 = black

public:
	int pieceScore[2];  // captured points by player
	int lastTarget;  // destination of last move
	int onTurn;  // colour of player to move
	bool kingMoved[2], rookLmoved[2], rookRmoved[2];

	Board();

	template <typename F>  // void(Board&)
	inline Board newWith(const F &func) const {
		Board B(*this);
		func(B);
		return B;
	}

	inline int& at(int x, int y) {return at(IDX(x, y));}
	inline int& at(int idx) {return bd[idx];}
	inline int at(int x, int y) const {return at(IDX(x, y));}
	inline int at(int idx) const {return bd[idx];}

	int locate(int stone) const;

	static inline int colour(int stone) {return stone > 0 ? WHITE : BLACK;}

	static inline int worth(int stone) {
		static const int w[7] = {0, 1, 5, 3, 3, 100000000, 9};
		if (stone < -6 || stone > 6) __asm("int3\n\t");
		return w[abs(stone)];
	}

	vector<Board> subsequents() const;

	void apply(const Move &mv);  // does not perform checking

	bool isValid(const Move &mv);

	friend bool operator==(const Board &B1, const Board &B2);
};

ostream& operator<<(ostream &os, const Board &B);
bool operator==(const Board &B1, const Board &B2);