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

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

動物将棋 (9)

いよいよ、駒を打った手順を覚えるルーチンを作ろうと思います。それと同時に、手順を表示するプログラムも作りたいと思います。
とりあえず、先に画面の紹介です。

棋譜を記録する

棋譜を記録する配列を作りました。単純にKifu[]という配列に、元位置と移動先の座標を4桁の数値で記録していきます。手ごまから打った場合は、打った駒番号に50を足した数を先頭2桁にして、後ろ2桁は打った座標としました。下記が配列の宣言です。記録長さはKifuNに記録します。

--Kifu[] 先頭2桁が11〜34で始まるのは盤のマス位置を示す。
--61〜75で始まるのは持ち駒を示す。下2桁は盤の移動位置。
Kifu = {}                   --棋譜を保存する配列
KifuN = 2                   --(手数+1) KifuN=1のときが初期状態

持ち駒を打ったときの棋譜の保存は、下記のような感じです。

--持ち駒を打った
if(koma1==0)then
  --空マスに打った
  --打てたので、持ち駒を削除します
  delMochiKoma( tejun, hx )
  Ban[hx1][hy1] = koma
  --棋譜の保存
  Kifu[KifuN] = (koma+50)*100 + hx1*10 + hy1
  KifuN = KifuN + 1
  KifuText( tejun, hx1, hy1, koma )
  tejun = 3 - tejun  --手順を入れ替える
end

駒を移動させたときの棋譜の保存は、下記のような感じです。

--盤上の駒を動かした
if( koma==11 and hy1==1 )then  --ひよこの場合
  --最前列ではにわとりになる
  koma = 12
elseif( koma==21 and hy1==4 )then  --ひよこの場合
  --最前列ではにわとりになる
  koma = 22
end
--Ban[hx1][hy1]に駒がある場合は、自分の持ち駒となる
if( Ban[hx1][hy1]~=0 )then
  --持ち駒に追加します
  addMochiKoma( tejun, Ban[hx1][hy1] )
end
Ban[hx][hy] = 0
Ban[hx1][hy1] = koma
--棋譜の保存
Kifu[KifuN] = hx*1000 + hy*100 + hx1*10 + hy1
KifuN = KifuN + 1
KifuText( tejun, hx1, hy1, koma )
tejun = 3 - tejun  --手順を入れ替える

KifuText()関数が、手順を表示するプログラムです。次に説明します。また、初期化プログラムにも追加しました。

------------------------------------------
-- 将棋データを初期化します
------------------------------------------
function initKomadata()
Ban={}
Ban[1] = { 23,0,0,14 }
Ban[2] = { 25,21,11,15 }
Ban[3] = { 24,0,0,13 }
Mochi = {}
Mochi[1] = {0,0,0,0,0,0} 
Mochi[2] = {0,0,0,0,0,0}
Kifu[1] = 1213
KifuN = 2
Touryo = 0
end

画面にメッセージを表示する

画面にメッセージを表示するルーチンも作成しました。表示場所を、ある程度自由に設定できるように作っています。Msg={}というテーブルに必要な変数を一括しました。

--メッセージエリアの設定値
Msg={ x0 = Center.x-128+20,
      x1 = Center.x + 53,
      y0 = Center.y + 85,
      y1 = ViewHeight - 1,
      font = 14,
      bgc= color(251,240,191) }

この変数を使って画面にテキストを表示するプログラムが下記です。strに書かれた文字を表示します。表示範囲は、(Msg.x0, Msg.y0)-(Msg.x1, Msg.y1)です。背景色はMsg.bgc、フォントサイズはMsg.fontとなります。

------------------------------------------
-- メッセージをスクロール表示します
------------------------------------------
function msgDisp( str )
local sc = 1
local w = Msg.x1 - Msg.x0 + 1
 --画面の絵をワークエリアに取り込みます
 canvas.getg( Msg.x0, Msg.y0 + Msg.font*sc+1, Msg.x1, Msg.y1, Msg.x0, Msg.y0 + Msg.font*sc+1 +289, Msg.x1, Msg.y1+289 )
 --取り込んだ画面をスクロールさせて描きます
 canvas.putg( Msg.x0, Msg.y0, Msg.x1, Msg.y1 - Msg.font*sc-1, Msg.x0, Msg.y0 + Msg.font*sc+1 +289, Msg.x1, Msg.y1+289 )
 --書き出す部分をバックカラーで塗り潰します
 canvas.putRect( Msg.x0, Msg.y1 - Msg.font*sc-1, Msg.x1, Msg.y1, Msg.bgc, 1 )
 --スクロールしたところにテキストを書きます
 canvas.drawTextBox( str, Msg.x0, Msg.y1 - Msg.font*sc, Msg.font, color(0,0,0), w )
end

画面にメッセージ表示エリアを用意したので、将棋盤面の初期化プログラムも追加修正しました。

------------------------------------------
-- 将棋盤を描く
------------------------------------------
function drawSyogiBan()
local i
local yoko = { "1", "2", "3" }
local tate = { "一", "二", "三", "四" }
 canvas.putg( Center.x-128, Center.y-96, Center.x+127, Center.y+95, 0, 0, 255, 191 )
 for i=1,3 do
   canvas.putTextRotate( yoko[i], Center.x-117, (i-1)*55+(Center.y-55), 270, 24, color(0,0,0) )
 end
 for i=1,4 do
   canvas.putTextRotate( tate[i], Center.x-80+(i-1)*55, Center.y-95, 270, 24, color(0,0,0) )
 end
 --メッセージエリアを描く
 canvas.putRect( Msg.x0, Msg.y0, Msg.x1, Msg.y1, Msg.bgc, 1 )
 --メニューエリアを描く
 canvas.putRect( Msg.x1+4, Msg.y0, Center.x+127-19, Msg.y1, color(216,245,223), 1 )
 canvas.putTextBox( "おやつ", Msg.x1+4+16, Msg.y0+6, 18, color(0,0,0), 20 )
 canvas.drawTextCenter( "どうぶつしょうぎ v"..Version, Center.x+1, 10+1, 20, color(0,0,0) )
 canvas.drawTextCenter( "どうぶつしょうぎ v"..Version, Center.x, 10, 20, color(245,194,91) )
end

上記にあるように、メニュエリアも用意しました。「おやつ」と書かれたところをタッチすると、メニュが出てくるように作る予定です。

棋譜の手順を表示する

先の画面表示プログラムに対して、棋譜手順を表示するプログラムを作りました。下記です。

------------------------------------------
-- 棋譜のテキストを作ります
------------------------------------------
function KifuText( plyer, x, y, koma )
local moji
local yoko = { "1", "2", "3" }
local tate = { "一", "二", "三", "四" }
local doubutsu = { "ひよこ", "にわとり", "ぞう", "きりん", "ライオン" }
 if( plyer==1 )then
   moji = "せんて "
 else
   moji = "ごて "
 end
 moji = moji..yoko[x]..tate[y].." "..doubutsu[koma%10]
 --画面にテキストを表示
 msgDisp( moji )
end

また、勝負がついたときのメッセージも表示するようにしました。メインルーチンのループのところに、下記を追加しただけです。

--画面にテキストを表示
msgDisp( wstr.."のかち" )

次はメニュ表示とメニュを作っていきたいと思います。メニュは「まった」と「まいりました」の2つの予定です。「まった」を作りかけているのですが、バグが取れないです・・・。