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

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

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