動物将棋 (12)
千日手の判断ですが、王手を連続しての千日手は詰めろになっていないときに成立してしまうので、プログラムとしては実装したのですが、コメントアウトして使わないことにしました。下記のコメントアウトの部分が、王手のチェック部分です。chkOute()は下記に書きます。
if( chkflg==0 )then --王手が掛かっているかどうかのチェック --if( chkOute( 1 )==0 and chkOute( 2 )==0 )then --王手が掛かっていなければ、千日手カウントアップ sennichi = sennichi + 1 if( sennichi==3 )then return 1, bn, mchi end --end end
王手のチェック
実際には使用していないですが、下記のようなプログラムとなっています。指定されたライオンの位置を見つけて、王手が掛かっているかどうかを調べます。
------------------------------------------ -- 王手が掛かっているかどうか調べます -- 0:王手無し、1:王手有り ------------------------------------------ function chkOute( plyer ) local x, y local lx, ly local lion = plyer*10+5 local aite = 3 - plyer --ライオンを探す for y=1,4 do for x=1,3 do if( Ban[x][y]==lion )then lx = x ly = y break end end end if( lx==nil or ly==nil )then return 0 end --nilのときはライオンがいない --ライオンを取れる駒があるかどうか調べる for y=1,4 do for x=1,3 do if( getPlyer( Ban[x][y] )==aite and chkMove( x, y, lx, ly, Ban[x][y] )==1 )then return 1 end end end return 0 end
全プログラム
ここまで作成した全ソースを下記に表示します。ダウンロードはここからしてください。(どつぶつしょうぎv0.15 dobutsusyogi.lua)
------------------------------------------ --動物将棋 ------------------------------------------ --関数宣言-------------------------------- main={} --mainメソッド dput={} --盤の上に駒をおく mput={} --持ち駒の位置に持ち駒の絵を描く drawSyogiBan={} --将棋盤を描く drawKoma={} --(gx,gy)座標を中心に指定駒を描画する getKomaNum={} --タッチしたの駒番号を返す。駒が無ければ0を返す doTouchAction={} --タッチ操作処理 chkMove={} --駒が進めるかどうかのチェック addMochiKoma={} --持ち駒を追加する delMochiKoma={} --持ち駒を削除する sortMochiKoma={} --持ち駒をソートします getMochiNum={} --タッチした持ち駒番号を返す。駒が無ければ0を返す getPlyer={} --駒データから先手(1)か後手(2)を取得する関数 chkSyobuAri={} --勝負有りかどうかのチェック initKomadata={} --将棋データを初期化します drawAll={} --盤上の駒と持ち駒を描画します msgDisp={} --メッセージをスクロール表示します KifuText={} --棋譜のテキストを作ります oyatsu={} --おやつ処理(メニュ処理のこと) chkSenNichiTe={} --棋譜を再生しながら千日手をチェックします initSound={} --音声の初期化 speakKoma={} --駒を読み上げます chkOute={} --王手が掛かっているかどうか調べます --グローバル変数宣言---------------------- Version = "0.15" --バージョン --Ban[][] 0:無し,11,12,13,14,15=先手のひよこ,にわとり,ぞう,きりん,らいおん -- 21,22,23,24,25=後手のひよこ,にわとり,ぞう,きりん,らいおん 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} BGColor = color(253,227,202) --背景色 ViewWide, ViewHeight = canvas.getviewSize() --画面サイズ Center={ x, y } --画面中心座標 Center.x = ViewWide/2 Center.y = ViewHeight/2 KomaMove = {} KomaMove[11] = { 10 } --先手ひよこの移動 KomaMove[12] = { 0, 1, 10, 12, 20, 21 } --先手にわとりの移動 KomaMove[13] = { 0, 2, 20, 22 } --先手ぞうの移動 KomaMove[14] = { 1, 10, 12, 21 } --先手きりんの移動 KomaMove[15] = { 0, 1, 2, 10, 12, 20, 21, 22 } --先手ライオンの移動 KomaMove[21] = { 12 } --後手ひよこの移動 KomaMove[22] = { 1, 2, 10, 12, 21, 22 } --後手にわとりの移動 KomaMove[23] = { 0, 2, 20, 22 } --後手ぞうの移動 KomaMove[24] = { 1, 10, 12, 21 } --後手きりんの移動 KomaMove[25] = { 0, 1, 2, 10, 12, 20, 21, 22 } --後手ライオンの移動 --Kifu[] 先頭2桁が11〜34で始まるのは盤のマス位置を示す。61〜75で始まるのは持ち駒を示す。下2桁は盤の移動位置 Kifu = {} --棋譜を保存する配列 KifuN = 2 --(手数+1) KifuN=1のときが初期状態 Msg={ x0 = Center.x-128+20, x1 = Center.x + 53, y0 = Center.y + 85, y1 = ViewHeight - 1, font = 14, bgc= color(251,240,191) } --メッセージエリアの設定値 Touryo = 0 --投了フラグ LuaridaPath="/sdcard/luarida" --luaファイルを保存しているPath ------------------------------------------ mt={} mt.__newindex=function(mtt,mtn,mtv) dialog( "Error Message", "宣言していない変数 "..mtn.." に値を入れようとしています", 0 ) toast("画面タッチで実行を続けます", 1) touch(3) end mt.__index=function(mtt,mtn) dialog( "Error Message", "変数 "..mtn.." は宣言されていません", 0 ) toast("画面タッチで実行を続けます", 1) touch(3) end setmetatable(_G,mt) --------以下が実プログラム---------------- ------------------------------------------ -- 駒データから先手(1)か後手(2)を取得する関数 ------------------------------------------ function getPlyer( koma ) return math.floor(koma/10) end ------------------------------------------ -- 勝負有りかどうかのチェック -- 0:勝負中、1:先手の勝ち、2:後手の勝ち ------------------------------------------ function chkSyobuAri() local x, y local ret = 0 local px={} local py={} local pu={} pu[1] = 0 pu[2] = 0 --相手のライオンが盤上にあるか調べる for y=1,4 do for x=1,3 do if( Ban[x][y]==15 )then --先手のライオンを見つけた px[1] = x py[1] = y pu[1] = 1 end if( Ban[x][y]==25 )then --後手のライオンを見つけた px[2] = x py[2] = y pu[2] = 1 end end end if( pu[1]==0 )then return 2 end --後手の勝ち if( pu[2]==0 )then return 1 end --先手の勝ち --相手のエリアに入っているか調べる if( py[1]==1 )then ret = 1 for y=1,4 do for x=1,3 do if( getPlyer( Ban[x][y] )==2 and chkMove( x, y, px[1], py[1], Ban[x][y] )==1 )then ret = 0 end end end if( ret~=0 )then return ret end end if( py[2]==4 )then ret = 2 for y=1,4 do for x=1,3 do if( getPlyer( Ban[x][y] )==1 and chkMove( x, y, px[2], py[2], Ban[x][y] )==1 )then ret = 0 end end end if( ret~=0 )then return ret end end return 0 end ------------------------------------------ -- (gx,gy)座標を中心に指定駒を描画する ------------------------------------------ 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.putg( gx-24, gy-24, gx+23, gy+23, wx, wy, wx+47, wy+47 ) canvas.putflush() end ------------------------------------------ -- おやつ処理(メニュ処理のこと) ------------------------------------------ function oyatsu( x, y ) if( x<Msg.x1+4 or y<Msg.y0 or x>Center.x+127-19 or y>Msg.y1 )then return end local a local n local ret item.clear() item.add( "まった", 0 ) item.add( "まいりました", 0 ) a = item.list("えらんでね") if( a==1 )then --まったの処理 if( KifuN>3 )then n = KifuN - 3 ret, Ban, Mochi = chkSenNichiTe( n ) sortMochiKoma( 1 ) sortMochiKoma( 2 ) KifuN = KifuN - 2 drawAll() msgDisp( "まった・・・" ) end elseif( a==2 )then --投了しました Touryo = 1 end end ------------------------------------------ -- 将棋盤を描く ------------------------------------------ function drawSyogiBan() local i local yoko = { "C", "B", "A" } local tate = { "1", "2", "3", "4" } 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 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 ------------------------------------------ -- 持ち駒の位置に持ち駒の絵を描く -- num: Mochi[][num], doubutsu==0なら背景を描く ------------------------------------------ function mput( plyer, num, doubutsu ) local px local py local wx = 48*(doubutsu-plyer*10 - 1) local wy = 48*(2-plyer) + 192 if( doubutsu==0 )then wx = 48*5 end if( plyer==1 )then if( num<4 )then px = Center.x+128 py = Center.y-96+15+(num-1)*55 canvas.putg( px, py, px+47, py+47, wx, wy, wx+47, wy+47 ) else px = Center.x+128+55 py = Center.y-96+15+(num-4)*55 canvas.putg( px, py, px+47, py+47, wx, wy, wx+47, wy+47 ) end elseif( plyer==2 )then if( num<4 )then px = Center.x-129-48 py = Center.y-96+15+(num-1)*55 canvas.putg( px, py, px+47, py+47, wx, wy, wx+47, wy+47 ) else px = Center.x-129-55-48 py = Center.y-96+15+(num-4)*55 canvas.putg( px, py, px+47, py+47, wx, wy, wx+47, wy+47 ) end end end ------------------------------------------ -- タッチした持ち駒番号を返す。駒が無ければ0を返す。盤外であれば-1を返す -- あれば持ち駒の番号を返す ------------------------------------------ function getMochiNum() local x,y local ret = -1 local num = 0 local i x,y = touch() --持ち駒の場所かどうか調べる for i=1,3 do if( x>=Center.x+128 and x<=Center.x+128+48 and y>=Center.y-96+15+(i-1)*55 and y<=Center.y-96+15+(i-1)*55+48 )then ret = Mochi[1][i] num = i elseif( x>=Center.x-129-48 and x<=Center.x-129 and y>=Center.y-96+15+(i-1)*55 and y<=Center.y-96+15+(i-1)*55+48 )then ret = Mochi[2][i] num = i end end for i=4,6 do if( x>=Center.x+128+55 and x<=Center.x+128+55+48 and y>=Center.y-96+15+(i-4)*55 and y<=Center.y-96+15+(i-4)*55+48 )then ret = Mochi[1][i] num = i elseif( x>=Center.x-129-55-48 and x<=Center.x-129-55 and y>=Center.y-96+15+(i-4)*55 and y<=Center.y-96+15+(i-4)*55+48 )then ret = Mochi[2][i] num = i end end return ret, num end ------------------------------------------ -- タッチしたの駒番号を返す。駒が無ければ0を返す。盤外であれば-1を返す -- komanum, hx, hy hy==-1のとき、手ごまの場所だった。 ------------------------------------------ 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] else ret, hx = getMochiNum() hy = -1 end return ret, hx, hy end ------------------------------------------ -- 駒が進めるかどうかのチェック -- 0:進めない, 1:進める ------------------------------------------ function chkMove( hx, hy, hx1, hy1, koma ) local i if( getPlyer(Ban[hx1][hy1])~=getPlyer(koma) )then for i=1, #KomaMove[koma] do if( hx1*10+hy1==KomaMove[koma][i]-11+hx*10+hy )then return 1 end end end return 0 end ------------------------------------------ -- 持ち駒を削除する ------------------------------------------ function delMochiKoma( plyer, num ) Mochi[plyer][num] = 0 sortMochiKoma( plyer ) --持ち駒をソートします end ------------------------------------------ --持ち駒をソートします ------------------------------------------ function sortMochiKoma( plyer ) local i,j for j=1,5 do for i=j+1,6 do if( Mochi[plyer][j]<Mochi[plyer][i] )then Mochi[plyer][i],Mochi[plyer][j] = Mochi[plyer][j],Mochi[plyer][i] end end end end ------------------------------------------ -- 持ち駒を追加する ------------------------------------------ function addMochiKoma( plyer, koma ) local koma1 = plyer*10 + (koma % 10) --にわとりはひよこにする if( koma1==12 )then koma1 = 11 end if( koma1==22 )then koma1 = 21 end Mochi[plyer][6] = koma1 sortMochiKoma( plyer ) --持ち駒をソートします end ------------------------------------------ -- 駒を読み上げます ------------------------------------------ function speakKoma( flg, koma ) if( flg==0 )then return end --flgが0なら、読み上げなし local num = koma%10 if( flg~=1 )then while(sound.isPlay(0)==1)do end --指し位置読み上げ終了まで待つ --駒名の読み上げ sound.start(num) if( flg==2 )then --2なら「打つ」を付ける sound.setSoundFile(LuaridaPath.."/utu.ogg", 6, 0 ) while(sound.isPlay(num)==1)do end sound.start(6) end else --ここに来るときは、ひよこが成ったとき while(sound.isPlay(0)==1)do end --指し位置読み上げ終了まで待つ sound.start(1) --「ひよこ」 sound.setSoundFile(LuaridaPath.."/naru.ogg", 6, 0 ) while(sound.isPlay(1)==1)do end sound.start(6) --「成る」 end end ------------------------------------------ -- タッチ操作処理 ------------------------------------------ function doTouchAction() local hx = 1 local hy = 1 local koma = 0 local x,y,s local i,j local hx1, hy1,koma1 local tejun = 1 --先手:1, 後手:2 local owari = 0 local winner = 0 local soundNaruUtu = 0 -- 0:音声ストップ, 1:成る, 2:打つ, 3:無音 while(true)do while(true)do x,y = touch(1) --駒にタッチするまで待つ koma, hx, hy = getKomaNum() if( koma~=0 and koma~=-1 and getPlyer(koma)==tejun )then break end oyatsu( x, y ) --おやつ領域にタッチしたときはおやつ処理を行う if( Touryo==1 )then break end --投了した touch(2) --指が画面から離れるまで待つ end if( Touryo==1 )then --投了した msgDisp( "まいりました" ) winner = 3 - tejun break end if( hy~=-1 )then --盤上の駒を消す dput( hx, hy, 0 ) else --持ち駒の絵を消す mput( tejun, hx, 0 ) end --現在の画面をワークにキャッシュする canvas.getg( 0, 0, ViewWide-1, ViewHeight-1, 260, 0, 259+ViewWide, ViewHeight-1 ) while(true)do --駒移動ループ drawKoma( x, y, koma ) x,y,s = touch() --ワークから描き戻し canvas.putg( 0, 0, ViewWide-1, ViewHeight-1, 260, 0, 259+ViewWide, ViewHeight-1 ) if( s==1 )then break end --指が離れたら抜ける end koma1, hx1, hy1 = getKomaNum() --盤面から指が離れたときの状態が返ってくる if( koma1~=-1 )then if( hy==-1 and hy1~=-1 )then --持ち駒を打った if(koma1==0)then --空マスに打った soundNaruUtu = 2 --打てたので、持ち駒を削除します 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 elseif( hy1~=-1 )then --盤上の駒を動かした if( chkMove( hx, hy, hx1, hy1, koma )==1 )then if( koma==11 and hy1==1 )then --ひよこの場合 --最前列ではにわとりになる koma = 12 soundNaruUtu = 1 elseif( koma==21 and hy1==4 )then --ひよこの場合 --最前列ではにわとりになる koma = 22 soundNaruUtu = 1 else soundNaruUtu = 3 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 --手順を入れ替える end end end --盤上の駒と持ち駒を描画します drawAll() -- 駒を読み上げます speakKoma( soundNaruUtu, koma ) soundNaruUtu = 0 --勝負がついたか調べます winner = chkSyobuAri() --千日手をチェックします if( chkSenNichiTe( KifuN-1 )==1 )then winner = 3 end if( winner~=0 )then break end end return winner end ------------------------------------------ -- 棋譜のテキストを作ります ------------------------------------------ function KifuText( plyer, x, y, koma ) local moji local yoko = { "C", "B", "A" } local tate = { "1", "2", "3", "4" } local doubutsu = { "ひよこ", "にわとり", "ぞう", "きりん", "ライオン" } local soundfile local soundyoko = { "c", "b", "a" } if( plyer==1 )then moji = "せんて " --音声データセット if( Kifu[KifuN-1]%100 == Kifu[KifuN-2]%100 )then soundfile = LuaridaPath.."/sonajiku.ogg" else soundfile = LuaridaPath.."/s"..soundyoko[x]..y..".ogg" end else moji = "ごて " --音声データセット if( Kifu[KifuN-1]%100 == Kifu[KifuN-2]%100 )then soundfile = LuaridaPath.."/gonajiku.ogg" else soundfile = LuaridaPath.."/g"..soundyoko[x]..y..".ogg" end end --音声読み上げ sound.setSoundFile(soundfile, 0, 0 ) sound.start(0) --画面にテキストを表示 moji = moji..yoko[x]..tate[y].." "..doubutsu[koma%10] msgDisp( moji ) end ------------------------------------------ -- メッセージをスクロール表示します ------------------------------------------ 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 chkSenNichiTe( n ) local i,j local bn = {} bn[1] = { 23,0,0,14 } bn[2] = { 25,21,11,15 } bn[3] = { 24,0,0,13 } local mchi = {} mchi[1] = {0,0,0,0,0,0} mchi[2] = {0,0,0,0,0,0} local hx,hy,hx1,hy1,koma,koma1 local tst local tejun = 2 local sennichi = 0 local x,y local chkflg = 0 if( n>=KifuN )then return end for i=1,n do if( Kifu[i]<6000 )then tst = tostring( Kifu[i] ) hx = tonumber(string.sub( tst, 1, 1 )) hy = tonumber(string.sub( tst, 2, 2 )) hx1 = tonumber(string.sub( tst, 3, 3 )) hy1 = tonumber(string.sub( tst, 4, 4 )) koma = bn[hx][hy] else tst = tostring( Kifu[i] ) koma = tonumber(string.sub( tst, 1, 2 )) - 50 hx = -1 hy = -1 hx1 = tonumber(string.sub( tst, 3, 3 )) hy1 = tonumber(string.sub( tst, 4, 4 )) end if( hy==-1 )then --持ち駒を打った for j=1,6 do if( mchi[tejun][j]==koma )then mchi[tejun][j] = 0 break end end bn[hx1][hy1] = koma else --盤上の駒を動かした koma = bn[hx][hy] if( koma==11 and hy1==1 )then --ひよこの場合 --最前列ではにわとりになる koma = 12 elseif( koma==21 and hy1==4 )then --ひよこの場合 --最前列ではにわとりになる koma = 22 end --Ban[hx1][hy1]に駒がある場合は、自分の持ち駒となる if( bn[hx1][hy1]~=0 )then --持ち駒に追加します koma1 = tejun*10 + (bn[hx1][hy1] % 10) --にわとりはひよこにする if( koma1==12 )then koma1 = 11 end if( koma1==22 )then koma1 = 21 end for j=1,6 do if( mchi[tejun][j]==0 )then mchi[tejun][j] = koma1 break end end end bn[hx][hy] = 0 bn[hx1][hy1] = koma end tejun = 3 - tejun --手順を入れ替える --千日手のチェック chkflg = 0 for x=1,3 do for y=1,4 do if( bn[x][y]~=Ban[x][y] )then chkflg = 1 x = 4 break end end end if( chkflg==0 )then --王手が掛かっているかどうかのチェック --if( chkOute( 1 )==0 and chkOute( 2 )==0 )then --王手が掛かっていなければ、千日手カウントアップ sennichi = sennichi + 1 if( sennichi==3 )then return 1, bn, mchi end --end end end return 0, bn, mchi end ------------------------------------------ -- 王手が掛かっているかどうか調べます -- 0:王手無し、1:王手有り ------------------------------------------ function chkOute( plyer ) local x, y local lx, ly local lion = plyer*10+5 local aite = 3 - plyer --ライオンを探す for y=1,4 do for x=1,3 do if( Ban[x][y]==lion )then lx = x ly = y break end end end if( lx==nil or ly==nil )then return 0 end --nilのときはライオンがいない --ライオンを取れる駒があるかどうか調べる for y=1,4 do for x=1,3 do if( getPlyer( Ban[x][y] )==aite and chkMove( x, y, lx, ly, Ban[x][y] )==1 )then return 1 end end end return 0 end ------------------------------------------ -- 盤上の駒と持ち駒を描画します ------------------------------------------ function drawAll() local i,j --盤上の駒を描く for j=1,4 do for i=1,3 do dput( i, j, Ban[i][j] ) end end --持ち駒を描く for i=1,6 do mput( 1, i, Mochi[1][i] ) mput( 2, i, Mochi[2][i] ) end canvas.putflush() end ------------------------------------------ -- 将棋データを初期化します ------------------------------------------ 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] = 1312 KifuN = 2 Touryo = 0 end ------------------------------------------ -- 音声の初期化 ------------------------------------------ function initSound() local soundfile soundfile = LuaridaPath.."/".."hiyoko.ogg" if( sound.setSoundFile(soundfile, 1, 0 )==-1 )then return -1, soundfile end soundfile = LuaridaPath.."/".."niwatori.ogg" if( sound.setSoundFile(soundfile, 2, 0 )==-1 )then return -1, soundfile end soundfile = LuaridaPath.."/".."zou.ogg" if( sound.setSoundFile(soundfile, 3, 0 )==-1 )then return -1, soundfile end soundfile = LuaridaPath.."/".."kirin.ogg" if( sound.setSoundFile(soundfile, 4, 0 )==-1 )then return -1, soundfile end soundfile = LuaridaPath.."/".."lion.ogg" if( sound.setSoundFile(soundfile, 5, 0 )==-1 )then return -1, soundfile end --BGMデータの読み込み --soundfile = LuaridaPath.."/".."orebgm.ogg" --if( sound.setSoundFile(soundfile, 7, 0 )==-1 )then return -1, soundfile end return 0, soundfile end ------------------------------------------ --メインプログラム ------------------------------------------ function main() local dsyougibmp local x,y local winner, wstr local a local soundfile --背景 canvas.drawCls( BGColor ) --ワークエリア画面をクリアします canvas.workCls() --ワークエリアの(0,0)-(287,287)に動物将棋画像を読み込みます dsyougibmp = LuaridaPath.."/".."dbsgb4.png" if( canvas.loadBmp( dsyougibmp, 0, 0, 287, 287 )==-1)then dialog( dsyougibmp, "ロードに失敗しました",1 ) return end -- 音声の初期化 a, soundfile = initSound() if( a==-1 )then dialog( soundfile, "ロードに失敗しました",1 ) return end --BGMをリピート再生 --sound.start( 7, 1 ) while(true)do -- 将棋盤を描く drawSyogiBan() -- 将棋データを初期化します initKomadata() --盤上の駒と持ち駒を描画します drawAll() --どうぶつしょうぎスタート winner = doTouchAction() if( winner==3 )then --画面にテキストを表示 msgDisp( "ひきわけです" ) a = dialog( "せんにちてにより、ひきわけです", "もういちど、さしますか",2 ) else if( winner==1 )then wstr="せんて" elseif( winner==2 )then wstr="ごて" end --画面にテキストを表示 msgDisp( wstr.."のかち" ) a = dialog( wstr.."のかちです", "もういちど、さしますか",2 ) end if( a~=1 )then break end toast( "画面タッチではじまります", 0 ) touch(3) end --BGMの停止 --sound.stop( 7 ) toast( "画面タッチで終了します", 0 ) touch(3) end main()