Module Name: src Committed By: rillig Date: Sun May 22 09:17:15 UTC 2022
Modified Files: src/games/gomoku: main.c Log Message: gomoku: extract main_game_loop from main No functional change. To generate a diff of this commit: cvs rdiff -u -r1.57 -r1.58 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/main.c diff -u src/games/gomoku/main.c:1.57 src/games/gomoku/main.c:1.58 --- src/games/gomoku/main.c:1.57 Sun May 22 08:58:31 2022 +++ src/games/gomoku/main.c Sun May 22 09:17:15 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: main.c,v 1.57 2022/05/22 08:58:31 rillig Exp $ */ +/* $NetBSD: main.c,v 1.58 2022/05/22 09:17:15 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.57 2022/05/22 08:58:31 rillig Exp $"); +__RCSID("$NetBSD: main.c,v 1.58 2022/05/22 09:17:15 rillig Exp $"); #include <sys/stat.h> #include <curses.h> @@ -273,11 +273,62 @@ declare_winner(int outcome, const enum i bdisp(); } +struct outcome { + int result; + int winner; +}; + +static struct outcome +main_game_loop(enum input_source *input) +{ + int color, curmove, outcome; + + curmove = 0; /* for GCC */ + color = BLACK; + +again: + switch (input[color]) { + case INPUTF: + curmove = readinput(inputfp); + if (curmove != EOF) + break; + set_input_sources(input, color); + plyr[BLACK] = input[BLACK] == USER ? user : prog; + plyr[WHITE] = input[WHITE] == USER ? user : prog; + bdwho(); + refresh(); + goto again; + + case USER: + curmove = read_move(); + break; + + case PROGRAM: + if (interactive) + ask("Thinking..."); + curmove = pickmove(color); + break; + } + + if (interactive && curmove != ILLEGAL) { + misclog("%3d%*s%-6s", + movenum, color == BLACK ? 2 : 9, "", stoc(curmove)); + } + + if ((outcome = makemove(color, curmove)) != MOVEOK) + return (struct outcome){ outcome, color }; + + if (interactive) + bdisp(); + color = color != BLACK ? BLACK : WHITE; + goto again; +} + int main(int argc, char **argv) { char *user_name; - int color, curmove; + int color; enum input_source input[2]; /* Revoke setgid privileges */ @@ -288,7 +339,6 @@ main(int argc, char **argv) user_name = getlogin(); strlcpy(user, user_name != NULL ? user_name : "you", sizeof(user)); - curmove = 0; color = BLACK; parse_args(argc, argv); @@ -328,43 +378,11 @@ again: refresh(); } - int outcome; - for (color = BLACK; ; color = color != BLACK ? BLACK : WHITE) { - top: - switch (input[color]) { - case INPUTF: /* input comes from a file */ - curmove = readinput(inputfp); - if (curmove != EOF) - break; - set_input_sources(input, color); - plyr[BLACK] = input[BLACK] == USER ? user : prog; - plyr[WHITE] = input[WHITE] == USER ? user : prog; - bdwho(); - refresh(); - goto top; + struct outcome outcome = main_game_loop(input); - case USER: /* input comes from standard input */ - curmove = read_move(); - break; - - case PROGRAM: /* input comes from the program */ - if (interactive) - ask("Thinking..."); - curmove = pickmove(color); - break; - } - if (interactive && curmove != ILLEGAL) { - misclog("%3d%*s%-6s", movenum, - color == BLACK ? 2 : 9, "", stoc(curmove)); - } - if ((outcome = makemove(color, curmove)) != MOVEOK) - break; - if (interactive) - bdisp(); - } if (interactive) { - declare_winner(outcome, input, color); - if (outcome != RESIGN) { + declare_winner(outcome.result, input, outcome.winner); + if (outcome.result != RESIGN) { replay: ask("Play again? "); int ch = get_key("YyNnQqSs");