こんにちは
「マインゲーム」のエミュレーションを作成しようとしています
行列
0 0 0 0
0 0 -1 0
0 0 0 -1
0 -1 0 -1 があるとします。
ここで、-1 と等しくない各セルは地雷の数を表す必要があり
ます。コードは for(int i=0;i
for(int j=0;j<N;j++)
if(box[i][j]!=-1)
{
switch (i)
{
case 0:
iLEFT=0;
iRIGHT=1;break;
case 3:
iRIGHT=0;
iLEFT=1;
break;
case 1:
iLEFT=1;
iRIGHT=1;
break;
case 2:
iLEFT=1;
iRIGHT=1;
break;
default:
iLEFT=1;
iRIGHT=1;
break;
}
switch (j)
{
case 0:
jLEFT=0;`
jRIGHT=1;
break;
case 3:
jRIGHT=0;
jLEFT=1;
break;
case 1:
jLEFT=1;
jRIGHT=1;
break;
case 2:
jLEFT=1;
jRIGHT=1;
break;
default:
jLEFT=1;
jRIGHT=1;
break;
}
// checking neighbor
if(box[i][j+jRIGHT]==-1)
count+=1;
if(box[i][j-jLEFT]==-1)
count+=1;
if(box[i+iRIGHT][j]==-1)
count+=1;
if (box[i-iLEFT][j]==-1)
count+=1;
if(box[i-iLEFT][j-jLEFT]==-1)
{
if(i-iLEFT!=i) // trying to avoid double checking
count+=1;
}
if(box[i+iRIGHT][j-jLEFT]==-1)
{
if(i+iRIGHT!=i) //trying to avoid double checking
count+=1;
}
if (box[i-iLEFT][j+jRIGHT]==-1)
{
if(i!=iLEFT) //trying to avoid double checking
count+=1;
}
if (box[i+iRIGHT][j+jRIGHT]==-1)
{
if(i!=iRIGHT) //trying to avoid double checking
count+=1;
}
box[i][j]=count;
count=0;
}
私のアルゴリズム
iLEFT 現在の行ステップは左に進みます。
iRIGHT 現在の行を右に移動します。
jLEFT と JRIGHT の列は同じ
i=0 と仮定すると、i=1 の場合、1 ステップだけ右 (下)
にステップアップでき、j についても同じです。
"Case statement" update iLEFT/iRIGTH and jLEFT/jRIGHT for for for enable side steps
now "if" statement check left/right up/done box[i][j] の 2 つの対角線 (常に 1 つのステップのみ)
count counting performance of - box[i][j] の 1 つの値の隣人
同じセルをまだ二重チェックしていることがわかります
0 1 1 1
0 1 -1 2
1 2 4 -1
2 -1 4 -1