A little app to simulate every possible move in Connect Four.
1#pragma once
2
3#include <cassert>
4#include <stdint.h>
5
6const uint8_t NUM_ROWS = 6;
7const uint8_t NUM_COLUMNS = 7;
8const uint8_t NUM_TO_WIN = 4;
9const uint8_t MIN_FULL_COLUMN = 0b01000000;
10const uint8_t MAX_FULL_COLUMN = 0b01111111;
11typedef uint64_t binary_board;
12
13const uint8_t NUM_COLUMNS_PROCESSED = (uint8_t)sizeof(binary_board);
14
15typedef uint8_t BoardState[NUM_COLUMNS];
16
17void init_board(BoardState state);
18void init_core();
19int8_t make_move(uint8_t player, uint8_t column, BoardState state);
20
21struct MakeMoveResult
22{
23 int8_t row;
24 uint8_t column_state;
25};
26
27const uint8_t MAKE_MOVE_TABLE_PARTIAL_SIZE = MIN_FULL_COLUMN;
28const uint8_t MAKE_MOVE_TABLE_FULL_SIZE = MAX_FULL_COLUMN + 1;
29
30extern MakeMoveResult make_move_table_partial[2][MAKE_MOVE_TABLE_PARTIAL_SIZE];
31extern MakeMoveResult make_move_table_full[2][MAKE_MOVE_TABLE_FULL_SIZE];
32
33inline int8_t make_move_lookup_partial(uint8_t player, uint8_t column, BoardState state)
34{
35 assert(column >= 0 && column < NUM_COLUMNS);
36
37 if (state[column] >= MAKE_MOVE_TABLE_PARTIAL_SIZE)
38 return -1;
39
40 MakeMoveResult result = make_move_table_partial[player][state[column]];
41 state[column] = result.column_state;
42 return result.row;
43}
44
45inline int8_t make_move_lookup_full(uint8_t player, uint8_t column, BoardState state)
46{
47 assert(column >= 0 && column < NUM_COLUMNS);
48
49 MakeMoveResult result = make_move_table_full[player][state[column]];
50 state[column] = result.column_state;
51 return result.row;
52}
53
54bool check_for_win(BoardState state, uint8_t last_move_player, uint8_t last_move_row, uint8_t last_move_col);
55bool check_for_win(BoardState state);
56void get_move_scores(int64_t final_scores[NUM_COLUMNS]);
57void sprint_board(BoardState state, char* buffer);
58void print_board(BoardState state);