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

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

動物将棋 (3)

動物将棋のプログラムがさらに進んだので書いておきます。
動物将棋(4)にて、大幅に見直していますので、そちらをご覧下さい。

タッチしたところの駒番号を返す

タッチしたところにある駒の番号を返す関数を作りました。ただし、駒が無いときは0を返します。また、タッチしたマス番号も返します。

------------------------------------------
-- タッチしたの駒番号を返す。駒が無ければ0を返す。盤外であれば-1を返す
-- komanum, hx, hy
------------------------------------------
function getKomaNum()
local x,y
local ret = -1
local hx = 1
local hy = 1
 x,y = touch()
 --将棋盤の範囲内かどうか調べる
 if( x>=Center.x-108 and y>=Center.y-81 and x<=Center.x+107 and y<=Center.y+80 )then
   hx = math.floor( (y-(Center.y-81))/55 ) + 1
   hy = math.floor( (x-(Center.x-108))/55 ) + 1
   ret = Ban[hx][hy]
 end
 return ret, hx, hy
end

画面x,y座標に駒を描画する

タッチして駒を移動できるように、画面のx,y座標を中心として、駒画像を表示する関数を作りました。駒を描く前に、元画像をワークエリアに退避します。この退避画像を書き戻せは、元の画像に戻ります。

------------------------------------------
-- (gx,gy)座標を中心に指定駒を描画する
-- ただし、描く前に、48×48のエリアをワークの(260,0)-(307,47)に退避する
------------------------------------------
function drawKoma( gx, gy, koma )
local plyer = math.floor(koma/10)
local wx = 48*(koma-plyer*10 - 1)
local wy = 48*(2-plyer) + 192
 --ワークに退避
 canvas.getg( gx-24, gy-24, gx+23, gy+23, 260, 0, 307, 47 )
 --駒を描画
 canvas.putg( gx-24, gy-24, gx+23, gy+23, wx, wy, wx+47, wy+47 )
 canvas.putflush()
end

駒をタッチで移動させるループを作る

駒をタッチして移動させるためにループ処理プログラムを作りました。doTouchAction()という別関数を用意しました。
最初のwhileループで盤面にタッチするのを待っています。

while(true)do  --駒にタッチするまで待つ
   x,y = touch(1)
   ret, hx, hy = getKomaNum()
   if( ret~=0 and ret~=-1 )then break end
end

盤面にタッチでされると、ループを抜けてきて、タッチした場所の駒を消します。駒無し:0として、描画関数dput()を呼ぶだけです。

--Ban[hx][hy]の駒を消す
dput( hx, hy, 0 )

次のwhileループが駒移動ループです。指が離れるまでループを続けます。タッチしているx,y座標に駒の絵を描いて、1つ前に描いた場所は、ワークから元の絵に描き戻す処理を繰り返します。

x1 = x
y1 = y
while(true)do  --駒移動ループ
  drawKoma( x, y, ret )
  x,y,s = touch()
  if( s==1 )then break end
  --ワークから描き戻し
  canvas.putg( x1-24, y1-24, x1+23, y1+23, 260, 0, 307, 47 )
  x1 = x
  y1 = y
end

指が離れたら、ループを抜けます。ループを抜けたときは、画面を元に戻すために、ワークから退避画像を描き戻します。そして、指を離した場所が、駒が移動できる場所かどうか確認して、移動できる場所であれば、移動処理を行います。移動できなければ、盤面を一度書き直して、指タッチ待ちループに戻ります。

------------------------------------------
-- タッチ操作処理
------------------------------------------
function doTouchAction()
local hx = 1
local hy = 1
local ret = 0
local x,y,x1,y1,s
local i,j
local hx1, hy1,ret1
 while(true)do
   while(true)do  --駒にタッチするまで待つ
     x,y = touch(1)
     ret, hx, hy = getKomaNum()
     if( ret~=0 and ret~=-1 )then break end
   end
   --Ban[hx][hy]の駒を消す
   dput( hx, hy, 0 )
   x1 = x
   y1 = y
   while(true)do  --駒移動ループ
     drawKoma( x, y, ret )
     x,y,s = touch()
     if( s==1 )then break end
     --ワークから描き戻し
     canvas.putg( x1-24, y1-24, x1+23, y1+23, 260, 0, 307, 47 )
     x1 = x
     y1 = y
   end
   -- 駒が離されたので、ワークから書き戻す
   canvas.putg( x1-24, y1-24, x1+23, y1+23, 260, 0, 307, 47 )
   ret1, hx1, hy1 = getKomaNum()

   if( chkMove( hx, hy, hx1, hy1, ret )==1 )then
     --移動できる場所に駒が置かれたときの処理を書く
   end

   --駒を描く
   for j=1,4 do
     for i=1,3 do
       dput( i, j, Ban[i][j] )
     end
   end
   canvas.putflush()
 end
end

chkMove()は、駒が指定場所に進めるかどうかをチェックする関数です。この説明は、次回にしたいと思います。