動物将棋 (15)
動物将棋にコンピュータとの対戦プログラムを追加したので、メニュも追加しました。紹介します。
対戦メニュ
- 人対人
- 先手が人、後手がコンピュータ
- 先手がコンピュータ、後手が人
- コンピュータ対コンピュータ
の対戦が選べます。コンピュータ対コンピュータは見ているだけで、面白くないです。Taisenというグローバル変数を用意して、それで人かコンピュータかを判断しています。
------------------------------------------ -- 対戦を決める ------------------------------------------ function selectTaisen() local ret = 0 item.clear() item.add( "ひとのたいせん", 0 ) item.add( "せんてがひと、ごでがコンピュータ", 0 ) item.add( "せんてがコンピュータ、ごでがひと", 0 ) item.add( "コンピュータどうしのたいせん", 0 ) item.add( "おしまい", 0 ) ret = item.list("たいせんをえらんでね") if( ret<1 or ret==5 )then ret = 0 end return ret end
待ったの戻り手数
コンピュータが考えているときに、「待った」ができないため、待ったで戻れる手数を指定できるようにしました。
oyatsu()プログラムが下記のように変更されています。
------------------------------------------ -- おやつ処理(メニュ処理のこと) ------------------------------------------ function oyatsu( x, y, sg ) 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 --まったの処理 item.clear() item.add( "1手もどる", 0 ) item.add( "2手もどる", 0 ) item.add( "3手もどる", 0 ) item.add( "4手もどる", 0 ) item.add( "5手もどる", 0 ) local tesu = item.list("なんてもどりますか?") if( tesu<0 )then tesu = 0 end if( KifuN>(tesu + 1) )then n = KifuN - (tesu + 1) ret, sg.bn, sg.mchi, sg.tjun = chkSenNichiTe( n, sg.bn ) sortMochiKoma( sg.mchi[1] ) sortMochiKoma( sg.mchi[2] ) KifuN = KifuN - tesu --棋譜データをまとめて保存する fwriteWork( 5 ) drawAll( sg.bn, sg.mchi ) msgDisp( "まった・・・" ) end elseif( a==2 )then --投了しました Touryo = 1 end end
対戦ループプログラム
対戦のループプログラムも、コンピュータとの対戦ができるように修正したので、大幅に変更されています。とりあえず、ソースだけ書いておきます。
------------------------------------------ -- タッチ操作処理 ------------------------------------------ function doTouchAction() local x,y,s local i,j local owari = 0 local winner = 0 local soundNaruUtu = 0 -- 0:音声ストップ, 1:成る, 2:打つ, 3:無音 local koma local beKoma={ koma, x, y } local afKoma={ koma, x, y } local tjun local sg = { bn={}, tjun, mchi={} } sg.bn[1] = { 0,0,0,0 } sg.bn[2] = { 0,0,0,0 } sg.bn[3] = { 0,0,0,0 } sg.mchi[1] = { 0,0,0,0,0,0 } sg.mchi[2] = { 0,0,0,0,0,0 } for x=1,3 do for y=1,4 do sg.bn[x][y] = Ban[x][y] end end for i=1,6 do sg.mchi[1][i] = Mochi[1][i] sg.mchi[2][i] = Mochi[2][i] end sg.tjun = Tejun while(true)do --人が指すルーチン if( Taisen==1 or (Taisen==2 and sg.tjun==1) or (Taisen==3 and sg.tjun==2) )then while(true)do x,y = touch(1) --駒にタッチするまで待つ getKomaNum( sg, beKoma ) if( beKoma.koma~=0 and beKoma.koma~=-1 and getPlyer(beKoma.koma)==sg.tjun )then break end oyatsu( x, y, sg ) --おやつ領域にタッチしたときはおやつ処理を行う if( Touryo==1 )then break end --投了した --「待った」で手順が変更されたときの対応 if( Taisen==4 or (Taisen==2 and sg.tjun==2) or (Taisen==3 and sg.tjun==1) )then break end touch(2) --指が画面から離れるまで待つ end end if( Touryo==1 )then --投了した msgDisp( "まいりました" ) winner = 3 - sg.tjun break end --oyatsu( x, y, sg )で「待った」して、sg.tjunが変更されていることが考えられるので、もう一度if文を入れる --引き続き人が指すルーチン if( Taisen==1 or (Taisen==2 and sg.tjun==1) or (Taisen==3 and sg.tjun==2) )then if( beKoma.y~=-1 )then --盤上の駒を消す dput( beKoma.x, beKoma.y, 0 ) else --持ち駒の絵を消す mput( sg.tjun, beKoma.x, 0 ) end --現在の画面をワークにキャッシュする canvas.getg( 0, 0, ViewWide-1, ViewHeight-1, 260, 0, 259+ViewWide, ViewHeight-1 ) while(true)do --駒移動ループ drawKoma( x, y, beKoma.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 getKomaNum( sg, afKoma ) --盤面から指が離れたときの状態が返ってくる end --コンピュータが考えるルーチン if( Taisen==4 or (Taisen==2 and sg.tjun==2) or (Taisen==3 and sg.tjun==1) )then compthink( sg, beKoma, afKoma ) end if( afKoma.koma~=-1 )then if( beKoma.y==-1 and afKoma.y~=-1 )then --持ち駒を打った if( komaUtsu( sg, beKoma, afKoma )==1 )then --棋譜の保存 Kifu[KifuN] = (beKoma.koma+50)*100 + afKoma.x*10 + afKoma.y fwriteWork( 4, Kifu[KifuN] ) --ファイルへのデータ書き込み KifuN = KifuN + 1 KifuText( sg.tjun, afKoma.x, afKoma.y, beKoma.koma ) sg.tjun = 3 - sg.tjun --手順を入れ替える soundNaruUtu = 2 end elseif( afKoma.y~=-1 )then --盤上の駒を動かした soundNaruUtu = komaMove( sg, beKoma, afKoma ) if( soundNaruUtu~=0 )then --棋譜の保存 Kifu[KifuN] = beKoma.x*1000 + beKoma.y*100 + afKoma.x*10 + afKoma.y fwriteWork( 4, Kifu[KifuN] ) --ファイルへのデータ書き込み KifuN = KifuN + 1 KifuText( sg.tjun, afKoma.x, afKoma.y, beKoma.koma ) sg.tjun = 3 - sg.tjun --手順を入れ替える end end end --盤上の駒と持ち駒を描画します drawAll( sg.bn, sg.mchi ) -- 駒を読み上げます speakKoma( soundNaruUtu, beKoma.koma ) soundNaruUtu = 0 --勝負がついたか調べます winner = chkSyobuAri( sg.bn ) --千日手をチェックします if( chkSenNichiTe( KifuN-1, sg.bn )==1 )then winner = 3 end if( winner~=0 )then break end end return winner end
以上です。実は動物の絵も。「にわとり」と「きりん」が少し変更されています。