我的代码有点问题 请大家帮忙看下。

ffhelly 2009-03-24 12:36:28
现在我做的是五子棋的判断左斜的。。
思路是 点到一个点 然后判断这个点前面4个点 和后面4个点之间 有没有坐标值相等的。

我的代码如下。。。
怎么判断 都是FALSE 请高手帮忙指点修改一下。

private bool InclinedKing(int x, int y, int colors)
{
int p = 35;
int h = 0, k = 0;
int h1 = 0, k1 = 0;
for (int t = 1; t <= 4; t++)
{

if (x - p * t < 0) break; else h = x - p * t;
if (y - p * t < 0) break; else k = y - p * t;
}
for (int z = 1; z <= 4; z++)
{

if (x + p * z > 516) break; else h1 = x + p * z;
if (y + p * z > 516) break; else k1 = y + p * z;
}
for (int i = 0; i < 9; i++)
{
if (k + p * i > 516) continue;
if (h + p * i > 516) continue;
int index = 1;

for (int j = 1; j < 5; j++)
{
if (k + p * j > 516) continue;
if (h + p * j > 516) continue;
if (h + p * j + p * i > 516) continue;
if (k + p * i + p * j > 516) continue;
//int xxx = h + p * i;
// int xx = k + p * i;
// int xxxx = h + p * j+p*i;
// int x1 = k + p * j+p*i;
if(pp[h+p*i,k+p*i]==colors&&pp[(h+p*i)+j*p,(k+p*i)+j*p]==colors)
{
index++;
if (index == 4)
{
return true;
}
else
{
index = 1;
}
}

}
}
return false;
}
...全文
124 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ffhelly 2009-03-24
  • 打赏
  • 举报
回复
顶一下
cxzy0930 2009-03-24
  • 打赏
  • 举报
回复
是了, int index = 1; //增量 应该放在for循环外边定义
coodd 2009-03-24
  • 打赏
  • 举报
回复
一步步调试,看看每一步执行完变量值是不是你想要的。
Sfly_189 2009-03-24
  • 打赏
  • 举报
回复
比如是N*N的棋盘
建一个point[N][N]存放棋盘坐标点,一一对应
建一个chess[N][N]存放下的棋子,与棋盘一一对应
然后每下一个棋,循环一遍point[N][N],得到此时棋子在棋盘上的对应位置
让后对chess[N][N]分左,右,上,下,左上,右下,左下,右上 循环
只需循环4次,判断是不是跟你当前棋子想等,不等则break,count清零。
只要得到count>=5则可
ffhelly 2009-03-24
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 alen0707 的回复:]
index++;
if (index == 4)
{
return true;
}
else //有一个不是的话 增量就为1
{
index = 1;
}

仔细想想这个吧!index是不可能到4的吧!每次都被你置为1了,怎么也到不了4的啊!
不知道你的其它的地方还有没有改变index的值的没?如果没有的话,这个就应该有问题的!
[/Quote]

对哦 - - 我的INDEX 判断位置错了。。。
ffhelly 2009-03-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 Sfly_189 的回复:]
上次好像你问过了啊,我给了你代码了。怎么还问
[/Quote]

- - 你给的好像不是C#的吧 C\C++的。。。没学过
那个我实在没看懂。。。
alen0707 2009-03-24
  • 打赏
  • 举报
回复
index++;
if (index == 4)
{
return true;
}
else //有一个不是的话 增量就为1
{
index = 1;
}

