我反编译了一个五子棋程序,没有注释,我实在是没有看懂,我找了个有注释的,但是对里面的机器人部分的代码不是很明白,希望有高手能给我指点一下。谢谢!!!!gotoValue = tk();
//检查人是否胜利
if (checkVictory())return; //模拟电脑下一个
intPlayer = 1;
int a = currentA;
int b = currentB;
qipan[gotoValue] = 2;
a = LastChessmanA;
b = LastChessmanB;
LastChessmanA = (gotoValue + 1) % lineNumber;
LastChessmanB = (gotoValue + 1 - LastChessmanA) / lineNumber + 1;
DrawChessman( (a - 1) * gridWidth + baseX,
(b - 1) * gridHeight + baseY);
DrawChessman( (LastChessmanA - 1) * gridWidth + baseX,
(LastChessmanB - 1) * gridHeight + baseY); tk();
checkVictory();
//准备人下
intPlayer = 0;
break;
}
}
} /**
private int getNumber(int x,int y)
{
return (y-baseY)*lineNumber/gridHeight+(x-baseX)/gridWidth;
}
*/ /**
* 分析当前是否有一方胜利。并找出下一步该走在何处
*/
private int tk() {
try {
int[] e = {
1, 2, 4, 12, 24}; int[] c = new int[3];
int g_b = 0; //此变量记录电脑应下于何处
int n = 0;
int p;
int a0;
int h;
int a;
int d = 0;
int z = 0; for (p = 0; p < 3; p++) { //对两个大数组清零
for (a0 = 0; a0 < lineNumber * lineNumber; a0++) {
q[p][a0] = 0;
m[p][a0] = 0;
}
} for (a0 = 0; a0 < lineNumber * lineNumber; a0++) { for (d = 0; d < 4; d++) {
if ( (a0 / lineNumber < (lineNumber - 4) || d == 0) &&
(a0 % lineNumber < (lineNumber - 4) || d == 1 || d == 2) &&
(a0 % lineNumber > 3 || d != 2)) { c[1] = 0;
c[2] = 0;
for (z = 0; z < 5; z++) {
c[qipan[a0 + z * g[d]]]++;
}
if (c[1] == 0)
p = 2;
else if (c[2] == 0)
p = 1;
else
p = 0; if (p != 0) {
for (z = 0; z < 5; z++) {
if (c[p] == 5) //记录五个子的坐标
wuzi[z] = a0 + z * g[d];
else if (qipan[a0 + z * g[d]] == 0) {
a = a0 + z * g[d];
q[0][a] += e[c[p]];
if (c[p] >= 2)
q[p][a] += e[c[p]];
if (c[p] > m[p][a])
m[p][a] = c[p];
}
}
}
}
}
for (p = 1; p < 3; p++)
if (q[p][a0] >= e[4]) {
h = 2 * m[p][a0];
if (p == 2)
h++;
if (q[0][a0] < lineNumber * lineNumber)
q[0][a0] += lineNumber * lineNumber * h;
else if (q[0][a0] < lineNumber * lineNumber * h)
q[0][a0] = lineNumber * lineNumber * h;
}
if (q[0][a0] > q[0][g_b])
n = 0;
if (q[0][a0] >= q[0][g_b]) {
n++;
if ( (rnd.nextInt() & 0x7FFFFFFF) % 1000 * n / 1000 < 1)
g_b = a0;
}
}
return g_b;
}
catch (Exception e) {
System.out.println("tk Error:" + e);
return 0;
}
} /*
* 检查是否有一方胜出,并做出相应处理
*/
private boolean checkVictory() {
if (wuzi[1] != 0) { //WuZi[1]!=0表示已经大到5个了,一方胜利
/*
for(int z=0;z<5;z++)
{
if(qipan[wuzi[z]]==1)
System.out.println("人胜"+wuzi[z]);
else
System.out.println("bot胜"+wuzi[z]);
}
*/
intRunMode = 2;
String ShowString;
if (intPlayer == 0)
ShowString = "你赢了!";
else
ShowString = "电脑赢了!";
gg.drawString(ShowString, baseX, baseY, gg.TOP | gg.LEFT);
return true; }
else {
return false;
}
}
}
//检查人是否胜利
if (checkVictory())return; //模拟电脑下一个
intPlayer = 1;
int a = currentA;
int b = currentB;
qipan[gotoValue] = 2;
a = LastChessmanA;
b = LastChessmanB;
LastChessmanA = (gotoValue + 1) % lineNumber;
LastChessmanB = (gotoValue + 1 - LastChessmanA) / lineNumber + 1;
DrawChessman( (a - 1) * gridWidth + baseX,
(b - 1) * gridHeight + baseY);
DrawChessman( (LastChessmanA - 1) * gridWidth + baseX,
(LastChessmanB - 1) * gridHeight + baseY); tk();
checkVictory();
//准备人下
intPlayer = 0;
break;
}
}
} /**
private int getNumber(int x,int y)
{
return (y-baseY)*lineNumber/gridHeight+(x-baseX)/gridWidth;
}
*/ /**
* 分析当前是否有一方胜利。并找出下一步该走在何处
*/
private int tk() {
try {
int[] e = {
1, 2, 4, 12, 24}; int[] c = new int[3];
int g_b = 0; //此变量记录电脑应下于何处
int n = 0;
int p;
int a0;
int h;
int a;
int d = 0;
int z = 0; for (p = 0; p < 3; p++) { //对两个大数组清零
for (a0 = 0; a0 < lineNumber * lineNumber; a0++) {
q[p][a0] = 0;
m[p][a0] = 0;
}
} for (a0 = 0; a0 < lineNumber * lineNumber; a0++) { for (d = 0; d < 4; d++) {
if ( (a0 / lineNumber < (lineNumber - 4) || d == 0) &&
(a0 % lineNumber < (lineNumber - 4) || d == 1 || d == 2) &&
(a0 % lineNumber > 3 || d != 2)) { c[1] = 0;
c[2] = 0;
for (z = 0; z < 5; z++) {
c[qipan[a0 + z * g[d]]]++;
}
if (c[1] == 0)
p = 2;
else if (c[2] == 0)
p = 1;
else
p = 0; if (p != 0) {
for (z = 0; z < 5; z++) {
if (c[p] == 5) //记录五个子的坐标
wuzi[z] = a0 + z * g[d];
else if (qipan[a0 + z * g[d]] == 0) {
a = a0 + z * g[d];
q[0][a] += e[c[p]];
if (c[p] >= 2)
q[p][a] += e[c[p]];
if (c[p] > m[p][a])
m[p][a] = c[p];
}
}
}
}
}
for (p = 1; p < 3; p++)
if (q[p][a0] >= e[4]) {
h = 2 * m[p][a0];
if (p == 2)
h++;
if (q[0][a0] < lineNumber * lineNumber)
q[0][a0] += lineNumber * lineNumber * h;
else if (q[0][a0] < lineNumber * lineNumber * h)
q[0][a0] = lineNumber * lineNumber * h;
}
if (q[0][a0] > q[0][g_b])
n = 0;
if (q[0][a0] >= q[0][g_b]) {
n++;
if ( (rnd.nextInt() & 0x7FFFFFFF) % 1000 * n / 1000 < 1)
g_b = a0;
}
}
return g_b;
}
catch (Exception e) {
System.out.println("tk Error:" + e);
return 0;
}
} /*
* 检查是否有一方胜出,并做出相应处理
*/
private boolean checkVictory() {
if (wuzi[1] != 0) { //WuZi[1]!=0表示已经大到5个了,一方胜利
/*
for(int z=0;z<5;z++)
{
if(qipan[wuzi[z]]==1)
System.out.println("人胜"+wuzi[z]);
else
System.out.println("bot胜"+wuzi[z]);
}
*/
intRunMode = 2;
String ShowString;
if (intPlayer == 0)
ShowString = "你赢了!";
else
ShowString = "电脑赢了!";
gg.drawString(ShowString, baseX, baseY, gg.TOP | gg.LEFT);
return true; }
else {
return false;
}
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货