]>
git.cameronkatri.com Git - bsdgames-darwin.git/blob - gomoku/makemove.c
1 /* $NetBSD: makemove.c,v 1.5 1999/09/08 21:17:49 jsm Exp $ */
5 * The Regents of the University of California. All rights reserved.
7 * This code is derived from software contributed to Berkeley by
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
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 * 3. All advertising materials mentioning features or use of this software
19 * must display the following acknowledgement:
20 * This product includes software developed by the University of
21 * California, Berkeley and its contributors.
22 * 4. Neither the name of the University nor the names of its contributors
23 * may be used to endorse or promote products derived from this software
24 * without specific prior written permission.
26 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
39 #include <sys/cdefs.h>
42 static char sccsid
[] = "@(#)makemove.c 8.2 (Berkeley) 5/3/95";
44 __RCSID("$NetBSD: makemove.c,v 1.5 1999/09/08 21:17:49 jsm Exp $");
50 /* direction deltas */
52 MRIGHT
, MRIGHT
+MDOWN
, MDOWN
, MDOWN
+MLEFT
55 const int weight
[5] = { 0, 1, 7, 22, 100 };
59 * MOVEOK everything is OK.
60 * RESIGN Player resigned.
61 * ILLEGAL Illegal move.
62 * WIN The the winning move was just played.
63 * TIE The game is a tie.
69 struct spotstr
*sp
, *fsp
;
72 struct combostr
*cbp
, *cbp1
;
75 int space
, val
, bmask
;
77 /* check for end of game */
81 /* check for illegal move */
83 if (sp
->s_occ
!= EMPTY
)
88 movelog
[movenum
- 1] = mv
;
89 if (++movenum
== BSZ
* BSZ
)
92 /* compute new frame values */
95 for (r
= 4; --r
>= 0; ) { /* for each direction */
99 for (f
= 5; --f
>= 0; fsp
-= d
) { /* for each frame */
100 if (fsp
->s_occ
== BORDER
)
102 if (fsp
->s_flg
& bmask
)
105 /* remove this frame from the sorted list of frames */
106 cbp
= fsp
->s_frame
[r
];
108 if (sortframes
[BLACK
] == cbp
)
109 sortframes
[BLACK
] = cbp
->c_next
;
110 if (sortframes
[WHITE
] == cbp
)
111 sortframes
[WHITE
] = cbp
->c_next
;
112 cbp
->c_next
->c_prev
= cbp
->c_prev
;
113 cbp
->c_prev
->c_next
= cbp
->c_next
;
116 /* compute old weight value for this frame */
117 cp
= &fsp
->s_fval
[BLACK
][r
];
119 val
= weight
[5 - cp
->c
.a
- cp
->c
.b
];
122 cp
= &fsp
->s_fval
[WHITE
][r
];
124 val
+= weight
[5 - cp
->c
.a
- cp
->c
.b
];
126 /* compute new combo value for this frame */
128 space
= sp
->s_occ
== EMPTY
;
130 for (i
= 5; --i
>= 0; sp
+= d
) { /* for each spot */
133 else if (sp
->s_occ
== EMPTY
)
136 /* this frame is now blocked, adjust values */
138 fsp
->s_fval
[BLACK
][r
].s
= MAXCOMBO
;
139 fsp
->s_fval
[WHITE
][r
].s
= MAXCOMBO
;
142 if (sp
->s_occ
== EMPTY
)
149 /* check for game over */
153 /* compute new value & combo number for this frame & color */
154 fsp
->s_fval
[!us
][r
].s
= MAXCOMBO
;
155 cp
= &fsp
->s_fval
[us
][r
];
156 /* both ends open? */
157 if (space
&& sp
->s_occ
== EMPTY
) {
166 for (i
= 5; --i
>= 0; sp
+= d
) /* for each spot */
167 if (sp
->s_occ
== EMPTY
)
170 /* add this frame to the sorted list of frames by combo value */
171 cbp1
= sortframes
[us
];
173 sortframes
[us
] = cbp
->c_next
= cbp
->c_prev
= cbp
;
175 cp1
= &board
[cbp1
->c_vertex
].s_fval
[us
][cbp1
->c_dir
];
176 if (cp
->s
<= cp1
->s
) {
177 /* insert at the head of the list */
178 sortframes
[us
] = cbp
;
182 cp1
= &board
[cbp1
->c_vertex
].s_fval
[us
][cbp1
->c_dir
];
185 } while (cbp1
!= sortframes
[us
]);
188 cbp
->c_prev
= cbp1
->c_prev
;
189 cbp1
->c_prev
->c_next
= cbp
;
197 /* both ends open? */
198 if (fsp
->s_occ
== EMPTY
) {
199 cp
= &fsp
->s_fval
[BLACK
][r
];
204 cp
= &fsp
->s_fval
[WHITE
][r
];
221 * fix up the overlap array due to updating spot osp.
227 struct spotstr
*sp
, *sp1
, *sp2
;
228 int i
, f
, r
, r1
, d
, d1
, n
;
229 int a
, b
, bmask
, bmask1
;
234 for (r
= 4; --r
>= 0; ) { /* for each direction */
238 for (f
= 0; f
< 6; f
++, sp1
-= d
) { /* for each frame */
239 if (sp1
->s_occ
== BORDER
)
241 if (sp1
->s_flg
& bmask
)
244 * Update all other frames that intersect the current one
245 * to indicate whether they still overlap or not.
246 * Since F1 overlap F2 == F2 overlap F1, we only need to
247 * do the rows 0 <= r1 <= r. The r1 == r case is special
248 * since the two frames can overlap at more than one point.
250 str
= &overlap
[(a
= sp1
->s_frame
[r
] - frames
) * FAREA
];
252 for (i
= f
+ 1; i
< 6; i
++, sp2
-= d
) {
253 if (sp2
->s_occ
== BORDER
)
255 if (sp2
->s_flg
& bmask
)
258 * count the number of empty spots to see if there is
263 for (b
= i
- f
; b
< 5; b
++, sp
+= d
) {
264 if (sp
->s_occ
== EMPTY
) {
265 esp
= sp
; /* save the intersection point */
269 b
= sp2
->s_frame
[r
] - frames
;
271 if (sp
->s_occ
== EMPTY
) {
273 overlap
[b
* FAREA
+ a
] &= 0xC;
274 intersect
[a
* FAREA
+ b
] = n
= sp
- board
;
275 intersect
[b
* FAREA
+ a
] = n
;
278 overlap
[b
* FAREA
+ a
] = 0;
281 if (sp
->s_occ
== EMPTY
) {
283 overlap
[b
* FAREA
+ a
] &= 0xCF;
286 overlap
[b
* FAREA
+ a
] &= 0xF;
288 intersect
[a
* FAREA
+ b
] = n
= esp
- board
;
289 intersect
[b
* FAREA
+ a
] = n
;
291 /* else no change, still multiple overlap */
294 /* the other directions can only intersect at spot osp */
295 for (r1
= r
; --r1
>= 0; ) {
297 bmask1
= BFLAG
<< r1
;
299 for (i
= 6; --i
>= 0; sp
-= d1
) { /* for each spot */
300 if (sp
->s_occ
== BORDER
)
302 if (sp
->s_flg
& bmask1
)
304 b
= sp
->s_frame
[r1
] - frames
;
306 overlap
[b
* FAREA
+ a
] = 0;