仔细想想这个吧!index是不可能到4的吧!每次都被你置为1了,怎么也到不了4的啊!
不知道你的其它的地方还有没有改变index的值的没?如果没有的话,这个就应该有问题的!
ffhelly 2009-03-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 Sfly_189 的回复:]
for (int t = 1; t <= 4; t++)
{

if (x - p * t < 0) break; else h = x - p * t; //以点击点往左上移动4位的X,Y坐标值

if (y - p * t < 0) break; else k = y - p * t;
}
for (int z = 1; z <= 4; z++)
{

if (x + p * z > 516) break; else h1 = x + p * z; //以点击点右下移动4位的…
[/Quote]
感觉好像 H1和K1没与用上。。
Sfly_189 2009-03-24
  • 打赏
  • 举报
回复
上次好像你问过了啊,我给了你代码了。怎么还问
xuanyuan01 2009-03-24
  • 打赏
  • 举报
回复
确实有问题
Sfly_189 2009-03-24
  • 打赏
  • 举报
回复
for (int t = 1; t <= 4; t++)
{

if (x - p * t < 0) break; else h = x - p * t; //以点击点往左上移动4位的X,Y坐标值

if (y - p * t < 0) break; else k = y - p * t;
}
for (int z = 1; z <= 4; z++)
{

if (x + p * z > 516) break; else h1 = x + p * z; //以点击点右下移动4位的X,Y坐标值

if (y + p * z > 516) break; else k1 = y + p * z;
}
这边h1,k1都被覆盖掉了,历史数据都没保存下来
ffhelly 2009-03-24
  • 打赏
  • 举报
回复
private bool InclinedKing(int x, int y, int colors)
{
int p = 35; //2个交叉点之间的距离
int h = 0, k = 0;
int h1 = 0, k1 = 0;
for (int t = 1; t <= 4; t++)
{

if (x - p * t < 0) break; else h = x - p * t; //以点击点往左上移动4位的X,Y坐标值

if (y - p * t < 0) break; else k = y - p * t;
}
for (int z = 1; z <= 4; z++)
{

if (x + p * z > 516) break; else h1 = x + p * z; //以点击点右下移动4位的X,Y坐标值

if (y + p * z > 516) break; else k1 = y + p * z;
}
for (int i = 0; i < 9; i++)
{
if (k + p * i > 516) continue; //XY超过516就跳过
if (h + p * i > 516) continue;
int index = 1; //增量

for (int j = 1; j < 5; j++)
{
if (k + p * j > 516) continue;
if (h + p * j > 516) continue;
if (h + p * j + p * i > 516) continue;
if (k + p * i + p * j > 516) continue;
//int xxx = h + p * i;
// int xx = k + p * i;
// int xxxx = h + p * j+p*i;
// int x1 = k + p * j+p*i;
if(pp[h+p*i,k+p*i]==colors&&pp[(h+p*i)+j*p,(k+p*i)+j*p]==colors) //如果对应5次都是同一个棋子的话 就TRUE
{
index++;
if (index == 4)
{
return true;
}
else //有一个不是的话 增量就为1
{
index = 1;
}
}

}
}
return false;
}
Sfly_189 2009-03-24
  • 打赏
  • 举报
回复
麻烦你想让人看你代码至少把变量的意义个注释上
ffhelly 2009-03-24
  • 打赏
  • 举报
回复
刚测试了一下 有点怀疑是不是判断语句的问题
if(pp[h+p*i,k+p*i]==colors&&pp[(h+p*i)+j*p,(k+p*i)+j*p]==colors)
点了几个点了后 在这段IF里的 INDEX始终没++ 是不是这个错了?

这句。。
对应的是 我传过来XY还有棋子的颜色
我的目的是想循环5次 看看是否这几个子的颜色都相同
例如 123456789 从1开始判断5次 就是 12345 接着判断23456 大概就这意思。。
ffhelly 2009-03-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dell0923 的回复:]
比如说下面的代码:
for (int t = 1; t <= 4; t++)
{

if (x - p * t < 0) break; else h = x - p * t;
if (y - p * t < 0) break; else k = y - p * t;
}
当x - p * t < 0时,break了,if (y - p * t < 0) break; else k = y - p * t;就执行不到,会不会这个原因?

再如下面的:
for (int i = 0; i < 9; i++)…
[/Quote]

这段死循环倒是不会。。。

现在的整体效果就是点了 没反应 判断INDEX的时候 一直都是FALSE。。
ffhelly 2009-03-24
  • 打赏
  • 举报
回复
我只是让他们不要越界。。
毕竟期盼棋盘空间比较小 如果越界了 就跳出这个数
实在是被搞的头大了。。。
dell0923 2009-03-24
  • 打赏
  • 举报
回复
比如说下面的代码:
for (int t = 1; t <= 4; t++)
{

if (x - p * t < 0) break; else h = x - p * t;
if (y - p * t < 0) break; else k = y - p * t;
}
当x - p * t < 0时,break了,if (y - p * t < 0) break; else k = y - p * t;就执行不到,会不会这个原因?

再如下面的:
for (int i = 0; i < 9; i++)
{
if (k + p * i > 516) continue;
if (h + p * i > 516) continue;
一旦if (k + p * i > 516)是true,你continue后,i增加1,p=35,必然导致if (k + p * i > 516)仍然是true,这里用continue和break的效果是一样的了,会不会是这个原因?

下面的代码与上面的分析一样:
for (int j = 1; j < 5; j++)
{
if (k + p * j > 516) continue;
if (h + p * j > 516) continue;

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