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

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

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

以上です。実は動物の絵も。「にわとり」と「きりん」が少し変更されています。