黑马程序员技术交流社区
标题:
练习编程,五子棋,判断赢得棋局的算法
[打印本页]
作者:
wyasln
时间:
2015-11-25 20:51
标题:
练习编程,五子棋,判断赢得棋局的算法
练习编程,五子棋,写了个判断是否赢得棋局的算法,大家看看对不对,有什么改进的
还没运行,不知道有错没,待会看结果
//每次落子后判断是否赢得棋局
public boolean isWin(int x,int y,char cc)
{
//棋手输入的坐标为1-15,转换0-14
int xPos = x - 1;
int yPos = y - 1;
//横向检测
int x1 = 0;
for(int i = 1;i < 5;i++)
{
//超出棋盘
if((xPos - i) < 0)
{
//结束左横向检测
break;
}
//统计相同棋子数
if(board[xPos - i][yPos] == cc)
{
x1++;
}
}
for(int i = 1;i < 5-x1 ;i++)
{
//超出棋盘
if(xPos + i > 14)
{
//结束右横向检测
break;
}
if(board[xPos + i][yPos] == cc)
{
x1++;
}
}
if(x1 >= 4)
{
return true;
}
//纵向检测
int x2 = 0;
for(int i = 1;i < 5;i++)
{
//超出棋盘
if((yPos - i) < 0)
{
//结束上纵向检测
break;
}
//统计相同棋子数
if(board[xPos][yPos - i] == cc)
{
x2++;
}
}
for(int i = 1;i < 5-x2 ;i++)
{
//超出棋盘
if(yPos + i > 14)
{
//结束下纵向检测
break;
}
if(board[xPos][yPos + i] == cc)
{
x2++;
}
}
if(x2 >= 4)
{
return true;
}
//斜下检测
int x3 = 0;
for(int i = 1;i < 5;i++)
{
//超出棋盘
if((xPos - i) < 0 || (yPos - i) < 0)
{
//结束上斜下向检测
break;
}
//统计相同棋子数
if(board[xPos - i][yPos - i] == cc)
{
x3++;
}
}
for(int i = 1;i < 5-x3;i++)
{
//超出棋盘
if(xPos + i > 14 || (yPos + i) > 14)
{
//结束下斜下向检测
break;
}
if(board[xPos + i][yPos + i] == cc)
{
x3++;
}
}
if(x3 >= 4)
{
return true;
}
//斜上检测
int x4 = 0;
for(int i = 1;i < 5;i++)
{
//超出棋盘
if((xPos + i) >14 || (yPos - i) < 0)
{
//结束上斜上向检测
break;
}
//统计相同棋子数
if(board[xPos + i][yPos - i] == cc)
{
x4++;
}
}
for(int i = 1;i < 5-x4;i++)
{
//超出棋盘
if(xPos - i < 0 || (yPos + i) > 14)
{
//结束下斜下向检测
break;
}
if(board[xPos - i][yPos + i] == cc)
{
x4++;
}
}
if(x4 >= 4)
{
return true;
}
return false;
}
作者:
wyasln
时间:
2015-11-25 23:43
晕,没人看啊,改到现在,终于完成了,能再cmd里正常下五子棋了
//每次落子后判断是否赢得棋局
public boolean isWin(int x,int y,char cc)
{
//棋手输入的坐标为1-15,转换0-14
int xCo = y - 1;
int yCo = x - 1;
//横向检测
int x1 = 0;
for(int i = 1;i < 5;i++)
{
//超出棋盘
if((yCo - i) < 0)
{
//结束左横向检测
break;
}
//统计相同棋子数
if(board[xCo][yCo - i] == BLACK)
{
x1++;
}
}
int j1 = x1;
for(int i = 1;i < 5-j1 ;i++)
{
//超出棋盘
if(yCo + i > 14)
{
//结束右横向检测
break;
}
if(board[xCo][yCo+i] == BLACK)
{
x1++;
}
}
if(x1 >= 4)
{
return true;
}
//纵向检测
int x2 = 0;
for(int i = 1;i < 5;i++)
{
//超出棋盘
if((xCo - i) < 0)
{
//结束上纵向检测
break;
}
//统计相同棋子数
if(board[xCo - i][yCo] == cc)
{
x2++;
}
}
int j2 = x2;
for(int i = 1;i < 5-j2 ;i++)
{
//超出棋盘
if(xCo + i > 14)
{
//结束下纵向检测
break;
}
if(board[xCo + i][yCo] == cc)
{
x2++;
}
}
if(x2 >= 4)
{
return true;
}
//斜下检测
int x3 = 0;
for(int i = 1;i < 5;i++)
{
//超出棋盘
if((xCo - i) < 0 || (yCo - i) < 0)
{
//结束上斜下向检测
break;
}
//统计相同棋子数
if(board[xCo - i][yCo - i] == cc)
{
x3++;
}
}
int j3 = x3;
for(int i = 1;i < 5-j3;i++)
{
//超出棋盘
if(xCo + i > 14 || (yCo + i) > 14)
{
//结束下斜下向检测
break;
}
if(board[xCo + i][yCo + i] == cc)
{
x3++;
}
}
if(x3 >= 4)
{
return true;
}
//斜上检测
int x4 = 0;
for(int i = 1;i < 5;i++)
{
//超出棋盘
if((yCo + i) >14 || (xCo - i) < 0)
{
//结束上斜上向检测
break;
}
//统计相同棋子数
if(board[xCo - i][yCo + i] == cc)
{
x4++;
}
}
int j4 = x4;
for(int i = 1;i < 5-j4;i++)
{
//超出棋盘
if((yCo - i) < 0 || (xCo + i) > 14)
{
//结束下斜下向检测
break;
}
if(board[xCo + i][yCo - i] == cc)
{
x4++;
}
}
if(x4 >= 4)
{
return true;
}
return false;
}
作者:
wyasln
时间:
2015-11-25 23:45
自己想的判断赢得棋局的算法,功能正常,不知道有没有更简便的算法
和计算机下的,每个计算机的落子写算法,完全随机
作者:
wyasln
时间:
2015-11-26 09:32
论坛貌似不支持直接贴图片
程序运行截图贴不出来,时间有限,以后改改增加电脑的AI
作者:
Camwly
时间:
2015-11-26 11:27
不错,加油
作者:
wyasln
时间:
2015-11-26 19:41
还是有bug的比如● ●●●●
最后落第二子的时候判断赢了,虽然前面有空的,修改了算法
//每次落子后判断是否赢得棋局
public boolean isWin(int x,int y,char cc)
{
//棋手输入的坐标为1-15,转换0-14
int xCo = y - 1;
int yCo = x - 1;
//横向检测
int x1 = 0;
for(int i = 1;i < 5;i++)
{
//超出棋盘
if((yCo - i) < 0 || board[xCo][yCo - i] != cc)
{
//结束左横向检测
break;
}
x1++;
}
int j1 = x1;
for(int i = 1;i < 5-j1 ;i++)
{
//超出棋盘或者没棋子
if(yCo + i > 14 || board[xCo][yCo+i] != cc)
{
//结束右横向检测
break;
}
x1++;
}
if(x1 >= 4)
{
return true;
}
//纵向检测
int x2 = 0;
for(int i = 1;i < 5;i++)
{
//超出棋盘或者没棋子
if((xCo - i) < 0 || board[xCo - i][yCo] != cc)
{
//结束上纵向检测
break;
}
x2++;
}
int j2 = x2;
for(int i = 1;i < 5-j2 ;i++)
{
//超出棋盘或者没棋子
if(xCo + i > 14 || board[xCo + i][yCo] != cc)
{
//结束下纵向检测
break;
}
x2++;
}
if(x2 >= 4)
{
return true;
}
//右斜检测
int x3 = 0;
for(int i = 1;i < 5;i++)
{
//超出棋盘或者没棋子
if((xCo - i) < 0 || (yCo - i) < 0 || board[xCo - i][yCo - i] != cc)
{
//结束上斜下向检测
break;
}
x3++;
}
int j3 = x3;
for(int i = 1;i < 5-j3;i++)
{
//超出棋盘或者没棋子
if(xCo + i > 14 || (yCo + i) > 14 || board[xCo + i][yCo + i] != cc)
{
//结束下斜下向检测
break;
}
x3++;
}
if(x3 >= 4)
{
return true;
}
//左斜检测
int x4 = 0;
for(int i = 1;i < 5;i++)
{
//超出棋盘或者没棋子
if((yCo + i) >14 || (xCo - i) < 0 || board[xCo - i][yCo + i] != cc)
{
//结束上斜上向检测
break;
}
x4++;
}
int j4 = x4;
for(int i = 1;i < 5-j4;i++)
{
//超出棋盘或者没棋子
if((yCo - i) < 0 || (xCo + i) > 14 || board[xCo + i][yCo - i] != cc)
{
//结束下斜下向检测
break;
}
x4++;
}
if(x4 >= 4)
{
return true;
}
return false;
}
作者:
yuhongzhen
时间:
2015-11-26 19:59
继续努力吧,我还写不了这样的代码呢
作者:
eddy1820
时间:
2015-11-26 20:03
不錯喔,感謝分享
作者:
超级宝贝乐爷
时间:
2015-11-26 20:26
辣么多 ,完全看不懂了!!!!!!!!!!!!!!!!!!!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2