A little app to simulate every possible move in Connect Four.
at main 1.8 kB view raw
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);