Made logic a bit faster for boards with many columns
This commit is contained in:
parent
07e65019bc
commit
a6df3ae0dd
3 changed files with 28 additions and 16 deletions
|
|
@ -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 );
|
||||
}
|
||||
}
|
||||
|
|
|
|||
35
logic.c
35
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;
|
||||
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 );
|
||||
wins->same.vertical2 [ column ] =
|
||||
~( board.column [ column ]
|
||||
^ board.column [ column ] >> 1 )
|
||||
& safeHeightMask( board.height [ column ] - 1 );
|
||||
// Actually check for win
|
||||
wins->same.vertical4 [ i ] =
|
||||
wins->same.vertical2 [ i ]
|
||||
& wins->same.vertical2 [ i ] >> 1
|
||||
& wins->same.vertical2 [ i ] >> 2;
|
||||
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++ ){
|
||||
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 ]
|
||||
);
|
||||
|
|
|
|||
3
logic.h
3
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
|
||||
);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue