summaryrefslogtreecommitdiff
authorzecke <zecke>2004-04-30 13:27:34 (UTC)
committer zecke <zecke>2004-04-30 13:27:34 (UTC)
commitb313bfcc63e972b1dfe059d91fe364d535478c7c (patch) (side-by-side diff)
tree36c52526da889598133698cb7c914fbe134c9594
parent7829ac6b0577bf2398110f327a4b5e40435c105b (diff)
downloadopie-b313bfcc63e972b1dfe059d91fe364d535478c7c.zip
opie-b313bfcc63e972b1dfe059d91fe364d535478c7c.tar.gz
opie-b313bfcc63e972b1dfe059d91fe364d535478c7c.tar.bz2
some long outstanding 'freeze' bug..
having a function pause(){} conflicts with linux version of pause. So instead of doing nothing... we were forced to pause(2)
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
@@ -727,385 +727,385 @@ short x, y, z;
{
nlcGroup.indx = nlcGroup.indx + 1;
nlcGroup.v[nlcGroup.indx] = gMap[groupIDs[x][y - 1]];
}
if ((y < maxPoint) && (bord[x][y + 1] == him))
{
nlcGroup.indx = nlcGroup.indx + 1;
nlcGroup.v[nlcGroup.indx] = gMap[groupIDs[x][y + 1]];
}
/* fix liberty count for affected groups */
grpMark = grpMark + 1;
for (i = 1; i <= nlcGroup.indx; i++)
if (gList[nlcGroup.v[i]].groupMark != grpMark)
{
if (gList[nlcGroup.v[i]].atLevel != tryLevel)
{
playMark = playMark + 1;
playStack[playMark].kind = chLib;
playStack[playMark].gID = nlcGroup.v[i];
playStack[playMark].uval.chLib.oldLevel =
gList[nlcGroup.v[i]].atLevel;
playStack[playMark].uval.chLib.oldLC =
gList[nlcGroup.v[i]].libC;
}
gList[nlcGroup.v[i]].groupMark = grpMark;
gList[nlcGroup.v[i]].atLevel = tryLevel;
spanGroup(gList[nlcGroup.v[i]].lx, gList[nlcGroup.v[i]].ly, &pPlist);
gList[nlcGroup.v[i]].libC = pPlist.indx;
}
} /* plei */
saveState()
{ /* saveState */
playMark = 0;
tryLevel = 0;
newGID = maxGroupID;
} /* saveState */
/*
undoes a move sequence back to uMark
*/
undoTo(uMark)
short uMark;
{ /* undoTo */
short i, xl, yl;
#ifdef DEBUG
printf( "undoTo\n" );
#endif
for (i = playMark; i >= uMark + 1; i--)
if (playStack[i].kind == rem)
{
xl = playStack[i].uval.rem.xl;
yl = playStack[i].uval.rem.yl;
bord[xl][yl] = playStack[i].uval.rem.who;
groupIDs[xl][yl] = playStack[i].gID;
if (showTrees)
sstone(playStack[i].uval.rem.who, xl, yl,
playStack[i].uval.rem.sNumber);
}
else if (playStack[i].kind == add)
{
xl = playStack[i].uval.add.xl;
yl = playStack[i].uval.add.yl;
bord[xl][yl] = 0;
groupIDs[xl][yl] = 0;
tryLevel = tryLevel - 1;
newGID = playStack[i].uval.add.nextGID;
if (showTrees)
rstone(xl, yl);
}
else if (playStack[i].kind == reMap)
gMap[playStack[i].gID] = playStack[i].uval.reMap.oldGID;
else /* change libs of group - gID is pre-mapped */
{
gList[playStack[i].gID].libC = playStack[i].uval.chLib.oldLC;
gList[playStack[i].gID].atLevel = playStack[i].uval.chLib.oldLevel;
}
playMark = uMark;
} /* undoTo */
/*
restores the state of the world after trying a move sequence
*/
restoreState()
{ /* restoreState */
#ifdef DEBUG
printf( "restoreState\n" );
#endif
if (playMark > 0)
{
undoTo(0);
playMark = 0;
tryLevel = 0;
}
} /* 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) &&
(markBoard[x + 1][y] != marker))
if (CLspan(x + 1, y, numEyes, who)) return TRUE;
if ((y > 0) &&
(markBoard[x][y - 1] != marker))
if (CLspan(x, y - 1, numEyes, who)) return TRUE;
if ((y < maxPoint) &&
(markBoard[x][y + 1] != marker))
if (CLspan(x, y + 1, numEyes, who)) return TRUE;
}
return FALSE;
} /* span */
short checkLive(x, y)
short x, y;
{ /* checkLive */
short numEyes, who;
#ifdef DEBUG
printf( "checkLive\n" );
#endif
numEyes = 0;
who = bord[x][y];
marker = marker + 1;
return CLspan(x, y, &numEyes, who);
} /* checkLive */
markLive()
{ /* markLive */
short i, j, size, sMark = 0;
short saw1, sawm1;
#ifdef DEBUG
printf( "markLive\n" );
#endif
initArray(sGroups);
for (i = 0; i <= maxPoint; i++)
for (j = 0; j <= maxPoint; j++)
if ((sGroups[i][j] == 0) &&
(ndbord[i][j] == 0))
{
size = 0;
sMark = sMark + 1;
sawm1 = FALSE;
saw1 = FALSE;
MLspan(i, j, &saw1, &sawm1, &size, sMark);
sList[sMark].s = size;
sList[sMark].sm = 0;
if (sawm1)
if (saw1)
sList[sMark].w = 0;
else
sList[sMark].w = -1;
else if (saw1)
sList[sMark].w = 1;
else
sList[sMark].w = 0;
}
for (i = 1; i <= maxGroupID; i++)
if (! gList[i].isDead)
gList[i].isLive = checkLive(gList[i].lx, gList[i].ly);
} /* markLive */
/*
generates the connection map and the protected point map.
*/
genConnects()
{ /* genConnects */
short x, y, numStones;
#ifdef DEBUG
printf( "genConnects\n" );
#endif
for (x = 0; x <= maxPoint; x++)
for (y = 0; y <= maxPoint; y++)
{
connectMap[x][y] = 0;
protPoints[x][y] = 0;
}
for (x = 0; x <= maxPoint; x++)
for (y = 0; y <= maxPoint; y++)
if (bord[x][y] == 1) /* map connections to this stone */
{
if (x > 0) /* direct connection */
connectMap[x - 1][y] += 1;
if (x < maxPoint)
connectMap[x + 1][y] += 1;
if (y > 0)
connectMap[x][y - 1] += 1;
if (y < maxPoint)
connectMap[x][y + 1] += 1;
if ((x > 0) && (y > 0) && /* diagonal connection */
(bord[x - 1][y] == 0) && (bord[x][y - 1] == 0))
connectMap[x - 1][y - 1] += 1;
if ((x < maxPoint) && (y > 0) &&
(bord[x + 1][y] == 0) && (bord[x][y - 1] == 0))
connectMap[x + 1][y - 1] += 1;
if ((x < maxPoint) && (y < maxPoint) &&
(bord[x + 1][y] == 0) && (bord[x][y + 1] == 0))
connectMap[x + 1][y + 1] += 1;
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,347 +1,347 @@
/* 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:
undoTo(mark2);
}
result = TRUE; /* none of his responses saves him */
}
one:
undoTo(curMark);
/* sClearChar(sChar, rXor); */
depth = depth - 1;
return result;
} /* killTree */
short tKillTree(tx, ty, gx, gy)
short tx, ty, gx, gy;
{ /* tKillTree */
short tkMark, escape;
tryCount = 0;
tkMark = playMark;
return killTree(tx, ty, gx, gy, &escape, tkMark);
} /* tKillTree */
short killable(gx, gy, killx, killy)
short gx, gy, *killx, *killy;
{ /* killable */
#ifdef DEBUG
printf( "killable\n" );
showTrees = TRUE;
#endif
dbStop = TRUE;
him = bord[gx][gy]; /* find out who I am */
me = -him;
/* if (me == 1)
sChar = '>';
else
sChar = '|'; */
/* write(sChar); */
depth = 1;
topMark = playMark;
sSpanGroup(gx, gy, &lList); /* find his liberties */
if (lList.indx == 1)
{
*killx = lList.p[1].px;
*killy = lList.p[1].py;
return TRUE;
}
else if (lList.indx > treeLibLim)
return FALSE;
else if (adjInAtari)
return FALSE;
else if ((lList.indx > 2) && adj2Libs)
return FALSE;
else
{
for (i = 1; i <= maxSPoint; i++)
libList[i] = -1;
if (utilPlayLevel > 4) /* account for diagonal moves */
{
listDiags(gx, gy, &dList);
j = 0;
i = lList.indx;
while ((j < dList.indx) &&
(i < maxSPoint))
{
j = j + 1;
i = i + 1;
libList[i] = 100;
lList.p[i].px = dList.p[j].px;
lList.p[i].py = dList.p[j].py;
}
lList.indx = i;
}
if (lList.indx > 1) /* sort by increasing lib count */
{
for (i = 1; i <= lList.indx; i++)
if (libList[i] != 100) /* diags go last */
{
mark2 = playMark;
tryPlay(lList.p[i].px, lList.p[i].py, me);
libList[i] = gList[gMap[groupIDs[gx][gy]]].libC;
undoTo(mark2);
}
for (i = 1; i <= lList.indx - 1; i++)
for (j = i + 1; j <= lList.indx; j++)
if (libList[i] > libList[j])
{
tl = libList[i];
libList[i] = libList[j];
libList[j] = tl;
tp = lList.p[i];
lList.p[i] = lList.p[j];
lList.p[j] = tp;
}
else if ((libList[i] == libList[j]) &&
(libList[i] == 1))
if (mtNbrs(lList.p[i].px, lList.p[i].py) <
mtNbrs(lList.p[j].px, lList.p[j].py))
{