1 /* $NetBSD: main.cc,v 1.5 2008/04/28 20:22:54 martin Exp $ */ 2 3 /*- 4 * Copyright (c) 2003 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Christos Zoulas. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 /* 33 * main.C: Main dots program 34 */ 35 #include "defs.h" 36 RCSID("$NetBSD: main.cc,v 1.5 2008/04/28 20:22:54 martin Exp $") 37 38 #include <stdio.h> 39 #include <unistd.h> 40 #include <stdlib.h> 41 #include <string.h> 42 #include <err.h> 43 #include "algor.h" 44 #include "board.h" 45 #include "human.h" 46 #include "ttyscrn.h" 47 48 GAMESCREEN *sc; 49 50 // Print the command line usage 51 static void usage(char* pname) 52 { 53 char* p = strrchr(pname, '/'); 54 if (p) 55 p++; 56 else 57 p = pname; 58 (void)::fprintf(stderr, 59 "Usage: %s [-w] [-p <c|h><c|h>] [-n <ngames>] [<ydim> [<xdim>]]\n", p); 60 } 61 62 // Play a single game 63 static void play(BOARD& b, PLAYER* p[2]) 64 { 65 // Initialize 66 b.init(); 67 p[0]->init(); 68 p[1]->init(); 69 b.paint(); 70 71 // Alternate turns between players, scoring each turn 72 for (size_t i = 0;; i = (i + 1) & 1) { 73 b.score(i, *p[i]); 74 if (!p[i]->domove(b)) { 75 // No more moves, game over 76 break; 77 } 78 b.score(i, *p[i]); 79 } 80 81 // Find who won 82 p[0]->wl(p[1]->getScore()); 83 p[1]->wl(p[0]->getScore()); 84 85 // Post scores 86 b.score(0, *p[0]); 87 b.score(1, *p[1]); 88 89 // Post totals 90 b.total(0, *p[0]); 91 b.total(1, *p[1]); 92 93 // Post games 94 b.games(0, *p[0]); 95 b.games(1, *p[1]); 96 97 // Post ties 98 b.ties(*p[0]); 99 } 100 101 int main(int argc, char** argv) 102 { 103 size_t ny, nx, nn = 1, wt = 0; 104 const char* nc = "ch"; 105 int c; 106 int acs = 1; 107 108 while ((c = getopt(argc, argv, "awp:n:")) != -1) 109 switch (c) { 110 case 'a': 111 acs = 0; 112 break; 113 case 'w': 114 wt++; 115 break; 116 117 case 'p': 118 nc = optarg; 119 break; 120 121 case 'n': 122 nn = atoi(optarg); 123 break; 124 125 default: 126 usage(argv[0]); 127 return 1; 128 } 129 130 // Get the size of the board if specified 131 switch (argc - optind) { 132 case 0: 133 ny = nx = 3; 134 break; 135 136 case 1: 137 ny = nx = atoi(argv[optind]); 138 break; 139 140 case 2: 141 nx = atoi(argv[optind]); 142 ny = atoi(argv[optind+1]); 143 break; 144 145 default: 146 usage(argv[0]); 147 return 1; 148 } 149 150 151 PLAYER* p[2]; 152 153 // Allocate players 154 for (size_t i = 0; i < 2; i++) { 155 char n = nc[1] == nc[0] ? i + '0' : nc[i]; 156 switch (nc[i]) { 157 case 'c': 158 p[i] = new ALGOR(n); 159 break; 160 161 case 'h': 162 p[i] = new HUMAN(n); 163 break; 164 165 default: 166 usage(argv[0]); 167 return 1; 168 } 169 } 170 171 sc = TTYSCRN::create(acs, ny, nx); 172 if (sc == NULL) 173 ::errx(1, "Dimensions too large for current screen."); 174 175 BOARD b(ny, nx, sc); 176 177 // Play games 178 while (nn--) { 179 play(b, p); 180 if (wt) 181 b.getmove(); 182 } 183 184 if (wt == 0) 185 b.getmove(); 186 // Cleanup 187 delete sc; 188 delete p[0]; 189 delete p[1]; 190 return 0; 191 } 192