From a6df3ae0dd73db228fdee2af67253644362a6112 Mon Sep 17 00:00:00 2001 From: AnnaSnoeijs Date: Fri, 6 Jun 2025 21:31:59 +0200 Subject: [PATCH] Made logic a bit faster for boards with many columns --- connect4.c | 2 +- logic.c | 39 +++++++++++++++++++++++++-------------- logic.h | 3 ++- 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/connect4.c b/connect4.c index 536c327..dd75c83 100644 --- a/connect4.c +++ b/connect4.c @@ -166,7 +166,7 @@ int main( int argc, char *argv[] ){ move_t move = askMove(); int column = askColumn( playboard, move ); playMove( &playboard, move, column ); - calcWins( &wins, playboard ); + calcWins( &wins, playboard, column ); updateBoard( wins, playboard, move, column ); } } diff --git a/logic.c b/logic.c index 8651e2b..456c98f 100644 --- a/logic.c +++ b/logic.c @@ -58,23 +58,24 @@ void playMove( void calcWins( wins_t *wins, - const board_t board + const board_t board, + const int column ){ // First the simplest win, the humble tower wins->count0.vertical = 0; wins->count1.vertical = 0; + // Check for lil towers + wins->same.vertical2 [ column ] = + ~( board.column [ column ] + ^ board.column [ column ] >> 1 ) + & safeHeightMask( board.height [ column ] - 1 ); + // Actually check for win + wins->same.vertical4 [ column ] = + wins->same.vertical2 [ column ] + & wins->same.vertical2 [ column ] >> 1 + & wins->same.vertical2 [ column ] >> 2; + // Count 'em for( int i = 0; i < board.columns; i++ ){ - // Check for lil towers - wins->same.vertical2 [ i ] = - ~( board.column [ i ] - ^ board.column [ i ] >> 1 ) - & safeHeightMask( board.height [ i ] - 1 ); - // Actually check for win - wins->same.vertical4 [ i ] = - wins->same.vertical2 [ i ] - & wins->same.vertical2 [ i ] >> 1 - & wins->same.vertical2 [ i ] >> 2; - // Count 'em wins->count0.vertical += __builtin_popcount( wins->same.vertical4 [ i ] & ~board.column [ i ] ); @@ -90,7 +91,11 @@ void calcWins( wins->count0.diagonalDown = 0; wins->count1.diagonalDown = 0; // 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 ] = ~( board.column [ i ] ^ board.column [ i + 1 ] ) @@ -115,7 +120,11 @@ void calcWins( & ~1; // A diagonal line down ain't starts at the floor innit? } // 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.horizontal2 [ i ] & wins->same.horizontal2 [ i + 1 ] @@ -128,6 +137,8 @@ void calcWins( wins->same.diagonalDown2 [ i ] & wins->same.diagonalDown2 [ i + 1 ] << 1 & wins->same.diagonalDown2 [ i + 2 ] << 2; + } + for( int i = 0; i < board.columns - 3; i++ ){ wins->count0.horizontal += __builtin_popcount( wins->same.horizontal4 [ i ] & ~board.column [ i ] ); diff --git a/logic.h b/logic.h index 744f01c..ccf712d 100644 --- a/logic.h +++ b/logic.h @@ -12,5 +12,6 @@ extern void playMove( extern void calcWins( wins_t *wins, - const board_t board + const board_t board, + const int column );