所以我做了一个19岁到19岁的桌面游戏。它基本上是连接5,叫做Gomoku。
我想制作一个有效的算法来查找是否有' n'连续的碎片。数据存储为19x19的2D数组。但是出于问题的原因,让我们说它是6x6。
0 0 0 1 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0 1 0 0 0
0 0 0 1 0 0 0 0 0 1 0 0
0 0 0 1 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 0 1
这是' 5'的两个例子。连续1个。我如何测试HORIZONTAL,VERTICAL和DIAGONALS?
这是我效率低下的代码:
private boolean firstDiagonalCheck(int x, int y, int num) {
int count = 1;
int check = 0;
boolean rflag = true;
boolean lflag = true;
int pos = 1;
check = turnHuman + 1;
while (rflag) {
if (x + pos >= 19 || y + pos >= 19) {
rflag = false;
break;
}
if (gb.getBoard()[x + pos][y + pos] == check) {
count++;
pos++;
} else {
rflag = false;
}
}
pos = 1;
while (lflag) {
if (x - pos < 0 || y - pos < 0) {
lflag = false;
break;
}
if (gb.getBoard()[x - pos][y - pos] == check) {
count++;
pos++;
} else {
lflag = false;
}
}
if (count == num) {
return true;
}
return false;
}
这只是第一个Diagonal的一种方法。还有3个。
如何提高效率并检查所有4个方向?
编辑##################
我的代码的作用是: - 获取作品的位置(x,y) - 检查两侧(如果垂直,则上下)并计算连续两侧的数量 - 如果所需的计数匹配,(&#34; num&#34;),则返回true,否则返回false。
如果每次检查WHOLE板是否连续有碎片,那么效率会更高吗?
答案 0 :(得分:0)
int count=0;
boolean Check(int x,int y)
{
int p1;
int p2;
if(elementat[x+1][y+1]==1)
{p1=1; p2=1;}
else if(elementat[x+1][y]==1)
{p1=1; p2=0;}
else. if(elementat[x+1][y-1]==1)
{p1=1; p2=-1;}
else. if(elementat[x][y-1]==1)
{p1=0;p2=-1;}
else. if(elementat[x-1][y-1]==1)
{p1=-1; p2=-1;}
else. if(elementat[x-1][y]==1)
{p1=-1; p2=0;}
else. if(elementat[x-1][y+1]==1)
{p1=-1; p2=1;}
else. if(elementat[x][y+1]==1)
{p1=0; p2=1;}
Checknext(x,y);
Checknextinv(x,y);
If(count==5) // 5 means no. of elements to form line
{return true}
else
{return false;}
}
Checknext(x,y) //19 represents the 19x19 matrix
{ if((x+p1)<=19 && (x+p1)>=0 && (y+p2)<=19 && (y+p2)>=0)
{ if(element[x+p1][y+p2]==1)
{ count++;
checknext[x+p1][y+p2];
}
}
Checknextinv(x,y)
{ if( (x+(-1*p1))<=19 && (x+(-1*p1))>=0 && (y+(-1*p2))<=19 && (y+(-1*p2))>=0))
{
if(element[x+(-1*p1)][y+(-1*p2)]==1 )
{
count++;
checknextinv[x+(-1*p1)][y+(-1*p2)];
}
}