Module Name:    src
Committed By:   rillig
Date:           Sat May 28 17:51:27 UTC 2022

Modified Files:
        src/games/gomoku: bdinit.c gomoku.h main.c

Log Message:
gomoku: split initialization of the board into smaller functions

The comments about the "top border" and "bottom border" had been wrong
all the time. Mention the corners in the comments, to remove the magic
from the various '+ 1' in the code.

No functional change.


To generate a diff of this commit:
cvs rdiff -u -r1.24 -r1.25 src/games/gomoku/bdinit.c
cvs rdiff -u -r1.44 -r1.45 src/games/gomoku/gomoku.h
cvs rdiff -u -r1.61 -r1.62 src/games/gomoku/main.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/bdinit.c
diff -u src/games/gomoku/bdinit.c:1.24 src/games/gomoku/bdinit.c:1.25
--- src/games/gomoku/bdinit.c:1.24	Sat May 28 08:32:55 2022
+++ src/games/gomoku/bdinit.c	Sat May 28 17:51:27 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: bdinit.c,v 1.24 2022/05/28 08:32:55 rillig Exp $	*/
+/*	$NetBSD: bdinit.c,v 1.25 2022/05/28 17:51:27 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994
@@ -34,119 +34,129 @@
 
 #include <sys/cdefs.h>
 /*	from: @(#)bdinit.c	8.2 (Berkeley) 5/3/95	*/
-__RCSID("$NetBSD: bdinit.c,v 1.24 2022/05/28 08:32:55 rillig Exp $");
+__RCSID("$NetBSD: bdinit.c,v 1.25 2022/05/28 17:51:27 rillig Exp $");
 
 #include <string.h>
 #include "gomoku.h"
 
 static void init_overlap(void);
 
+static void
+init_spot_flags_and_fval(struct spotstr *sp, int i, int j)
+{
+
+	sp->s_flags = 0;
+	if (j < 5) {
+		/* directions 1, 2, 3 are blocked */
+		sp->s_flags |= (BFLAG << 1) | (BFLAG << 2) |
+		    (BFLAG << 3);
+		sp->s_fval[BLACK][1].s = 0x600;
+		sp->s_fval[BLACK][2].s = 0x600;
+		sp->s_fval[BLACK][3].s = 0x600;
+		sp->s_fval[WHITE][1].s = 0x600;
+		sp->s_fval[WHITE][2].s = 0x600;
+		sp->s_fval[WHITE][3].s = 0x600;
+	} else if (j == 5) {
+		/* five spaces, blocked on one side */
+		sp->s_fval[BLACK][1].s = 0x500;
+		sp->s_fval[BLACK][2].s = 0x500;
+		sp->s_fval[BLACK][3].s = 0x500;
+		sp->s_fval[WHITE][1].s = 0x500;
+		sp->s_fval[WHITE][2].s = 0x500;
+		sp->s_fval[WHITE][3].s = 0x500;
+	} else {
+		/* six spaces, not blocked */
+		sp->s_fval[BLACK][1].s = 0x401;
+		sp->s_fval[BLACK][2].s = 0x401;
+		sp->s_fval[BLACK][3].s = 0x401;
+		sp->s_fval[WHITE][1].s = 0x401;
+		sp->s_fval[WHITE][2].s = 0x401;
+		sp->s_fval[WHITE][3].s = 0x401;
+	}
+	if (i > (BSZ - 4)) {
+		/* directions 0, 1 are blocked */
+		sp->s_flags |= BFLAG | (BFLAG << 1);
+		sp->s_fval[BLACK][0].s = 0x600;
+		sp->s_fval[BLACK][1].s = 0x600;
+		sp->s_fval[WHITE][0].s = 0x600;
+		sp->s_fval[WHITE][1].s = 0x600;
+	} else if (i == (BSZ - 4)) {
+		sp->s_fval[BLACK][0].s = 0x500;
+		sp->s_fval[WHITE][0].s = 0x500;
+		/* if direction 1 is not blocked */
+		if ((sp->s_flags & (BFLAG << 1)) == 0) {
+			sp->s_fval[BLACK][1].s = 0x500;
+			sp->s_fval[WHITE][1].s = 0x500;
+		}
+	} else {
+		sp->s_fval[BLACK][0].s = 0x401;
+		sp->s_fval[WHITE][0].s = 0x401;
+		if (i < 5) {
+			/* direction 3 is blocked */
+			sp->s_flags |= (BFLAG << 3);
+			sp->s_fval[BLACK][3].s = 0x600;
+			sp->s_fval[WHITE][3].s = 0x600;
+		} else if (i == 5 &&
+		    (sp->s_flags & (BFLAG << 3)) == 0) {
+			sp->s_fval[BLACK][3].s = 0x500;
+			sp->s_fval[WHITE][3].s = 0x500;
+		}
+	}
+}
+
+/* Allocate one of the pre-allocated frames for each non-blocked frame. */
+static void
+init_spot_frame(struct spotstr *sp, struct combostr **cbpp)
+{
+
+	for (int r = 4; --r >= 0; ) {
+		if ((sp->s_flags & (BFLAG << r)) != 0)
+			continue;
+
+		struct combostr *cbp = (*cbpp)++;
+		cbp->c_combo.s = sp->s_fval[BLACK][r].s;
+		cbp->c_vertex = (u_short)(sp - board);
+		cbp->c_nframes = 1;
+		cbp->c_dir = r;
+		sp->s_frame[r] = cbp;
+	}
+}
+
 void
