コンピュータを楽しもう!!

今、自分が面白くていろいろやってみたことを書き綴りたいと思います。連絡先はtarosa.yでgmail.comです。

動物将棋 (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				

次は、持ち駒について書きたいと思います。