動物将棋 (5)
駒を進める処理を書きたいと思います。
盤上の駒を動かした
盤上の駒を動かした場合の処理です。盤上の元位置はBan[hx][hy]であり、動かす位置はBan[hx1][hy1]です。chkMove()を用いて動かせるかチェックします。チェックOK(=1)であれば、駒を動かし、駒があれば取ります。また、成れる駒なら成ります。
進めることができれば、Ban[hx1][hy1]に駒の値(ret)を書き込んで、Ban[hx][hy] = 0にします。
if( chkMove( hx, hy, hx1, hy1, ret )==1 )then if( ret==11 and hy1==1 )then --ひよこの場合 --最前列ではにわとりになる ret = 12 elseif( ret==21 and hy1==4 )then --ひよこの場合 --最前列ではにわとりになる ret = 22 end --Ban[hx1][hy1]に駒がある場合は、自分の持ち駒となる if( Ban[hx1][hy1]~=0 )then --持ち駒に追加します addMochiKoma( math.floor(Ban[hx][hy]/10), Ban[hx1][hy1] ) end Ban[hx][hy] = 0 Ban[hx1][hy1] = ret end
移動チェック
駒が指定場所に進めるか調べます。もっと簡単な方法があると思いますが、進めるかどうかを一つずつチェックしています。自分の駒のある場所には進めないので、先ず、それをチェックして、相手の駒か空マスであれば、進めるかどうかチェックしています。
------------------------------------------ -- 駒が進めるかどうかのチェック -- 0:進めない, 1:進める ------------------------------------------ function chkMove( hx, hy, hx1, hy1, koma ) local ret = 0 if( math.floor(Ban[hx1][hy1]/10)~=math.floor(koma/10) )then if( koma==11 )then --先手のひよこ if( hx==hx1 and hy-1==hy1 )then ret = 1 end elseif( koma==21 )then --後手のひよこ if( hx==hx1 and hy+1==hy1 )then ret = 1 end elseif( koma==12 )then --先手のにわとり if( (hx==hx1 and hy-1==hy1) or (hx==hx1 and hy+1==hy1) or (hx-1==hx1 and hy==hy1) or (hx+1==hx1 and hy==hy1) or (hx-1==hx1 and hy-1==hy1) or (hx+1==hx1 and hy-1==hy1) )then ret = 1 end elseif( koma==22 )then --後手のにわとり if( (hx==hx1 and hy-1==hy1) or (hx==hx1 and hy+1==hy1) or (hx-1==hx1 and hy==hy1) or (hx+1==hx1 and hy==hy1) or (hx-1==hx1 and hy+1==hy1) or (hx+1==hx1 and hy+1==hy1) )then ret = 1 end elseif( koma==13 or koma==23)then --先手と後手のぞう if( (hx-1==hx1 and hy-1==hy1) or (hx+1==hx1 and hy-1==hy1) or (hx-1==hx1 and hy+1==hy1) or (hx+1==hx1 and hy+1==hy1) )then ret = 1 end elseif( koma==14 or koma==24 )then --先手と後手のきりん if( (hx-1==hx1 and hy==hy1) or (hx+1==hx1 and hy==hy1) or (hx==hx1 and hy-1==hy1) or (hx==hx1 and hy+1==hy1) )then ret = 1 end elseif( koma==15 or koma==25 )then --先手と後手のらいおん if( (hx-1==hx1 and hy==hy1) or (hx+1==hx1 and hy==hy1) or (hx==hx1 and hy-1==hy1) or (hx==hx1 and hy+1==hy1) or (hx-1==hx1 and hy-1==hy1) or (hx+1==hx1 and hy-1==hy1) or (hx-1==hx1 and hy+1==hy1) or (hx+1==hx1 and hy+1==hy1) )then ret = 1 end end end return ret end
持ち駒を打った
持ち駒を持っていた場合には、駒を打つことになります。駒のある場所には打てません。ret1が0であるところにだけ打てます。駒を打った場合、持ち駒から外します。そして、Ban[hx1][hy1]に打った駒の値(ret)を書き込みます。
--持ち駒を打った if(ret1==0)then --空マスに打った --打てたので、持ち駒を削除します delMochiKoma( math.floor(ret/10), hx ) Ban[hx1][hy1] = ret end
次は、持ち駒について書きたいと思います。