Made logic a bit faster for boards with many columns

This commit is contained in:
AnnaSnoeijs 2025-06-06 21:31:59 +02:00
parent 07e65019bc
commit a6df3ae0dd
3 changed files with 28 additions and 16 deletions

View file

@ -166,7 +166,7 @@ int main( int argc, char *argv[] ){
move_t move = askMove(); move_t move = askMove();
int column = askColumn( playboard, move ); int column = askColumn( playboard, move );
playMove( &playboard, move, column ); playMove( &playboard, move, column );
calcWins( &wins, playboard ); calcWins( &wins, playboard, column );
updateBoard( wins, playboard, move, column ); updateBoard( wins, playboard, move, column );
} }
} }

35
logic.c
View file

@ -58,23 +58,24 @@ void playMove(
void calcWins( void calcWins(
wins_t *wins, wins_t *wins,
const board_t board const board_t board,
const int column
){ ){
// First the simplest win, the humble tower // First the simplest win, the humble tower
wins->count0.vertical = 0; wins->count0.vertical = 0;
wins->count1.vertical = 0; wins->count1.vertical = 0;
for( int i = 0; i < board.columns; i++ ){
// Check for lil towers // Check for lil towers
wins->same.vertical2 [ i ] = wins->same.vertical2 [ column ] =
~( board.column [ i ] ~( board.column [ column ]
^ board.column [ i ] >> 1 ) ^ board.column [ column ] >> 1 )
& safeHeightMask( board.height [ i ] - 1 ); & safeHeightMask( board.height [ column ] - 1 );
// Actually check for win // Actually check for win
wins->same.vertical4 [ i ] = wins->same.vertical4 [ column ] =
wins->same.vertical2 [ i ] wins->same.vertical2 [ column ]
& wins->same.vertical2 [ i ] >> 1 & wins->same.vertical2 [ column ] >> 1
& wins->same.vertical2 [ i ] >> 2; & wins->same.vertical2 [ column ] >> 2;
// Count 'em // Count 'em
for( int i = 0; i < board.columns; i++ ){
wins->count0.vertical += __builtin_popcount( wins->count0.vertical += __builtin_popcount(
wins->same.vertical4 [ i ] & ~board.column [ i ] wins->same.vertical4 [ i ] & ~board.column [ i ]
); );
@ -90,7 +91,11 @@ void calcWins(
wins->count0.diagonalDown = 0; wins->count0.diagonalDown = 0;
wins->count1.diagonalDown = 0; wins->count1.diagonalDown = 0;
// First connect 2 // First connect 2
for( int i = 0; i < board.columns - 1; i++ ){ for(
int i = top( column - 1, 0 );
i < bottom( column + 1, board.columns - 1 );
i++
){
wins->same.horizontal2 [ i ] = wins->same.horizontal2 [ i ] =
~( board.column [ i ] ~( board.column [ i ]
^ board.column [ i + 1 ] ) ^ board.column [ i + 1 ] )
@ -115,7 +120,11 @@ void calcWins(
& ~1; // A diagonal line down ain't starts at the floor innit? & ~1; // A diagonal line down ain't starts at the floor innit?
} }
// Then stitch the twos together and count // Then stitch the twos together and count
for( int i = 0; i < board.columns - 3; i++ ){ for(
int i = top( column - 3, 0 );
i < bottom( column + 1, board.columns - 3 );
i++
){
wins->same.horizontal4 [ i ] = wins->same.horizontal4 [ i ] =
wins->same.horizontal2 [ i ] wins->same.horizontal2 [ i ]
& wins->same.horizontal2 [ i + 1 ] & wins->same.horizontal2 [ i + 1 ]
@ -128,6 +137,8 @@ void calcWins(
wins->same.diagonalDown2 [ i ] wins->same.diagonalDown2 [ i ]
& wins->same.diagonalDown2 [ i + 1 ] << 1 & wins->same.diagonalDown2 [ i + 1 ] << 1
& wins->same.diagonalDown2 [ i + 2 ] << 2; & wins->same.diagonalDown2 [ i + 2 ] << 2;
}
for( int i = 0; i < board.columns - 3; i++ ){
wins->count0.horizontal += __builtin_popcount( wins->count0.horizontal += __builtin_popcount(
wins->same.horizontal4 [ i ] & ~board.column [ i ] wins->same.horizontal4 [ i ] & ~board.column [ i ]
); );

View file

@ -12,5 +12,6 @@ extern void playMove(
extern void calcWins( extern void calcWins(
wins_t *wins, wins_t *wins,
const board_t board const board_t board,
const int column
); );