Module Name: src Committed By: rillig Date: Sat May 28 08:09:22 UTC 2022
Modified Files: src/games/gomoku: makemove.c Log Message: gomoku: split makemove into smaller functions No functional change. To generate a diff of this commit: cvs rdiff -u -r1.30 -r1.31 src/games/gomoku/makemove.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/games/gomoku/makemove.c diff -u src/games/gomoku/makemove.c:1.30 src/games/gomoku/makemove.c:1.31 --- src/games/gomoku/makemove.c:1.30 Sat May 28 07:58:35 2022 +++ src/games/gomoku/makemove.c Sat May 28 08:09:22 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: makemove.c,v 1.30 2022/05/28 07:58:35 rillig Exp $ */ +/* $NetBSD: makemove.c,v 1.31 2022/05/28 08:09:22 rillig Exp $ */ /* * Copyright (c) 1994 @@ -34,7 +34,7 @@ #include <sys/cdefs.h> /* @(#)makemove.c 8.2 (Berkeley) 5/3/95 */ -__RCSID("$NetBSD: makemove.c,v 1.30 2022/05/28 07:58:35 rillig Exp $"); +__RCSID("$NetBSD: makemove.c,v 1.31 2022/05/28 08:09:22 rillig Exp $"); #include "gomoku.h" @@ -61,6 +61,33 @@ is_tie(void) return true; } +static void +sortframes_remove(struct combostr *cbp) +{ + + if (cbp->c_next == NULL) + return; + + if (sortframes[BLACK] == cbp) + sortframes[BLACK] = cbp->c_next; + if (sortframes[WHITE] == cbp) + sortframes[WHITE] = cbp->c_next; + cbp->c_next->c_prev = cbp->c_prev; + cbp->c_prev->c_next = cbp->c_next; +} + +static int +old_weight_value(const struct spotstr *sp, int r) +{ + union comboval cb; + int val = 0; + if ((cb = sp->s_fval[BLACK][r]).s <= 0x500) + val += weight[5 - cb.cv_force - cb.cv_win]; + if ((cb = sp->s_fval[WHITE][r]).s <= 0x500) + val += weight[5 - cb.cv_force - cb.cv_win]; + return val; +} + /* * Return values: * MOVEOK everything is OK. @@ -91,32 +118,17 @@ makemove(int us, int mv) for (int r = 4; --r >= 0; ) { /* for each direction */ int d = dd[r]; struct spotstr *fsp = &board[mv]; - int bmask = BFLAG << r; for (int f = 5; --f >= 0; fsp -= d) { /* for each frame */ if (fsp->s_occ == BORDER) goto nextr; - if ((fsp->s_flags & bmask) != 0) + if ((fsp->s_flags & BFLAG << r) != 0) continue; - /* remove this frame from the sorted list of frames */ struct combostr *cbp = fsp->s_frame[r]; - if (cbp->c_next != NULL) { - if (sortframes[BLACK] == cbp) - sortframes[BLACK] = cbp->c_next; - if (sortframes[WHITE] == cbp) - sortframes[WHITE] = cbp->c_next; - cbp->c_next->c_prev = cbp->c_prev; - cbp->c_prev->c_next = cbp->c_next; - } + sortframes_remove(cbp); - /* compute old weight value for this frame */ - union comboval cb; - int val = 0; - if ((cb = fsp->s_fval[BLACK][r]).s <= 0x500) - val += weight[5 - cb.cv_force - cb.cv_win]; - if ((cb = fsp->s_fval[WHITE][r]).s <= 0x500) - val += weight[5 - cb.cv_force - cb.cv_win]; + int val = old_weight_value(fsp, r); /* compute new combo value for this frame */ bool space = fsp->s_occ == EMPTY; @@ -129,7 +141,7 @@ makemove(int us, int mv) sp->s_wval -= val; else { /* this frame is now blocked, adjust values */ - fsp->s_flags |= bmask; + fsp->s_flags |= BFLAG << r; fsp->s_fval[BLACK][r].s = 0x600; fsp->s_fval[WHITE][r].s = 0x600; while (--i >= 0) {