]>
git.cameronkatri.com Git - bsdgames-darwin.git/blob - gomoku/makemove.c
1 /* $NetBSD: makemove.c,v 1.3 1997/01/03 01:35:29 cgd 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
41 static char sccsid
[] = "@(#)makemove.c 8.2 (Berkeley) 5/3/95";
43 static char rcsid
[] = "$NetBSD: makemove.c,v 1.3 1997/01/03 01:35:29 cgd Exp $";
49 /* direction deltas */
51 MRIGHT
, MRIGHT
+MDOWN
, MDOWN
, MDOWN
+MLEFT
54 int weight
[5] = { 0, 1, 7, 22, 100 };
58 * MOVEOK everything is OK.
59 * RESIGN Player resigned.
60 * ILLEGAL Illegal move.
61 * WIN The the winning move was just played.
62 * TIE The game is a tie.
67 register struct spotstr
*sp
, *fsp
;
68 register union comboval
*cp
;
70 struct combostr
*cbp
, *cbp1
;
72 register int i
, f
, r
, d
, n
;
73 int space
, val
, bmask
;
75 /* check for end of game */
79 /* check for illegal move */
81 if (sp
->s_occ
!= EMPTY
)
86 movelog
[movenum
- 1] = mv
;
87 if (++movenum
== BSZ
* BSZ
)
90 /* compute new frame values */
93 for (r
= 4; --r
>= 0; ) { /* for each direction */
97 for (f
= 5; --f
>= 0; fsp
-= d
) { /* for each frame */
98 if (fsp
->s_occ
== BORDER
)
100 if (fsp
->s_flg
& bmask
)
103 /* remove this frame from the sorted list of frames */
104 cbp
= fsp
->s_frame
[r
];
106 if (sortframes
[BLACK
] == cbp
)
107 sortframes
[BLACK
] = cbp
->c_next
;
108 if (sortframes
[WHITE
] == cbp
)
109 sortframes
[WHITE
] = cbp
->c_next
;
110 cbp
->c_next
->c_prev
= cbp
->c_prev
;
111 cbp
->c_prev
->c_next
= cbp
->c_next
;
114 /* compute old weight value for this frame */
115 cp
= &fsp
->s_fval
[BLACK
][r
];
117 val
= weight
[5 - cp
->c
.a
- cp
->c
.b
];
120 cp
= &fsp
->s_fval
[WHITE
][r
];
122 val
+= weight
[5 - cp
->c
.a
- cp
->c
.b
];
124 /* compute new combo value for this frame */
126 space
= sp
->s_occ
== EMPTY
;
128 for (i
= 5; --i
>= 0; sp
+= d
) { /* for each spot */
131 else if (sp
->s_occ
== EMPTY
)
134 /* this frame is now blocked, adjust values */
136 fsp
->s_fval
[BLACK
][r
].s
= MAXCOMBO
;
137 fsp
->s_fval
[WHITE
][r
].s
= MAXCOMBO
;
140 if (sp
->s_occ
== EMPTY
)
147 /* check for game over */
151 /* compute new value & combo number for this frame & color */
152 fsp
->s_fval
[!us
][r
].s
= MAXCOMBO
;
153 cp
= &fsp
->s_fval
[us
][r
];
154 /* both ends open? */
155 if (space
&& sp
->s_occ
== EMPTY
) {
164 for (i
= 5; --i
>= 0; sp
+= d
) /* for each spot */
165 if (sp
->s_occ
== EMPTY
)
168 /* add this frame to the sorted list of frames by combo value */
169 cbp1
= sortframes
[us
];
171 sortframes
[us
] = cbp
->c_next
= cbp
->c_prev
= cbp
;
173 cp1
= &board
[cbp1
->c_vertex
].s_fval
[us
][cbp1
->c_dir
];
174 if (cp
->s
<= cp1
->s
) {
175 /* insert at the head of the list */
176 sortframes
[us
] = cbp
;
180 cp1
= &board
[cbp1
->c_vertex
].s_fval
[us
][cbp1
->c_dir
];
183 } while (cbp1
!= sortframes
[us
]);
186 cbp
->c_prev
= cbp1
->c_prev
;
187 cbp1
->c_prev
->c_next
= cbp
;
195 /* both ends open? */
196 if (fsp
->s_occ
== EMPTY
) {
197 cp
= &fsp
->s_fval
[BLACK
][r
];
202 cp
= &fsp
->s_fval
[WHITE
][r
];
219 * fix up the overlap array due to updating spot osp.
224 register struct spotstr
*sp
, *sp1
, *sp2
;
225 register int i
, f
, r
, r1
, d
, d1
, n
;
226 int a
, b
, bmask
, bmask1
;
230 for (r
= 4; --r
>= 0; ) { /* for each direction */
234 for (f
= 0; f
< 6; f
++, sp1
-= d
) { /* for each frame */
235 if (sp1
->s_occ
== BORDER
)
237 if (sp1
->s_flg
& bmask
)
240 * Update all other frames that intersect the current one
241 * to indicate whether they still overlap or not.
242 * Since F1 overlap F2 == F2 overlap F1, we only need to
243 * do the rows 0 <= r1 <= r. The r1 == r case is special
244 * since the two frames can overlap at more than one point.
246 str
= &overlap
[(a
= sp1
->s_frame
[r
] - frames
) * FAREA
];
248 for (i
= f
+ 1; i
< 6; i
++, sp2
-= d
) {
249 if (sp2
->s_occ
== BORDER
)
251 if (sp2
->s_flg
& bmask
)
254 * count the number of empty spots to see if there is
259 for (b
= i
- f
; b
< 5; b
++, sp
+= d
) {
260 if (sp
->s_occ
== EMPTY
) {
261 esp
= sp
; /* save the intersection point */
265 b
= sp2
->s_frame
[r
] - frames
;
267 if (sp
->s_occ
== EMPTY
) {
269 overlap
[b
* FAREA
+ a
] &= 0xC;
270 intersect
[a
* FAREA
+ b
] = n
= sp
- board
;
271 intersect
[b
* FAREA
+ a
] = n
;
274 overlap
[b
* FAREA
+ a
] = 0;
277 if (sp
->s_occ
== EMPTY
) {
279 overlap
[b
* FAREA
+ a
] &= 0xCF;
282 overlap
[b
* FAREA
+ a
] &= 0xF;
284 intersect
[a
* FAREA
+ b
] = n
= esp
- board
;
285 intersect
[b
* FAREA
+ a
] = n
;
287 /* else no change, still multiple overlap */
290 /* the other directions can only intersect at spot osp */
291 for (r1
= r
; --r1
>= 0; ) {
293 bmask1
= BFLAG
<< r1
;
295 for (i
= 6; --i
>= 0; sp
-= d1
) { /* for each spot */
296 if (sp
->s_occ
== BORDER
)
298 if (sp
->s_flg
& bmask1
)
300 b
= sp
->s_frame
[r1
] - frames
;
302 overlap
[b
* FAREA
+ a
] = 0;