1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42: #include "defs.h"
43: RCSID("$NetBSD: main.cc,v 1.2 2003/12/28 17:53:48 thorpej Exp $")
44:
45: #include <iostream>
46: #include <unistd.h>
47: #include <stdlib.h>
48: #include <string.h>
49: #include <err.h>
50: #include "algor.h"
51: #include "board.h"
52: #include "human.h"
53: #include "ttyscrn.h"
54:
55:
56: static void usage(char* pname)
57: {
58: char* p = strrchr(pname, '/');
59: if (p)
60: p++;
61: else
62: p = pname;
63: std::cerr << "Usage: " << p
64: << " [-w] [-p <c|h><c|h>] [-n <ngames>] [<ydim> [<xdim>]]" << std::endl;
65: }
66:
67:
68: static void play(BOARD& b, PLAYER* p[2])
69: {
70:
71: b.init();
72: p[0]->init();
73: p[1]->init();
74: b.paint();
75:
76:
77: for (size_t i = 0;; i = (i + 1) & 1) {
78: b.score(i, *p[i]);
79: if (!p[i]->domove(b)) {
80:
81: break;
82: }
83: b.score(i, *p[i]);
84: }
85:
86:
87: p[0]->wl(p[1]->getScore());
88: p[1]->wl(p[0]->getScore());
89:
90:
91: b.score(0, *p[0]);
92: b.score(1, *p[1]);
93:
94:
95: b.total(0, *p[0]);
96: b.total(1, *p[1]);
97:
98:
99: b.games(0, *p[0]);
100: b.games(1, *p[1]);
101:
102:
103: b.ties(*p[0]);
104: }
105:
106: int main(int argc, char** argv)
107: {
108: size_t ny, nx, nn = 1, wt = 0;
109: const char* nc = "ch";
110: int c;
111: int acs = 1;
112:
113: while ((c = getopt(argc, argv, "awp:n:")) != -1)
114: switch (c) {
115: case 'a':
116: acs = 0;
117: break;
118: case 'w':
119: wt++;
120: break;
121:
122: case 'p':
123: nc = optarg;
124: break;
125:
126: case 'n':
127: nn = atoi(optarg);
128: break;
129:
130: default:
131: usage(argv[0]);
132: return 1;
133: }
134:
135:
136: switch (argc - optind) {
137: case 0:
138: ny = nx = 3;
139: break;
140:
141: case 1:
142: ny = nx = atoi(argv[optind]);
143: break;
144:
145: case 2:
146: nx = atoi(argv[optind]);
147: ny = atoi(argv[optind+1]);
148: break;
149:
150: default:
151: usage(argv[0]);
152: return 1;
153: }
154:
155:
156: PLAYER* p[2];
157:
158:
159: for (size_t i = 0; i < 2; i++) {
160: char n = nc[1] == nc[0] ? i + '0' : nc[i];
161: switch (nc[i]) {
162: case 'c':
163: p[i] = new ALGOR(n);
164: break;
165:
166: case 'h':
167: p[i] = new HUMAN(n);
168: break;
169:
170: default:
171: usage(argv[0]);
172: return 1;
173: }
174: }
175:
176: GAMESCREEN *sc = TTYSCRN::create(acs, ny, nx);
177: if (sc == NULL)
178: ::errx(1, "Dimensions too large for current screen.");
179:
180: BOARD b(ny, nx, sc);
181:
182:
183: while (nn--) {
184: play(b, p);
185: if (wt)
186: b.getmove();
187: }
188:
189: if (wt == 0)
190: b.getmove();
191:
192: delete sc;
193: delete p[0];
194: delete p[1];
195: return 0;
196: }