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

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

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

これで、表示はできるようになりました。