#------------------------------------------ #【ソフト名】 オセロゲーム(人対ちょっと考えるコンピュータ) #【 作 者 】 bellyoshi #【 U R L 】 http://sourceforge.jp/users/bellyoshi/pf/ReversiGame/wiki/FrontPage #【連 絡 先】 tccwas@gmail.com #【 転載 】 全て許可 #【なでしこのバージョン】 ver.1.547 #【  実行 の 注意点  】 なし   #【   紹 介     】 コンピュータはちょっと考えて打ちます。 !変数宣言が必要 枠幅とは整数。枠幅は40。 左余白とは整数。左余白は300。 上余白とは整数。上余白は30。 現在局面とは局面。 現在局面を盤描画。 あなたとは文字列。 コンピュータとは文字列。 「あなたは黒ですか?」と二択。 もし、それがはいならば   あなたは「黒」。   コンピュータは「白」 違えば   あなたは「白」。   コンピュータは「黒」。 「あなたが{あなた}でコンピュータが{コンピュータ}で開始します。」と言う。 評価表とは配列。 評価表\0,0=45。評価表\0,1=-4。評価表\0,2=8。評価表\0,3=2。評価表\0,4=2。評価表\0,5=8。評価表\0,6=-4。評価表\0,7=45。 評価表\1,0=-4。評価表\1,1=-12。評価表\1,2=-5。評価表\1,3=-2。評価表\1,4=-2。評価表\1,5=-5。評価表\1,6=-12。評価表\1,7=-4。 評価表\2,0=8。評価表\2,1=-1。評価表\2,2=4。評価表\2,3=-1。評価表\2,4=-1。評価表\2,5=4。評価表\2,6=-1。評価表\2,7=-8。 評価表\3,0=2。評価表\3,1=-2。評価表\3,2=-1。評価表\3,3=0。評価表\3,4=0。評価表\3,5=-1。評価表\3,6=-2。評価表\3,7=2。 評価表\4,0=2。評価表\4,1=-2。評価表\4,2=-1。評価表\4,3=0。評価表\4,4=0。評価表\4,5=-1。評価表\4,6=-2。評価表\4,7=2。    評価表\5,0=8。評価表\5,1=-1。評価表\5,2=4。評価表\5,3=-1。評価表\5,4=-1。評価表\5,5=4。評価表\5,6=-1。評価表\5,7=-8。 評価表\6,0=-4。評価表\6,1=-12。評価表\6,2=-5。評価表\6,3=-2。評価表\6,4=-2。評価表\6,5=-5。評価表\6,6=-12。評価表\6,7=-4。 評価表\7,0=45。評価表\7,1=-4。評価表\7,2=8。評価表\7,3=2。評価表\7,4=2。評価表\7,5=8。評価表\7,6=-4。評価表\7,7=45。 もし現在局面の手番がコンピュータならば   思考する。 ■局面とは   ・手番   ・配置   ・終局   ・前手番   ・飛ばした   ・作る〜     手番は「黒」     配置は、      「空,空,空,空,空,空,空,空,{改行}」&      「空,空,空,空,空,空,空,空,{改行}」&      「空,空,空,空,空,空,空,空,{改行}」&      「空,空,空,黒,白,空,空,空,{改行}」&      「空,空,空,白,黒,空,空,空,{改行}」&      「空,空,空,空,空,空,空,空,{改行}」&      「空,空,空,空,空,空,空,空,{改行}」&      「空,空,空,空,空,空,空,空」。     終局はいいえ。     飛ばしたはいいえ。     前手番は「空」   ・複製(引継局面で)〜     手番は引継局面→手番。     配置は引継局面→配置。     終局は引継局面→終局。     飛ばしたは引継局面→飛ばした。     前手番は引継局面→前手番。   ・ひっくり返せる(横位置,縦位置から横方向,縦方向へ)〜     横とは整数。横は横位置+横方向。     縦とは整数。縦は縦位置+縦方向。     もし、横,縦が盤中ならば     違えば       それはいいえ。戻る。     石とは文字列。石は配置\縦,横     もし石が「空」なら       それはいいえ。戻る。     もし石が手番なら       それはいいえ。戻る。     横に横方向を直接足す。     縦に縦方向を直接足す。     (横,縦が盤中)の間       石は配置\縦,横。       もし、石が「空」なら         それはいいえ。戻る。       もし、石が手番なら         それははい。戻る。       横に横方向を直接足す。       縦に縦方向を直接足す。     それはいいえ。   ・ひっくり返す(横位置,縦位置から横方向,縦方向へ)〜     横とは整数。横は横位置+横方向。     縦とは整数。縦は縦位置+縦方向。     (横,縦が盤中)の間       石とは文字列。石は配置\縦,横。       もし、石が「空」なら戻る。       もし、石が手番なら戻る。       配置\縦,横は手番。       横に横方向を直接足す。       縦に縦方向を直接足す。   ・打つ(横,縦に)〜     配置\縦,横は手番。     もし、横,縦から0,1へひっくり返せるならば       横,縦から0,1へひっくり返す。     もし、横,縦から0,-1へひっくり返せるならば       横,縦から0,-1へひっくり返す。     もし、横,縦から1,0へひっくり返せるならば       横,縦から1,0へひっくり返す     もし、横,縦から1,-1へひっくり返せるならば       横,縦から1,-1へひっくり返す。     もし、横,縦から1,1へひっくり返せるならば       横,縦から1,1へひっくり返す。     もし、横,縦から-1,0へひっくり返せるならば       横,縦から-1,0へひっくり返す。     もし、横,縦から-1,1へひっくり返せるならば       横,縦から-1,1へひっくり返す。     もし、横,縦から-1,-1へひっくり返せるならば       横,縦から-1,-1へひっくり返す。   ・置ける(横,縦に)〜     石とは文字列。石は配置\縦,横     もし、石が「空」ならば     違えば       それはいいえ。戻る。     もし、横,縦から0,1へひっくり返せるならば       それははい。戻る。     もし、横,縦から0,-1へひっくり返せるならば       それははい。戻る。     もし、横,縦から1,0へひっくり返せるならば       それははい。戻る。     もし、横,縦から1,-1へひっくり返せるならば       それははい。戻る。     もし、横,縦から1,1へひっくり返せるならば       それははい。戻る。     もし、横,縦から-1,0へひっくり返せるならば       それははい。戻る。     もし、横,縦から-1,1へひっくり返せるならば       それははい。戻る。     もし、横,縦から-1,-1へひっくり返せるならば       それははい。戻る。     それはいいえ。   ・着手不可〜     横とは整数。     横で0から7まで繰り返す       縦とは整数。       縦で0から7まで繰り返す         もし、横,縦に置けるならば           それはいいえ。           戻る。     それははい。   ・手番交代〜     自身→手番は自身→手番を反転。     飛ばしたはいいえ。     もし、着手不可ならば       前手番は手番。       手番は手番を反転。       もし、着手不可ならば         終局ははい。       違えば         飛ばしたははい。 ●盤描画({グループ}対象局面を)   線太さは1   横とは整数。   縦とは整数。   横で0から7まで繰り返す     縦で0から7まで繰り返す       線色は黒色。塗り色は白色。       横×枠幅+左余白,縦×枠幅+上余白から(横+1)×枠幅+左余白,(縦+1)×枠幅+上余白へ四角。       石とは文字列。石は対象局面→配置\縦,横       もし石が「白」なら         線色は黒色。塗り色は白色。         横×枠幅 + 2 +左余白,縦×枠幅+2+上余白から(横+1)×枠幅+左余白-2,(縦+1)×枠幅+上余白-2へ円。       もし石が「黒」なら         線色は黒色。塗り色は黒色。         横×枠幅 + 2 +左余白,縦×枠幅+2+上余白から(横+1)×枠幅+左余白-2,(縦+1)×枠幅+上余白-2へ円。 #-----マウス判定-------------------------------------------------------- 母艦のマウス押した時は   入力横とは整数。   入力縦とは整数。   入力横は(母艦のマウスX-左余白)/枠幅。   入力縦は(母艦のマウスY-上余白)/枠幅。   入力横=入力横を切り下げ。   入力縦=入力縦を切り下げ。   もし、あなたが現在局面の手番ならば     もし、入力横,入力縦が盤中ならば       もし、現在局面の入力横,入力縦に置けるならば         現在局面の入力横,入力縦に打つ。         現在局面を盤描画。0.01秒待つ。         現在局面で手番交代及び表示。        違えば         「{入力横},{入力縦}に{現在局面→手番}は置けません」と言う。 ●盤中(横位置,縦位置が)   もし、0>横位置ならば     それはいいえ。戻る。   もし、横位置>7ならば     それはいいえ。戻る。   もし、0>縦位置ならば     それはいいえ。戻る。   もし、縦位置>7ならば     それはいいえ。戻る。   それははい。 ●勝敗判定   黒石数とは整数。黒石数は0。   白石数とは整数。白石数は0。   横とは整数。   横で0から7まで繰り返す     縦とは整数     縦で0から7まで繰り返す       石とは文字列。石は現在局面の配置\縦,横       もし、石が「白」ならば         白石数は白石数+1。       もし、石が「黒」ならば         黒石数は黒石数+1。   もし白石数>黒石数ならば     「{白石数}対{黒石数}で白の勝ちです。」と言う。   もし白石数<黒石数ならば     「{白石数}対{黒石数}で黒の勝ちです。」と言う。   もし白石数=黒石数ならば     「{白石数}対{黒石数}で引き分けです。」と言う。 ●空数({グループ}対象局面で)   数とは整数。数は0。   横とは整数。   横で0から7まで繰り返す     縦とは整数。     縦で0から7まで繰り返す       石とは文字列。石は対象局面→配置\縦,横。       もし、石が「空」ならば         数は数+1。   それは数。 ●思考する。   仮打局面とは変数。   仮打局面を局面として作成。   最善手横とは整数。最善手横は-1。   最善手縦とは整数。最善手縦は-1。   最善手評価とは整数。最善手評価は-9999。   深さとは整数。深さは3。   空数量とは整数。空数量は現在局面で空数。   もし、空数量<10ならば     深さは空数量+1。   横とは整数。   横で0から7まで繰り返す     縦とは整数。     縦で0から7まで繰り返す       もし、現在局面の横,縦に置けるならば         評価とは整数。         仮打局面→複製(現在局面で)。         仮打局面→打つ(横,縦に)。         仮打局面→手番は仮打局面→手番を反転。         評価は仮打局面,深さ,真で思考ルーチン評価         もし、最善手評価<評価ならば           最善手評価は評価。           最善手縦は縦。           最善手横は横。   もし、空数量<10ならば     「評価は{最善手評価}です。」と表示。   もし、最善手評価=-9999ならば     「最善手-9999失敗」と言う。   現在局面の最善手横,  最善手縦に打つ   現在局面を盤描画。   現在局面で手番交代及び表示。 ●思考ルーチン評価({グループ}対象局面,深数,打で)   仮打局面とは変数。   仮打局面を局面として作成。   もし、深数≦1ならば     それは対象局面で局面評価。   違えば     最善手横とは整数。最善手横は-1。     最善手縦とは整数。最善手縦は-1。     最善手評価とは整数。最善手評価は9999。     横とは整数。     横で0から7まで繰り返す       縦とは整数。       縦で0から7まで繰り返す         もし、(対象局面→置ける(横,縦に))ならば           評価とは整数。           仮打局面→複製(対象局面で)           仮打局面→打つ(横,縦に)           仮打局面→手番は仮打局面→手番を反転。           仮打局面→飛ばしたはいいえ。           評価は仮打局面,深数-1,真で相手思考ルーチン評価           もし、最善手評価>評価ならば             最善手評価は評価。             最善手縦は縦。             最善手横は横。     もし、最善手評価≠9999ならば       それは最善手評価。戻る。     違えば もし、打が偽ならば       評価とは整数。       評価は対象局面で数差。       それは評価。       戻る。     違えば       仮打局面→複製(対象局面で)       仮打局面→前手番は仮打局面→手番。       仮打局面→手番は仮打局面→手番を反転。       仮打局面→飛ばしたははい。       それは対象局面,深数,偽で相手思考ルーチン評価。 ●相手思考ルーチン評価({グループ}対象局面,深数,打で)   仮打局面とは変数。   仮打局面を局面として作成。   もし、深数≦1ならば     それは対象局面で局面評価。   違えば     最善手横とは整数。最善手横は-1。     最善手縦とは整数。最善手縦は-1。     最善手評価とは整数。最善手評価は-9999。     横とは整数。     横で0から7まで繰り返す       縦とは整数。       縦で0から7まで繰り返す         もし、(対象局面→置ける(横,縦に))ならば           評価とは整数。           仮打局面→複製(対象局面で)           仮打局面→打つ(横,縦に)           仮打局面→手番は仮打局面→手番を反転。           仮打局面→飛ばしたはいいえ。           評価は仮打局面,深数-1,真で思考ルーチン評価           もし、最善手評価<評価ならば             最善手評価は評価。             最善手縦は縦。             最善手横は横。     もし、最善手評価≠-9999ならば       それは最善手評価。戻る。     違えば もし、打が偽ならば       評価とは整数。       評価は対象局面で数差。       それは評価。       戻る。     違えば       仮打局面→複製(対象局面で)       仮打局面→前手番は仮打局面→手番。       仮打局面→手番は仮打局面→手番を反転。       仮打局面→飛ばしたははい。       それは対象局面,深数,偽で思考ルーチン評価。 ●局面評価({グループ}対象局面で)   評価とは整数。評価は0。   横とは整数。   横で0から7まで繰り返す。     縦とは整数。     縦で0から7まで繰り返す。       石とは文字列。石は対象局面→配置\縦,横       もし、石が「空」ならば       違えば もし、石がコンピュータならば         評価は評価+1×評価表\縦,横。       違えば         評価は評価-1×評価表\縦,横。   それは評価。 ●数差({グループ}対象局面で)   数とは整数。数は0。   横とは整数。   横で0から7まで繰り返す     縦とは整数。     縦で0から7まで繰り返す       石とは文字列。石は対象局面→配置\縦,横       もし、石が「空」ならば       違えば もし、石がコンピュータならば         数は数+1。       違えば         数は数-1。   それは数。 #----------------------------------------------------------------------- #手番交代 ●手番交代及び表示({グループ}対象局面で)   対象局面→手番交代。   もし、対象局面→終局ならば     勝敗判定。   違えば     もし、対象局面→飛ばしたならば       「{対象局面→前手番}は置くところがありません」と言う。     もし、対象局面→手番がコンピュータならば       思考する。 ●反転(石色を)   もし、石色が「黒」ならば     それは「白」   もし、石色が「白」ならば     それは「黒」