IMPORT openssh-9.8p1
[dragonfly.git] / games / backgammon / teachgammon / tutor.c
blobdea2d6729368d869662f3ca813865ee1985ff58b
1 /* @(#)tutor.c 8.1 (Berkeley) 5/31/93 */
2 /* $NetBSD: tutor.c,v 1.11 2012/10/13 19:19:39 dholland Exp $ */
4 /*
5 * Copyright (c) 1980, 1993
6 * The Regents of the University of California. All rights reserved.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. Neither the name of the University nor the names of its contributors
17 * may be used to endorse or promote products derived from this software
18 * without specific prior written permission.
20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
33 #include "back.h"
34 #include "tutor.h"
36 static const char better[] =
37 "That is a legal move, but there is a better one.\n";
39 static int brdeq(const int *, const int *);
40 static void clrest(void);
42 void
43 tutor(struct move *mm)
45 int i, j;
47 i = 0;
48 begscr = 18;
49 cturn = -1;
50 home = 0;
51 bar = 25;
52 inptr = &in[0];
53 inopp = &in[1];
54 offptr = &off[0];
55 offopp = &off[1];
56 Colorptr = &color[0];
57 colorptr = &color[2];
58 colen = 5;
59 wrboard();
61 while (1) {
62 if (!brdeq(test[i].brd, board)) {
63 if (tflag && curr == 23)
64 curmove(18, 0);
65 writel(better);
66 nexturn();
67 movback(mm, mm->mvlim);
68 if (tflag) {
69 refresh();
70 clrest();
72 if ((!tflag) || curr == 19) {
73 proll(mm);
74 writec('\t');
75 } else
76 curmove(curr > 19 ? curr - 2 : curr + 4, 25);
77 getmove(mm);
78 if (cturn == 0)
79 leave();
80 continue;
82 if (tflag)
83 curmove(18, 0);
84 wrtext(*test[i].com);
85 if (!tflag)
86 writec('\n');
87 if (i == maxmoves)
88 break;
89 mm->D0 = test[i].roll1;
90 mm->D1 = test[i].roll2;
91 mm->d0 = 0;
92 mm->mvlim = 0;
93 for (j = 0; j < 4; j++) {
94 if (test[i].mp[j] == test[i].mg[j])
95 break;
96 mm->p[j] = test[i].mp[j];
97 mm->g[j] = test[i].mg[j];
98 mm->mvlim++;
100 if (mm->mvlim)
101 for (j = 0; j < mm->mvlim; j++)
102 if (makmove(mm, j))
103 writel("AARGH!!!\n");
104 if (tflag)
105 refresh();
106 nexturn();
107 mm->D0 = test[i].new1;
108 mm->D1 = test[i].new2;
109 mm->d0 = 0;
110 i++;
111 mm->mvlim = movallow(mm);
112 if (mm->mvlim) {
113 if (tflag)
114 clrest();
115 proll(mm);
116 writec('\t');
117 getmove(mm);
118 if (tflag)
119 refresh();
120 if (cturn == 0)
121 leave();
124 leave();
127 static void
128 clrest(void)
130 int r, c, j;
132 r = curr;
133 c = curc;
134 for (j = r + 1; j < 24; j++) {
135 curmove(j, 0);
136 cline();
138 curmove(r, c);
141 static int
142 brdeq(const int *b1, const int *b2)
144 const int *e;
146 e = b1 + 26;
147 while (b1 < e)
148 if (*b1++ != *b2++)
149 return (0);
150 return (1);