📄 blackvswhite.java
字号:
}
}
//如果可以占据四个角,先占4个角
if(grid[0] == 0)
{
replace2 = isGood(0,0,3,2);
if(replace2 >= 1)
{
replace1 = replace2;
cplace1 = 0;
cplace2 = 0;
}
}
else if(grid[DIM - 1] == 0)
{
replace2 = isGood(0,DIM - 1,3,2);
if(replace2 >= 1)
{
replace1 = replace2;
cplace1 = 0;
cplace2 = DIM - 1;
}
}
else if(grid[(DIM - 1) * DIM] == 0)
{
replace2 = isGood(DIM - 1,0,3,2);
if(replace2 >= 1)
{
replace1 = replace2;
cplace1 = DIM - 1;
cplace2 = 0;
}
}
else if(grid[(DIM - 1) * DIM + DIM - 1] == 0)
{
replace2 = isGood(DIM - 1,DIM - 1,3,2);
if(replace2 >= 1)
{
replace1 = replace2;
cplace1 = DIM - 1;
cplace2 = DIM - 1;
}
}
blueNotMoving = false;
//如果电脑替换玩家棋子的数目大于零时
if (replace1 > 0)
{
//将格子中的棋子设为蓝棋
grid[cplace1 * DIM + cplace2] = BLUE;
//并将相应两个蓝棋间的红棋由蓝棋取而代之
change(cplace1, cplace2, 3, 2, 4);
}
//否则放弃这一步
else
blueNotMoving = true;
}
//电脑出棋函数
//专家级别
public synchronized void blueMove3()
{
//replace1,replace2用来记录替换玩家棋子的数目
int replace1 = -1;
int replace2 = -1;
//cplace1,cplace2用来记录电脑放置棋子的位置
int cplace1 = -1;
int cplace2 = -1;
int uptodown;
int lefttoright;
//从上往下,从左至右,分析在每一个空白各自上,
//电脑放棋后,所能替换玩家棋子的数目,取数目
//最大时的格子,如果有几个最大值,取最先者
for (uptodown = 0; uptodown < DIM; ++uptodown)
{
for (lefttoright = 0; lefttoright < DIM; ++lefttoright)
{
//如果格子是空白时 DIM是单方向上的格子数
if (grid[uptodown * DIM + lefttoright] == 0)
{
//获取替换玩家棋子的数目
replace2 = isGood(uptodown, lefttoright, 3, 2);
//取数目最大时的格子的位置值(cplace1,cplace2)
if (replace1 < replace2 && replace2 > 0) {
replace1 = replace2;
cplace1 = uptodown;
cplace2 = lefttoright;
}
}
}
}
//如果可以占据四条边
//先占据四条边
for (uptodown = 0; uptodown < DIM; ++uptodown)
{
if(grid[uptodown * DIM] == 0)
{
replace2 = isGood(uptodown, 0, 3, 2);
//如果可以放
if(replace2 >= 1)
{
replace1 = replace2;
cplace1 = uptodown;
cplace2 = 0;
}
}
}
for (uptodown = 0; uptodown < DIM; ++uptodown)
{
if(grid[uptodown * DIM + DIM - 1] == 0)
{
replace2 = isGood(uptodown, DIM -1, 3, 2);
//如果可以放
if(replace2 >= 1)
{
replace1 = replace2;
cplace1 = uptodown;
cplace2 = DIM - 1;
}
}
}
for (lefttoright = 0; lefttoright < DIM; ++lefttoright)
{
if(grid[lefttoright] == 0)
{
replace2 = isGood(0, lefttoright, 3, 2);
//如果可以放
if(replace2 >= 1)
{
replace1 = replace2;
cplace1 = 0;
cplace2 = lefttoright;
}
}
}
for (lefttoright = 0; lefttoright < DIM; ++lefttoright)
{
if(grid[(DIM - 1) * DIM + lefttoright] == 0)
{
replace2 = isGood(DIM - 1, lefttoright, 3, 2);
//如果可以放
if(replace2 >= 1)
{
replace1 = replace2;
cplace1 = DIM - 1;
cplace2 = lefttoright;
}
}
}
//如果可以占据四个角,先占4个角
if(grid[0] == 0)
{
replace2 = isGood(0,0,3,2);
if(replace2 >= 1)
{
replace1 = replace2;
cplace1 = 0;
cplace2 = 0;
}
}
else if(grid[DIM - 1] == 0)
{
replace2 = isGood(0,DIM -1,3,2);
if(replace2 >= 1)
{
replace1 = replace2;
cplace1 = 0;
cplace2 = DIM - 1;
}
}
else if(grid[(DIM - 1) * DIM] == 0)
{
replace2 = isGood(DIM - 1,0,3,2);
if(replace2 >= 1)
{
replace1 = replace2;
cplace1 = DIM - 1;
cplace2 = 0;
}
}
else if(grid[(DIM - 1) * DIM + DIM - 1] == 0)
{
replace2 = isGood(DIM - 1,DIM - 1,3,2);
if(replace2 >= 1)
{
replace1 = replace2;
cplace1 = DIM - 1 ;
cplace2 = DIM - 1;
}
}
blueNotMoving = false;
//如果电脑替换玩家棋子的数目大于零时
if (replace1 > 0)
{
//将格子中的棋子设为蓝棋
grid[cplace1 * DIM + cplace2] = BLUE;
//并将相应两个蓝棋间的红棋由蓝棋取而代之
change(cplace1, cplace2, 3, 2, 4);
}
//否则放弃这一步
else
blueNotMoving = true;
}
//计算能够替换对方棋子的数目
//其中前两个参数为格子的位置
//后两个参数为双方棋子的颜色值
public synchronized int isGood(int replace1, int replace2, int colorb, int colorr)
{
//前两个数据分别用于记录某个方向上能替换棋子的数目
//和累计8个方向上能替换对方棋子的总数目
int recordnum = 0;
int totalnum = 0;
int num7;
int num8;
int num9;
int num10;
//记录右方能够替换棋子的数目
for (num8 = replace2 + 1; num8 < DIM; ++num8)
{
if (grid[replace1 * DIM + num8] == colorr)
++recordnum;
//如果是对方的棋子 +1
else
{
if (grid[replace1 * DIM + num8] == colorb)
break;
//如果是自己的棋子,跳出循环
//如果是NONE也要跳出
if (grid[replace1 * DIM + num8] == 0||grid[replace1 * DIM + num8] == 1)
{
recordnum = 0;
break;
//如果方向上有空白,就置零
}
}
}
//如果大于格数,表示右边都是对方棋子
if (num8 >= DIM)
recordnum = 0;
//数目为零 累计
totalnum += recordnum;
//临时记录清零
recordnum = 0;
//记录左方能替换对方棋子的数目
for (num8 = replace2 - 1; num8 >= 0; --num8)
{
if (grid[replace1 * DIM + num8] == colorr)
++recordnum;
//对方棋子,加1
else {
if (grid[replace1 * DIM + num8] == colorb)
break;
//自己棋子,结束
if (grid[replace1 * DIM + num8] == 0||grid[replace1 * DIM + num8] == 1)
{
recordnum = 0;
break;
}
}
}
//如果左方全是对方的棋子
if (num8 <= -1)
recordnum = 0;
//累计数目
totalnum += recordnum;
recordnum = 0;
//记录下方能够替换对方棋子的数目
for (num7 = replace1 + 1; num7 < DIM; ++num7)
{
//从下方开始数
if (grid[num7 * DIM + replace2] == colorr)
++recordnum;
else {
if (grid[num7 * DIM + replace2] == colorb)
break;
//同理
if (grid[num7 * DIM + replace2] == 0||grid[num7 * DIM + replace2] == 1)
{
recordnum = 0;
break;
}
}
}
if (num7 >= DIM)
recordnum = 0;
totalnum += recordnum;
recordnum = 0;
//记录上方替换棋子的数目
num7 = replace1 - 1;
//从上方开始
while (num7 >= 0)
{
if (grid[num7 * DIM + replace2] == colorr)
++recordnum;
//对方棋子,加1
if (grid[num7 * DIM + replace2] == colorb)
break;
//找到自己的棋子,完成
if (grid[num7 * DIM + replace2] == 0||grid[num7 * DIM + replace2] == 1)
{
recordnum = 0;
break;
}
else
//上移动
--num7;
}
if (num7 <= -1)
recordnum = 0;
//累计数据
totalnum += recordnum;
//临时数据清零
recordnum = 0;
//记录右上方能够替换对方棋子的数目
//从右一个开始
num9 = replace2 + 1;
//从上一个开始
num10 = replace1 - 1;
while (num9 >= 0 && num10 >= 0)
{
//乘法和加法实现定位
if (grid[num10 * DIM + num9] == colorr)
++recordnum;
if (grid[num10 * DIM + num9] == colorb)
break;
if (grid[num10 * DIM + num9] == 0||grid[num10 * DIM + num9] == 1)
{
recordnum = 0;
break;
}
else
{
//向右上方移动棋子
++num9;
--num10;
}
}
//到达边界
//如果满足条件,说明右上方都是对方棋子
if (num9 >= DIM || num10 <= -1)
recordnum = 0;
//累计数目
totalnum += recordnum;
//清零
recordnum = 0;
//记录右下方替换的棋子
num9 = replace2 + 1;
for (num10 = replace1 + 1; num9 < DIM && num10 < DIM; ++num10)
{
if (grid[num10 * DIM + num9] == colorr)
++recordnum;
else
{
if (grid[num10 * DIM + num9] == colorb)
break;
if (grid[num10 * DIM + num9] == 0||grid[num10 * DIM + num9] == 1)
{
recordnum = 0;
break;
}
}
++num9;
}
if (num9 >= DIM || num10 >= DIM)
recordnum = 0;
totalnum += recordnum;
recordnum = 0;
//记录左上方替换棋子的数目
num9 = replace2 - 1;
for (num10 = replace1 - 1; num9 >= 0 && num10 >= 0; --num10)
{
if (grid[num10 * DIM + num9] == colorr)
++recordnum;
else
{
if (grid[num10 * DIM + num9] == colorb)
break;
if (grid[num10 * DIM + num9] == 0||grid[num10 * DIM + num9] == 1)
{
recordnum = 0;
break;
}
}
--num9;
}
if (num9 <= -1 || num10 <= -1)
recordnum = 0;
totalnum += recordnum;
recordnum = 0;
//记录左下方替换棋子的数目
num9 = replace2 - 1;
for (num10 = replace1 + 1; num9 < DIM && num10 < DIM; ++num10)
{
if (grid[num10 * DIM + num9] == colorr)
++recordnum;
else
{
if (grid[num10 * DIM + num9] == colorb)
break;
if (grid[num10 * DIM + num9] == 0||grid[num10 * DIM + num9] == 1)
{
recordnum = 0;
break;
}
}
--num9;
}
if (num9 <= -1 || num10 >= DIM)
recordnum = 0;
totalnum += recordnum;
return totalnum;
}
//替换棋子的函数
//前两个参数代表放置棋子格子的位置
//接下来是棋子的颜色值,和临时颜色
//用paint函数,对颜色重新绘制
public synchronized void change(int replace1, int replace2, int colorb, int colorr,
int tempcolor)
{
int judgenum = 0;
int num8 = replace2 + 1;
int num7;
int num9;
int num10;
int num11;
int num12;
int num13;
int num14;
int num15;
int num16;
int num17;
int num18;
int num19;
//判断右方是否有自己的棋子
while (num8 < DIM)
{
num7 = replace1 * DIM + num8;
if (grid[num7] != colorr)
{
//如果有,则将num6置为1,并跳出循环
if (grid[num7] == colorb)
judgenum = 1;
break;
}
else
++num8;
}
//如果右方有自己方的棋子,就将之间棋子的颜色设置为本方棋子临时颜色
if (judgenum != 0)
{
for (num9 = replace2 + 1; num9 < DIM; ++num9)
{
num7 = replace1 * DIM + num9;
if (grid[num7] == colorr)
grid[num7] = tempcolor;
else if (grid[num7] == colorb)
break;
}
}
//清零
judgenum = 0;
//判断左方是否有本方的棋子
num9 = replace2 - 1;
while (num9 >= 0)
{
num7 = replace1 * DIM + num9;
if (grid[num7] != colorr)
{
//有,置为1
if (grid[num7] == colorb)
judgenum = 1;
break;
}
else
--num9;
}
if (judgenum != 0)
{
for (num10 = replace2 - 1; num10 >= 0; --num10)
{
num7 = replace1 * DIM + num10;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -