動物将棋 (1)
子供向けの動物将棋というものがあります。子供と遊んでみたいなと思っていたのですが、購入するに至らずに今まで来てしまっていました。(どうぶつしょうぎ.ねっと)
正月にでも、子供と対局してみたいので、Androidで遊べる将棋盤をLuaridaで、ちまちま作って行きたいと思います。
盤情報を持つ変数など
将棋盤は3×4の12マスです。Banというグローバルなテーブルを作って、そこに駒データを保持させることにします。BanはBan[3][4]という二元配列にしました。持ち駒はMochi[2][6]という二元配列にしました。Center.xとCenter.yは画面の中心座標です。
--グローバル変数宣言---------------------- Center={ x, y } --画面中心座標 Ban={} --将棋盤テーブル Ban[1] = { 13,0,0,24 } Ban[2] = { 15,11,21,25 } Ban[3] = { 14,0,0,23 } Mochi = {} Mochi[1] = {} Mochi[2] = {}
Ban[3][4]が持つデータ
Ban[3][4]は駒の種類データを持たせます。駒の種類は下記のようにしました。
- 0:駒無し
- 11:先手のひよこ
- 12:先手のにわとり
- 13:先手のぞう
- 14:先手のきりん
- 15:先手のらいおん
- 21:後手のひよこ
- 22:後手のにわとり
- 23:後手のぞう
- 24:後手のきりん
- 25:後手のらいおん
Ban[1]〜Ban[3]に設定している数値は、駒の初期位置です。
Mochi[2][6]
Mochi[2][6]配列には持ち駒の種類を持たせます。先手の持ち駒はMochi[1]に、後手の持ち駒はMochi[2]に持たせることにして、Mochi[1][1]=0であれは、1つも持っていないことにしました。
将棋盤を描く
画像ファイルを読み込んで、将棋盤を描くプログラムを作りました。将棋盤元画像は256×192です。元もDSで作ろうと思っていたので、このサイズで元絵を作りました。Androidは画面サイズが色々あるので、センター基準で描画するようにしてみました。
local w,h local dsyougibmp local bcol = color(253,227,202) --背景色 --画面サイズ取得 w,h = canvas.getviewSize() Center.x = w/2 Center.y = h/2 --背景 canvas.drawCls( bcol ) --ワークエリア画面をクリアします canvas.workCls() --ワークエリアの(0,0)-(255,287)に動物将棋画像を読み込みます dsyougibmp = LuaridaPath.."/".."dbsgb3.png" if( canvas.loadBmp( dsyougibmp, 0, 0, 255, 287 )==-1)then dialog( dsyougibmp, "ロードに失敗しました",1 ) do return end end canvas.putg( Center.x-128, Center.y-96, Center.x+127, Center.y+95, 0, 0, 255, 191 ) canvas.drawTextCenter( "どうぶつしょうぎ v0.00", Center.x+1, 10+1, 20, color(0,0,0) ) canvas.drawTextCenter( "どうぶつしょうぎ v0.00", Center.x, 10, 20, color(245,194,91) ) canvas.putflush()
マスに駒を置く
指定のマスに駒をおく関数を作りました。yokoは横のマス目を、tateは縦のマス目を示します。doubutsuは動物データ値です。doubutsuが0のときは、盤を描き、それ以外は動物の駒を描きます。
------------------------------------------ -- コマを置く ------------------------------------------ function dput( yoko, tate, doubutsu ) local px = 55*(tate-1) + 20 + 2 local py = 55*(yoko-1) + 15 + 2 local plyer = math.floor(doubutsu/10) local wx = 48*(doubutsu-plyer*10 - 1) local wy = 48*(plyer-1) + 192 if( doubutsu==0 )then canvas.putg( Center.x-128+px, Center.y-96+py, Center.x-128+px+47, Center.y-96+py+47, px, py, px+47, py+47 ) else canvas.putg( Center.x-128+px, Center.y-96+py, Center.x-128+px+47, Center.y-96+py+47, wx, wy, wx+47, wy+47 ) end end
Ban[3][4]データを描く
ループを回して、駒を盤上に配置してみました。
local x,y -- 盤テーブルデータを下にコマを並べてみる for y=1,4 do for x=1,3 do dput( x, y, Ban[x][y] ) end end canvas.putflush()
将棋盤データを変更する
試しに、1二ぞうとしてみました。
--12象 Ban[1][1] = 0 Ban[1][2] = 13 for y=1,4 do for x=1,3 do dput( x, y, Ban[x][y] ) end end canvas.putflush()
Ban[3][4]の修正
Ban[1] = { 23,0,0,14 } Ban[2] = { 25,21,11,15 } Ban[3] = { 24,0,0,13 }
駒をおく関数の修正
------------------------------------------ -- コマを置く ------------------------------------------ function dput( yoko, tate, doubutsu ) local px = 55*(tate-1) + 20 + 2 local py = 55*(yoko-1) + 15 + 2 local plyer = math.floor(doubutsu/10) local wx = 48*(doubutsu-plyer*10 - 1) local wy = 48*(2-plyer) + 192 if( doubutsu==0 )then canvas.putg( Center.x-128+px, Center.y-96+py, Center.x-128+px+47, Center.y-96+py+47, px, py, px+47, py+47 ) else canvas.putg( Center.x-128+px, Center.y-96+py, Center.x-128+px+47, Center.y-96+py+47, wx, wy, wx+47, wy+47 ) end end
これで、表示はできるようになりました。