#include "defs.h"
RCSID("$NetBSD: main.cc,v 1.7 2021/12/05 09:22:45 rillig Exp $")
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <err.h>
#include "algor.h"
#include "board.h"
#include "human.h"
#include "ttyscrn.h"
GAMESCREEN *sc;
static void usage(char* pname)
{
char* p = strrchr(pname, '/');
if (p)
p++;
else
p = pname;
(void)::fprintf(stderr,
"Usage: %s [-w] [-p <c|h><c|h>] [-n <ngames>] [<ydim> [<xdim>]]\n", p);
}
static void play(BOARD& b, PLAYER* p[2])
{
b.init();
p[0]->init();
p[1]->init();
b.paint();
for (size_t i = 0;; i = (i + 1) & 1) {
b.score(i, *p[i]);
if (!p[i]->domove(b)) {
break;
}
b.score(i, *p[i]);
}
p[0]->wl(p[1]->getScore());
p[1]->wl(p[0]->getScore());
b.score(0, *p[0]);
b.score(1, *p[1]);
b.total(0, *p[0]);
b.total(1, *p[1]);
b.games(0, *p[0]);
b.games(1, *p[1]);
b.ties(*p[0]);
}
int main(int argc, char** argv)
{
size_t ny, nx, nn = 1, wt = 0;
const char* nc = "ch";
int c;
int acs = 1;
while ((c = getopt(argc, argv, "awp:n:")) != -1)
switch (c) {
case 'a':
acs = 0;
break;
case 'w':
wt++;
break;
case 'p':
nc = optarg;
break;
case 'n':
nn = atoi(optarg);
break;
default:
usage(argv[0]);
return 1;
}
switch (argc - optind) {
case 0:
ny = nx = 3;
break;
case 1:
ny = nx = atoi(argv[optind]);
break;
case 2:
nx = atoi(argv[optind]);
ny = atoi(argv[optind+1]);
break;
default:
usage(argv[0]);
return 1;
}
PLAYER* p[2];
for (size_t i = 0; i < 2; i++) {
char n = nc[1] == nc[0] ? i + '0' : nc[i];
switch (nc[i]) {
case 'c':
p[i] = new ALGOR(n);
break;
case 'h':
p[i] = new HUMAN(n);
break;
default:
usage(argv[0]);
return 1;
}
}
sc = TTYSCRN::create(acs, &ny, &nx);
if (sc == NULL)
::errx(1, "Dimensions too large for current screen.");
BOARD b(ny, nx, sc);
while (nn--) {
play(b, p);
if (wt)
b.getmove();
}
if (wt == 0)
b.getmove();
delete sc;
delete p[0];
delete p[1];
return 0;
}