public bool place(int[] original_stone, bool front, int angle, int x, int y)
{
int[] stone = new int[64];
// 表裏
for (int i = 0; i < 8; i++) // y
{
for (int j = 0; j < 8; j++) // x
{
int src = i * 8 + j;
int dst = i * 8 + (front ? j : (7 - j));
stone[dst] = original_stone[src];
}
}
// 回転
if (!((0 <= angle) && (angle <= 270)) || angle % 90 != 0)
return false;
for (int i = 0; i < angle / 90; i++)
{
int[] tmp = new int[64];
Array.Copy(stone, tmp, 64);
for (int j = 0; j < 8; j++)
{
for (int k = 0; k < 8; k++)
{
int src = j * 8 + k;
int dst = k * 8 + (7 - j);
tmp[dst] = stone[src];
}
}
Array.Copy(tmp, stone, 64);
}
// 配置
this.maxid++;
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
int src = i * 8 + j;
if (stone[src] == 0)
continue;
int x1 = x + j;
int y1 = y + i;
if (!(0 <= x1 && x1 < 32))
return false;
if (!(0 <= y1 && y1 < 32))
return false;
int dst = y1 * 32 + x1;
if (this.nowmap[dst] != 0)
return false;
this.nowmap[dst] = this.maxid;
}
}
// 本当に受理できるか
return this.isAccept();
}