-bdinit(struct spotstr *bp)
+init_board(void)
 {
-	struct spotstr *sp;
-	struct combostr *cbp;
 
 	game.nmoves = 0;
 	game.winning_spot = 0;
 
-	/* mark the borders as such */
-	sp = bp;
+	struct spotstr *sp = board;
 	for (int i = 0; i < 1 + BSZ + 1; i++, sp++) {
-		sp->s_occ = BORDER;			/* top border */
+		sp->s_occ = BORDER;	/* bottom border and corners */
 		sp->s_flags = BFLAGALL;
 	}
 
-	/* fill entire board with EMPTY spots */
+	/* fill the playing area of the board with EMPTY spots */
+	struct combostr *cbp = frames;
 	memset(frames, 0, sizeof(frames));
-	cbp = frames;
-	for (int j = 0; ++j < BSZ + 1; sp++) {		/* for each row */
-		for (int i = 0; ++i < BSZ + 1; sp++) {	/* for each column */
+	for (int row = 1; row <= BSZ; row++, sp++) {
+		for (int col = 1; col <= BSZ; col++, sp++) {
 			sp->s_occ = EMPTY;
-			sp->s_flags = 0;
 			sp->s_wval = 0;
-			if (j < 5) {
-				/* directions 1, 2, 3 are blocked */
-				sp->s_flags |= (BFLAG << 1) | (BFLAG << 2) |
-				    (BFLAG << 3);
-				sp->s_fval[BLACK][1].s = 0x600;
-				sp->s_fval[BLACK][2].s = 0x600;
-				sp->s_fval[BLACK][3].s = 0x600;
-				sp->s_fval[WHITE][1].s = 0x600;
-				sp->s_fval[WHITE][2].s = 0x600;
-				sp->s_fval[WHITE][3].s = 0x600;
-			} else if (j == 5) {
-				/* five spaces, blocked on one side */
-				sp->s_fval[BLACK][1].s = 0x500;
-				sp->s_fval[BLACK][2].s = 0x500;
-				sp->s_fval[BLACK][3].s = 0x500;
-				sp->s_fval[WHITE][1].s = 0x500;
-				sp->s_fval[WHITE][2].s = 0x500;
-				sp->s_fval[WHITE][3].s = 0x500;
-			} else {
-				/* six spaces, not blocked */
-				sp->s_fval[BLACK][1].s = 0x401;
-				sp->s_fval[BLACK][2].s = 0x401;
-				sp->s_fval[BLACK][3].s = 0x401;
-				sp->s_fval[WHITE][1].s = 0x401;
-				sp->s_fval[WHITE][2].s = 0x401;
-				sp->s_fval[WHITE][3].s = 0x401;
-			}
-			if (i > (BSZ - 4)) {
-				/* directions 0, 1 are blocked */
-				sp->s_flags |= BFLAG | (BFLAG << 1);
-				sp->s_fval[BLACK][0].s = 0x600;
-				sp->s_fval[BLACK][1].s = 0x600;
-				sp->s_fval[WHITE][0].s = 0x600;
-				sp->s_fval[WHITE][1].s = 0x600;
-			} else if (i == (BSZ - 4)) {
-				sp->s_fval[BLACK][0].s = 0x500;
-				sp->s_fval[WHITE][0].s = 0x500;
-				/* if direction 1 is not blocked */
-				if ((sp->s_flags & (BFLAG << 1)) == 0) {
-					sp->s_fval[BLACK][1].s = 0x500;
-					sp->s_fval[WHITE][1].s = 0x500;
-				}
-			} else {
-				sp->s_fval[BLACK][0].s = 0x401;
-				sp->s_fval[WHITE][0].s = 0x401;
-				if (i < 5) {
-					/* direction 3 is blocked */
-					sp->s_flags |= (BFLAG << 3);
-					sp->s_fval[BLACK][3].s = 0x600;
-					sp->s_fval[WHITE][3].s = 0x600;
-				} else if (i == 5 &&
-				    (sp->s_flags & (BFLAG << 3)) == 0) {
-					sp->s_fval[BLACK][3].s = 0x500;
-					sp->s_fval[WHITE][3].s = 0x500;
-				}
-			}
-			/*
-			 * Allocate a frame structure for non-blocked frames.
-			 */
-			for (int r = 4; --r >= 0; ) {
-				if ((sp->s_flags & (BFLAG << r)) != 0)
-					continue;
-				cbp->c_combo.s = sp->s_fval[BLACK][r].s;
-				cbp->c_vertex = (u_short)(sp - board);
-				cbp->c_nframes = 1;
-				cbp->c_dir = r;
-				sp->s_frame[r] = cbp;
-				cbp++;
-			}
+			init_spot_flags_and_fval(sp, col, row);
+			init_spot_frame(sp, &cbp);
 		}
-		sp->s_occ = BORDER;		/* left & right border */
+		sp->s_occ = BORDER;	/* combined left and right border */
 		sp->s_flags = BFLAGALL;
 	}
 
-	/* mark the borders as such */
 	for (int i = 0; i < BSZ + 1; i++, sp++) {
-		sp->s_occ = BORDER;			/* bottom border */
+		sp->s_occ = BORDER;	/* top border and top-right corner */
 		sp->s_flags = BFLAGALL;
 	}
 
 	sortframes[BLACK] = NULL;
 	sortframes[WHITE] = NULL;
+
 	init_overlap();
 }
 

Index: src/games/gomoku/gomoku.h
diff -u src/games/gomoku/gomoku.h:1.44 src/games/gomoku/gomoku.h:1.45
--- src/games/gomoku/gomoku.h:1.44	Sat May 28 08:32:55 2022
+++ src/games/gomoku/gomoku.h	Sat May 28 17:51:27 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: gomoku.h,v 1.44 2022/05/28 08:32:55 rillig Exp $	*/
+/*	$NetBSD: gomoku.h,v 1.45 2022/05/28 17:51:27 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994
@@ -237,7 +237,7 @@ extern	int	debug;
 extern bool interactive;
 extern const char *plyr[];
 
-void	bdinit(struct spotstr *);
+void	init_board(void);
 int	get_coord(void);
 int	get_key(const char *);
 bool	get_line(char *, int, void (*)(const char *));

Index: src/games/gomoku/main.c
diff -u src/games/gomoku/main.c:1.61 src/games/gomoku/main.c:1.62
--- src/games/gomoku/main.c:1.61	Sat May 28 08:19:18 2022
+++ src/games/gomoku/main.c	Sat May 28 17:51:27 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: main.c,v 1.61 2022/05/28 08:19:18 rillig Exp $	*/
+/*	$NetBSD: main.c,v 1.62 2022/05/28 17:51:27 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994
@@ -36,7 +36,7 @@
 __COPYRIGHT("@(#) Copyright (c) 1994\
  The Regents of the University of California.  All rights reserved.");
 /*	@(#)main.c	8.4 (Berkeley) 5/4/95	*/
-__RCSID("$NetBSD: main.c,v 1.61 2022/05/28 08:19:18 rillig Exp $");
+__RCSID("$NetBSD: main.c,v 1.62 2022/05/28 17:51:27 rillig Exp $");
 
 #include <sys/stat.h>
 #include <curses.h>
@@ -349,7 +349,7 @@ main(int argc, char **argv)
 	if (interactive)
 		cursinit();		/* initialize curses */
 again:
-	bdinit(board);			/* initialize board contents */
+	init_board();			/* initialize board contents */
 
 	if (interactive) {
 		bdisp_init();		/* initialize display of board */

Reply via email to