さて、ピースを置くときに、盤面からはみ出すのも無視していたが、座標を与えたとき、それが盤面の内部かどうかを判定する関数 ison() を作ってみた。
int ison( int x, int y )
{
if( x<0 || x>=WIDTH )
return FALSE;
if( y<0 || y>=HEIGHT )
return FALSE;
return TRUE;
}
ピースを置く前に、ピースが置けるか否かを確認する必要が有るので、そのための関数 ispieceok() というのを作ってみた。もちろん、今回も、 pieceset()をコピーして作ったことは言うまでもない。横着はプログラマに必須である。
int ispieceok( int x, int y, PieceForm *pf )
{
int i;
int u, v;
for( i=0; i<CN; ++i ) {
u = x + pf->form[i].x;
v = y + pf->form[i].y;
if( ! ison(u,v) )
return FALSE;
if( board[u][v] != BLANK )
return FALSE;
}
return TRUE;
}
置けるかどうかの検査が、まず盤面に収まっているかを判定し、5つのセルのうち1つでもダメな場合にはさっさとダメ(FALSE)を返している。盤上の場合には、さらに、そのセルにピースが置ける状態(ブランク)であるかの判定をしている。
今回は、検査のため、ちょっとmain() が凝っているかな。最初にピースを2個(X,P)置いてから、ピースFが置ける場所をすべてリストアップするようにしてみた。
int main(int argc, char **argv)
{
int x, y;
PieceForm pf = { 'F', {{ 0, 0},{ 0, 1},{ 1, 1},{ 1, 2},{ 2, 1}} };
PieceForm px = { 'X', {{ 0, 0},{ 1,-1},{ 1, 0},{ 1, 1},{ 2, 0}} };
PieceForm pp = { 'P', {{ 0, 0},{ 0, 1},{ 0, 2},{ 1, 0},{ 1, 1}} };
initboard();
pieceset( 2, 2, &px );
pieceset( 6, 2, &pp );
printboard();
for( x=0; x<WIDTH; ++x ) {
for( y=0; y<HEIGHT; ++y ) {
if( ispieceok( x, y, &pf ) ) {
pieceset( x, y, &pf );
printboard();
pieceunset( x, y, &pf );
}
}
}
}
以上をとりあえずまとめたのが pentomino7.c である。
$ pentomino
. . . . . . . . . .
. . . X . . . . . .
. . X X X . P P . .
. . . X . . P P . .
. . . . . . P . . .
. . . . . . . . . .
F . . . . . . . . .
F F F X . . . . . .
. F X X X . P P . .
. . . X . . P P . .
. . . . . . P . . .
. . . . . . . . . .
. . . . . . . . . .
. . . X . . . . . .
F . X X X . P P . .
F F F X . . P P . .
. F . . . . P . . .
. . . . . . . . . .
. . . . . . . . . .
. . . X . . . . . .
. . X X X . P P . .
F . . X . . P P . .
F F F . . . P . . .
. F . . . . . . . .
. . . . . . . . . .
. . . X . . . . . .
. . X X X . P P . .
. F . X . . P P . .
. F F F . . P . . .
. . F . . . . . . .
. . . . . . . . . .
. . . X . . . . . .
. . X X X . P P . .
. . F X . . P P . .
. . F F F . P . . .
. . . F . . . . . .
. . . . F . . . . .
. . . X F F F . . .
. . X X X F P P . .
. . . X . . P P . .
. . . . . . P . . .
. . . . . . . . . .
. . . . . . . F . .
. . . X . . . F F F
. . X X X . P P F .
. . . X . . P P . .
. . . . . . P . . .
. . . . . . . . . .
$
確認は面倒だったので省略したが、たぶん合っているだろう。
2001年11月3日