summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/games/go/goplayutils.c2
-rw-r--r--noncore/games/go/killable.c4
2 files changed, 3 insertions, 3 deletions
diff --git a/noncore/games/go/goplayutils.c b/noncore/games/go/goplayutils.c
index 9e2ce4c..91c6db2 100644
--- a/noncore/games/go/goplayutils.c
+++ b/noncore/games/go/goplayutils.c
@@ -823,193 +823,193 @@ restoreState()
/* exception bpt; */
/*
returns true if (the group (at gx, gy) is saveable.
if so, returns the point to play at in savex, savey
*/
short saveable(gx, gy, savex, savey)
short gx, gy, *savex, *savey;
{ /* saveable */
short me, him, gx1, gx2, i, j, smark, mark2, tl, result;
char sChar;
sPointList dList;
point tp;
short libList[maxSPoint+1];
#ifdef DEBUG
printf( "saveable\n" );
#endif
dbStop = TRUE;
me = bord[gx][gy];
him = -me;
if (me == 1)
sChar = '|';
else
sChar = '>';
/* write(sChar); */
spanGroup(gx, gy, &plist3); /* find my liberties */
if (adjInAtari) /* one of my options is to kill */
{
listAdjacents(gx, gy, &aList);
for (i = 1; i <= aList.indx; i++)
if (gList[aList.v[i]].libC == 1)
{
spanGroup(gList[aList.v[i]].lx, gList[aList.v[i]].ly,
&pList1); /* find it's liberty */
plist3.indx = plist3.indx + 1;
plist3.p[plist3.indx].px = pList1.p[1].px;
plist3.p[plist3.indx].py = pList1.p[1].py;
}
}
for (i = 1; i <= maxSPoint; i++)
libList[i] = -1;
if ((utilPlayLevel > 4) &&
(gList[gMap[groupIDs[gx][gy]]].libC > 1)) /* account for diags */
{
listDiags(gx, gy, &dList);
j = 0;
i = plist3.indx;
while ((j < dList.indx) &&
(i < maxSPoint))
{
j = j + 1;
i = i + 1;
libList[i] = 100;
plist3.p[i].px = dList.p[j].px;
plist3.p[i].py = dList.p[j].py;
}
plist3.indx = i;
}
if (plist3.indx > 1) /* sort by decreasing lib count */
{
for (i = 1; i <= plist3.indx; i++)
if (libList[i] != 100)
{
mark2 = playMark;
tryPlay(plist3.p[i].px, plist3.p[i].py, me);
libList[i] = gList[gMap[groupIDs[gx][gy]]].libC;
if (libList[i] > treeLibLim) /* i'm safe */
{
*savex = plist3.p[i].px;
*savey = plist3.p[i].py;
result = TRUE;
goto one;
}
undoTo(mark2);
}
for (i = 1; i <= plist3.indx - 1; i++)
for (j = i + 1; j <= plist3.indx; j++)
if (libList[i] < libList[j])
{
tl = libList[i];
libList[i] = libList[j];
libList[j] = tl;
tp = plist3.p[i];
plist3.p[i] = plist3.p[j];
plist3.p[j] = tp;
}
}
for (i = 1; i <= plist3.indx; i++)
{
*savex = plist3.p[i].px;
*savey = plist3.p[i].py;
if (legal[*savex][*savey])
{
smark = playMark;
tryPlay(*savex, *savey, me);
- pause();
+//pause();
if (gList[gMap[groupIDs[*savex][*savey]]].libC > 1)
if (gList[gMap[groupIDs[gx][gy]]].libC > treeLibLim)
{
restoreState();
/* sClearChar(sChar, rXor); */
return TRUE;
}
else if (gList[gMap[groupIDs[gx][gy]]].libC > 1)
if (! killable(gx, gy, &gx1, &gx2))
{
restoreState();
/* sClearChar(sChar, rXor); */
return TRUE;
}
undoTo(smark);
}
}
result = FALSE;
one:
restoreState();
/* sClearChar(sChar, rXor); */
return result;
} /* saveable */
/*
marks unsavable groups as dead
*/
markDead()
{ /* markDead */
short i, j, gx, gy, result;
#ifdef DEBUG
printf( "markDead\n" );
#endif
for (i = 1; i <= maxGroupID; i++)
if (killable(gList[i].lx, gList[i].ly, &gx, &gy))
result = ! saveable(gList[i].lx, gList[i].ly, &gx, &gy);
else
result = FALSE;
for (i = 0; i <= maxPoint; i++)
for (j = 0; j <= maxPoint; j++)
if (bord[i][j] == 0)
ndbord[i][j] = 0;
else if (gList[groupIDs[i][j]].isDead)
ndbord[i][j] = 0;
else
ndbord[i][j] = bord[i][j];
} /* markDead */
/*
marks groups with two eyes as live
*/
MLspan(x, y, saw1, sawm1, size, sMark)
short x, y, *saw1, *sawm1, *size, sMark;
{ /* span */
if (ndbord[x][y] == 1)
*saw1 = TRUE;
else if (ndbord[x][y] == -1)
*sawm1 = TRUE;
else if (sGroups[x][y] == 0)
{
sGroups[x][y] = sMark;
*size = *size + 1;
if (x > 0)
MLspan(x - 1, y, saw1, sawm1, size, sMark);
if (x < maxPoint)
MLspan(x + 1, y, saw1, sawm1, size, sMark);
if (y > 0)
MLspan(x, y - 1, saw1, sawm1, size, sMark);
if (y < maxPoint)
MLspan(x, y + 1, saw1, sawm1, size, sMark);
}
} /* span */
short CLspan(x, y, numEyes, who)
short x, y, *numEyes, who;
{ /* span */
markBoard[x][y] = marker;
if (ndbord[x][y] == 0)
{
if ((sList[sGroups[x][y]].sm != marker) &&
(sList[sGroups[x][y]].w == who))
{
sList[sGroups[x][y]].sm = marker;
if (sList[sGroups[x][y]].s > 6)
return TRUE;
*numEyes = *numEyes + 1;
if (*numEyes > 1)
return TRUE;
}
}
else if (bord[x][y] == who)
{
if ((x > 0) &&
(markBoard[x - 1][y] != marker))
if (CLspan(x - 1, y, numEyes, who)) return TRUE;
if ((x < maxPoint) &&
diff --git a/noncore/games/go/killable.c b/noncore/games/go/killable.c
index 3ed2d2e..23a133d 100644
--- a/noncore/games/go/killable.c
+++ b/noncore/games/go/killable.c
@@ -1,251 +1,251 @@
/* By Stoney Ballard */
/* Ported from Pascal to C by Todd R. Johnson */
#include "go.h"
#include "goplayutils.h"
#include "amigo.h"
extern intBoard bord, groupIDs;
extern boolBoard legal;
extern groupRec gList[maxGroup];
extern short gMap[maxGroup], adjInAtari, adj2Libs, playMark, treeLibLim,
utilPlayLevel, killFlag, depthLimit, dbStop, showTrees;
extern pointList plist2;
/*
returns true if the group (at x, y) is killable.
if so, returns the point to play at in killx, killy.
*/
short me, him, depth, i, j, tryCount, tl, topMark, tkMark, mark2;
char sChar;
sPointList lList, dList;
point tp;
short libList[maxSPoint+1];
short esc;
short mtNbrs(x, y)
short x, y;
{ /* mtNbrs */
short n = 0;
if ((x > 0) && (bord[x - 1][y] == 0))
n = n + 1;
if ((x < maxPoint) && (bord[x + 1][y] == 0))
n = n + 1;
if ((y > 0) && (bord[x][y - 1] == 0))
n = n + 1;
if ((y < maxPoint) && (bord[x][y + 1] == 0))
n = n + 1;
return n;
} /* mtNbrs */
short killTree(tx, ty, gx, gy, escape, tkMark)
short tx, ty, gx, gy, *escape, tkMark;
{ /* killTree */
short curMark, mark2, mark3, i, j, k, tl, dStart, result;
sPointList lList1, lList2;
short libList[maxSPoint+1];
point tp;
short esc = FALSE;
tryCount = tryCount + 1;
if (tryCount > tryLimit)
{
undoTo(tkMark);
/* for (i = 1; i <= depth - 1; i++)
{
sClearChar(sChar, rXor);
} */
depth = 1;
return FALSE;
}
/* write(sChar); */
depth = depth + 1;
curMark = playMark;
tryPlay(tx, ty, me); /* try my move */
- pause();
+// pause();
if (gList[gMap[groupIDs[tx][ty]]].libC == 0) /* I'm dead */
{
result = FALSE;
goto one;
}
else if (killFlag) /* I killed something of his */
{
result = TRUE;
goto one;
}
else if (gList[gMap[groupIDs[gx][gy]]].libC > treeLibLim) /* safe */
{
result = FALSE;
goto one;
}
else
{
sSpanGroup(gx, gy, &lList1); /* find his liberties */
if (gList[gMap[groupIDs[tx][ty]]].libC == 1) /* he can kill me */
{
if (lList1.indx < maxSPoint) /* add that option to his list */
{
lList1.indx = lList1.indx + 1;
spanGroup(tx, ty, &plist2); /* find my liberty */
lList1.p[lList1.indx].px = plist2.p[1].px;
lList1.p[lList1.indx].py = plist2.p[1].py;
}
else
{
result = FALSE;
goto one;
}
}
for (i = 1; i <= maxSPoint; i++) /* init liblist so diags can be marked */
libList[i] = -1;
if ((utilPlayLevel > 4) &&
(lList1.indx > 1) &&
(gList[gMap[groupIDs[gx][gy]]].libC > 1)) /* try diags */
{
listDiags(gx, gy, &dList);
j = 0;
i = lList1.indx;
while ((j < dList.indx) &&
(i < maxSPoint))
{
j = j + 1;
i = i + 1;
libList[i] = 0; /* mark this as a diag */
lList1.p[i].px = dList.p[j].px;
lList1.p[i].py = dList.p[j].py;
}
lList1.indx = i;
}
if (lList1.indx > 1) /* sort by decreasing lib count */
{
for (i = 1; i <= lList1.indx; i++)
if (libList[i] != 0) /* diags are tried last */
{
mark2 = playMark;
tryPlay(lList1.p[i].px, lList1.p[i].py, him);
libList[i] = gList[gMap[groupIDs[gx][gy]]].libC;
if ((libList[i] > treeLibLim) ||
((libList[i] > (depthLimit - depth)) &&
(libList[i] > 2)))
{
*escape = TRUE;
result = FALSE;
goto one;
}
undoTo(mark2);
}
for (i = 1; i <= lList1.indx - 1; i++)
for (j = i + 1; j <= lList1.indx; j++)
if (libList[i] < libList[j])
{
tl = libList[i];
libList[i] = libList[j];
libList[j] = tl;
tp = lList1.p[i];
lList1.p[i] = lList1.p[j];
lList1.p[j] = tp;
}
}
for (i = 1; i <= lList1.indx + 1; i++) /* try his responses */
{
mark2 = playMark;
if (i <= lList1.indx) /* try his move */
{
tryPlay(lList1.p[i].px, lList1.p[i].py, him); /* play his response */
- pause();
+// pause();
if (gList[gMap[groupIDs[lList1.p[i].px]
[lList1.p[i].py]]].libC < 2)
goto two; /* a bogus move */
}
else if (gList[gMap[groupIDs[gx][gy]]].libC <= 1)
{
result = TRUE;
goto one;
}
if (gList[gMap[groupIDs[gx][gy]]].libC > treeLibLim)
{
*escape = TRUE;
result = FALSE;
goto one;
}
if (gList[gMap[groupIDs[gx][gy]]].libC > 1)
{ /* look at my responses */
sSpanGroup(gx, gy, &lList2); /* list his liberties */
dStart = lList2.indx + 1;
if (adjInAtari) /* he wins */
{
result = FALSE;
goto one;
}
if ((lList2.indx > 2) && adj2Libs) /* he wins */
{
result = FALSE;
goto one;
}
for (k = 1; k <= maxSPoint; k++)
libList[k] = -1;
if (utilPlayLevel > 4) /* account for diagonal moves */
{
listDiags(gx, gy, &dList);
j = 0;
k = lList2.indx;
while ((j < dList.indx) &&
(k < maxSPoint))
{
j = j + 1;
k = k + 1;
libList[k] = 100;
lList2.p[k].px = dList.p[j].px;
lList2.p[k].py = dList.p[j].py;
}
lList2.indx = k;
}
if (lList2.indx > 1) /* sort by increasing lib count */
{
for (k = 1; k <= lList2.indx; k++)
if (libList[k] != 100) /* diags go last */
{
mark3 = playMark;
tryPlay(lList2.p[k].px, lList2.p[k].py, me);
libList[k] = gList[gMap[groupIDs[gx][gy]]].libC;
undoTo(mark3);
}
for (k = 1; k <= lList2.indx - 1; k++)
for (j = k + 1; j <= lList2.indx; j++)
if (libList[k] > libList[j])
{
tl = libList[k];
libList[k] = libList[j];
libList[j] = tl;
tp = lList2.p[k];
lList2.p[k] = lList2.p[j];
lList2.p[j] = tp;
}
else if ((libList[k] == libList[j]) &&
(libList[k] == 1))
if (mtNbrs(lList2.p[k].px, lList2.p[k].py) <
mtNbrs(lList2.p[j].px, lList2.p[j].py))
{
tl = libList[k];
libList[k] = libList[j];
libList[j] = tl;
tp = lList2.p[k];
lList2.p[k] = lList2.p[j];
lList2.p[j] = tp;
}
}
for (j = 1; j <= lList2.indx; j++)
{
if (killTree(lList2.p[j].px, lList2.p[j].py, gx,
gy, &esc, tkMark))
goto two; /* this kills him */
if (esc && (j >= dStart))
{
result = FALSE;
goto one; /* don't bother with more diags if escapes */
}
}
result = FALSE; /* none of my responses kills him */
goto one;
}
two: