🌸 「なでしこ」
>
🍯 「貯蔵庫」
リバーシ(1人用)
🌟新規
📒一覧
🔌
🔍検索
🚪ログイン
リバーシ(1人用) 📖
CPUと対戦するリバーシです。常にα-β法で3手読みます。
プログラム:
(→大)
# エディタ上で実行する場合は描画先の設定は不要 # 『#nako3_canvas_1』へ描画開始。 定数の無は0 定数の黒は1 定数の白は2 定数の盤サイズは8 定数の人数は2 定数の黒手番は1 定数の白手番は2 定数の方向位置は[ _ [-1,-1],[-1,0],[-1,1], _ [0,-1],[0,1], _ [1,-1],[1,0],[1,1] _ ] 定数の探索深度は3 人間番は1 手番は0 連続パス人数は0 盤状態は、[] 盤縦横は200 盤位置は[20,20] セル縦横は盤縦横/盤サイズの整数部分 盤縦横はセル縦横*盤サイズ ステータス内容は[] ステータス表示行数は12 ステータス行高さは16 ステータス位置は[盤位置[0]+盤縦横+8, 盤位置[1]+盤縦横-(ステータス表示行数*(ステータス行高さ+1))] 手番位置は[盤位置[0], 盤位置[1]+盤縦横+2] 定数の盤スコアは、[ _ [ 120, -20, 20, 5, 5, 20,-20,120], _ [ -20, -40, -5, -5, -5, -5, -40, -20], _ [ 20, -5, 15, 3, 3, 15, -5, 20], _ [ 5, -5, 3, 3, 3, 3, -5, -5], _ [ 5, -5, 3, 3, 3, 3, -5, -5], _ [ 20, -5, 15, 3, 3, 15, -5, 20], _ [ -20, -40, -5, -5, -5, -5, -40, -20], _ [ 120, -20, 20, 5, 5, 20,-20,120] _ ] ●初期化とは もし、盤サイズ=8&&人数=2ならば、 盤状態は、[ _ [0,0,0,0,0,0,0,0], _ [0,0,0,0,0,0,0,0], _ [0,0,0,0,0,0,0,0], _ [0,0,0,1,2,0,0,0], _ [0,0,0,2,1,0,0,0], _ [0,0,0,0,0,0,0,0], _ [0,0,0,0,0,0,0,0], _ [0,0,0,0,0,0,0,0] _ ] 違えば、 「初期の盤面が解りません。サイズを8にして、人数を2人にしてください」を言う 戻る ここまで 手番は0 連続パス人数は0 描画中キャンバスをマウス押した時には もし、(マウスX≧盤位置[0])&&(マウスX≦盤位置[0]+盤縦横)ならば、 もし、(マウスY≧盤位置[1])&&(マウスY≦盤位置[1]+盤縦横)ならば、 セルXは(マウスX-盤位置[0])/セル縦横+1の整数部分 セルYは(マウスY-盤位置[1])/セル縦横+1の整数部分 [セルX,セルY]をセルクリック ここまで ここまで ここまで ここまで ●開始とは 画面表示する 手番進む ここまで ●(盤状態から手番の)盤スコア計算とは スコアは0 Yを1から盤サイズまで繰り返す Xを1から盤サイズまで繰り返す 駒は盤状態[Y-1][X-1] もし、駒が無でなければ もし、駒が手番ならば スコア=スコア+盤スコア[Y-1][X-1] 違えば、 スコア=スコア-盤スコア[Y-1][X-1] ここまで ここまで ここまで ここまで スコアを戻す ここまで ●画面表示とは [0, 0, 描画中キャンバス["width"], 描画中キャンバス["height"]]に描画クリア 盤状態を盤表示 ステータス内容をステータス描画 手番表示 ここまで ●手番表示とは [手番位置[0], 手番位置[1], 描画中キャンバス["width"]-手番位置[0], 描画中キャンバス["height"]-手番位置[1]]に描画クリア もし、手番が人間番ならば、 情報は「今はあなたの番です」 違えば、 情報は「今はわたしの番です」 ここまで 黒色に塗り色設定 黒色に線色設定 [手番位置[0], 手番位置[1]+ステータス行高さ-2]に情報を文字描画 ここまで ●(ステータスを)ステータス描画とは [ステータス位置[0], ステータス位置[1], 描画中キャンバス["width"]-ステータス位置[0], 描画中キャンバス["height"]-ステータス位置[1]]に描画クリア もし、(ステータスの要素数)が0ならば、 戻る ここまで 黒色に塗り色設定 黒色に線色設定 Iで1から(ステータスの要素数)まで繰り返す 内容はステータス[I-1] [ステータス位置[0], ステータス位置[1]+I*ステータス行高さ]に内容を文字描画 ここまで ここまで ●(盤状態を)盤表示とは [盤位置[0], 盤位置[1], 盤縦横, 盤縦横]に描画クリア 緑色に塗り色設定 黒色に線色設定 1に線太さ設定 [盤位置[0], 盤位置[1], 盤縦横, 盤縦横]へ四角描画 白色に線色設定 Iを1から盤サイズ-1まで繰り返す [盤位置[0]+I*セル縦横, 盤位置[1]]から[盤位置[0]+I*セル縦横, 盤位置[1]+盤縦横]へ線描画 [盤位置[0], 盤位置[1]+I*セル縦横]から[盤位置[0]+盤縦横, 盤位置[1]+I*セル縦横]へ線描画 ここまで Yを1から盤サイズまで繰り返す Xを1から盤サイズまで繰り返す 駒は盤状態[Y-1][X-1] もし、駒が無でなければ、 もし、駒が黒ならば、 黒色に塗り色設定 白色に線色設定 違えば、 黒色に線色設定 白色に塗り色設定 ここまで [盤位置[0]+X*セル縦横-セル縦横/2, 盤位置[1]+Y*セル縦横-セル縦横/2]にセル縦横/2-2の円描画 ここまで ここまで ここまで ここまで ●(MSGを)ステータス表示とは もし、(ステータス内容の要素数)がステータス表示行数ならば、 ステータス内容の0を配列切取する ここまで ステータス内容にMSGを配列追加する ステータス内容をステータス描画 ここまで ●(仮盤状態にセル位置を自色で)仮打ちとは ゲットは0 Iを1から方向位置の要素数まで繰り返す 方向は方向位置[I-1] 現位置は[セル位置[0], セル位置[1]] オンの間、 現位置[0]=現位置[0]+方向[0] 現位置[1]=現位置[1]+方向[1] もし、現位置[0]<1||現位置[0]>盤サイズ||現位置[1]<1||現位置[1]>盤サイズならば、 抜ける ここまで 駒は仮盤状態[現位置[1]-1][現位置[0]-1] もし、駒が無ならば、 抜ける ここまで もし、駒が自色ならば、 オンの間、 現位置[0]=現位置[0]-方向[0] 現位置[1]=現位置[1]-方向[1] もし、現位置[0]=セル位置[0]&&現位置[1]=セル位置[1]ならば、 抜ける ここまで ゲットはゲット+1 仮盤状態[現位置[1]-1][現位置[0]-1]は自色 ここまで 抜ける ここまで ここまで ここまで ゲットを戻す ここまで ●(セル位置に手番を)駒置くとは もし、盤状態[セル位置[1]-1][セル位置[0]-1]=無でなければ、 「駒のある所には置けません」をステータス表示 オフで戻る ここまで 仮盤状態は盤状態を配列複製 ゲット数は仮盤状態にセル位置を手番で仮打ち もし、ゲット数>0ならば、 盤状態は仮盤状態 盤状態[セル位置[1]-1][セル位置[0]-1]は手番 盤状態を盤表示 オンで戻る ここまで 「駒を取れないところには置けません」をステータス表示 オフで戻る ここまで ●(セル位置を)セルクリックとは もし、手番が人間番ならば、 結果はセル位置に人間番を駒置く もし、結果ならば、 手番進む ここまで 違えば、 「あなたの順番ではありません」をステータス表示 ここまで ここまで ●手番進むとは 画面表示する もし、盤状態を終局判定ならば、 終局処理 戻る ここまで 手番は手番+1 もし、手番>人数ならば 手番=1 ここまで 手番表示 0秒後には もし、手番が人間番ならば、 人間思考実行 違えば、 CPU思考実行 ここまで ここまで ここまで ●人間思考実行とは もし、盤状態に手番がパス判定ならば、 「置くところが無いみたいですね。」をステータス表示 「パスを受け付けました」をステータス表示 パス処理 違えば、 連続パス人数は0 // 人間の操作待ち ここまで ここまで ●CPU思考実行とは もし、盤状態に手番がパス判定ならば、 「置くところが見当たらないです。」をステータス表示 「パスします」をステータス表示 パス処理 違えば、 連続パス人数は0 0秒後には、 CPU手番 ここまで ここまで ここまで ●パス処理とは 連続パス人数は連続パス人数+1 もし、連続パス人数≧人数ならば、 「全員がパスしたので終わりです。」をステータス表示 0秒後には 終了処理 ここまで 違えば、 手番進む ここまで ここまで ●終局処理とは 「空いている升が無いので終わりです。」をステータス表示 0秒後には 終了処理 ここまで ここまで ●(仮盤状態を)終局判定とは Yを1から盤サイズまで繰り返す Xを1から盤サイズまで繰り返す 駒は仮盤状態[Y-1][X-1] もし、駒が無ならば、 オフで戻る ここまで ここまで ここまで オンで戻る ここまで ●(仮盤状態に自色が)パス判定とは 一時盤状態は仮盤状態を配列複製 セル位置は[0, 0] Yを1から盤サイズまで繰り返す Xを1から盤サイズまで繰り返す 駒は仮盤状態[Y-1][X-1] セル位置[0]はX セル位置[1]はY もし、駒が無ならば、 仮ゲット数は一時盤状態にセル位置を自色で仮打ち もし、仮ゲット数>0ならば オフで戻る ここまで ここまで ここまで ここまで オンで戻る ここまで ●終了処理とは カウントは[0,0,0] Yを1から盤サイズまで繰り返す Xを1から盤サイズまで繰り返す 駒は盤状態[Y-1][X-1] カウント[駒]はカウント[駒]+1 ここまで ここまで もし、カウント[黒]=カウント[白]ならば、 「引き分けに終わりました。」をステータス表示 ここまで もし、カウント[黒]>カウント[白]ならば、 「黒の勝ちです。」をステータス表示 ここまで もし、カウント[黒]<カウント[白]ならば、 「白の勝ちです。」をステータス表示 ここまで 「お疲れさまでした」をステータス表示 描画中キャンバスをマウス押した時には ここまで ここまで ●CPU手番とは 次手は盤状態に手番で探索深度までAB法 もし、次手[0]=0ならば、 「手がおかしいです」を表示する 次手を表示する 戻る ここまで 結果は次手に手番を駒置く もし、結果ならば、 手番進む 違えば、 「最善手だと思った手が失敗しました」を表示する 次手を表示する ここまで ここまで ●(仮盤状態に仮手番で探索深度まで)AB法とは 自手番は仮手番 次手は[0,0] 手候補リストは仮盤状態に自手番で手候補取得 もし、(手候補リストの要素数)が0ならば、 次手で戻る ここまで 次手番は仮手番+1 もし、次手番>人数ならば、 次手番は1 ここまで 下限は-99999 上限は99999 Nを1から手候補リストの要素数まで繰り返す 手候補は手候補リスト[N-1] スコアは手候補["事後"]に次手番で探索深度の自手番を[下限, 上限]とAB もし、スコア>下限ならば 下限はスコア 次手は手候補["手"] ここまで もし、下限≧上限ならば、 抜ける ここまで ここまで 次手で戻る ここまで ●(仮盤状態に仮手番で現深度の自手番を閾値と)ABとは もし、現深度が0ならば、 仮盤状態から自手番の盤スコア計算で戻る ここまで 手候補リストは仮盤状態に自手番で手候補取得 もし、(手候補リストの要素数)が0ならば、 仮盤状態から自手番の盤スコア計算で戻る ここまで 次手番は仮手番+1 もし、次手番>人数ならば、 次手番は1 ここまで 次深度は現深度-1 下限は閾値[0] 上限は閾値[1] もし、仮手番が自手番ならば、 Nを1から手候補リストの要素数まで繰り返す 手候補は手候補リスト[N-1] スコアは手候補["事後"]に次手番で次深度の自手番を[下限, 上限]とAB もし、スコア>下限ならば 下限はスコア ここまで もし、下限≧上限ならば、 抜ける ここまで ここまで 下限で戻る 違えば、 Nを1から手候補リストの要素数まで繰り返す 手候補は手候補リスト[N-1] スコアは手候補["事後"]に次手番で次深度の自手番を[下限, 上限]とAB もし、スコア<上限ならば 上限はスコア ここまで もし、下限≧上限ならば、 抜ける ここまで ここまで 上限で戻る ここまで ここまで ●(仮盤状態に自色で)手候補取得とは 手候補リストは[] 一時盤状態は仮盤状態を配列複製 セル位置は[0, 0] Yを1から盤サイズまで繰り返す Xを1から盤サイズまで繰り返す 駒は仮盤状態[Y-1][X-1] セル位置[0]はX セル位置[1]はY もし、駒が無ならば、 仮ゲット数は一時盤状態にセル位置を自色で仮打ち もし、仮ゲット数>0ならば 手候補は{} 手候補["手"]はセル位置 手候補["ゲット"]は仮ゲット数 手候補["スコア"]は(一時盤状態から自色の盤スコア計算) 手候補["事後"]は一時盤状態 手候補リストに手候補を配列追加 一時盤状態は仮盤状態を配列複製 セル位置は[0, 0] ここまで ここまで ここまで ここまで 手候補リストで戻る ここまで 初期化する 開始する
プログラムを実行
⭐ てぃふと@うぇいく 作
タイトル:
リバーシ(1人用)
ライセンス:
CC0 (著作権破棄)
タイプ:
wnako
タグ:
-
利用バージョン:
3.3.55
作成日時:
2020/12/10 22:24 (編集: 2022/06/21 20:25)
公開の投稿
⭐⭐⭐⭐⭐...👍43
ログイン
して★を付けよう!
Twitterへ投稿
📝作品を編集
作品公開情報
📍この作品のURL:
📍アプリ(即時実行)のURL:
📍アプリ(実行ボタンあり)のURL:
📍ブログパーツ:
上記HTML↑をブログに貼り付けることでアプリを埋め込めます。
📍ライブラリ直リンク - 『!「***」を取込』で使うとき:
📍なでしこハブ (最新版の反映は1日後):
ソースの確認
編集履歴の確認
通報数:
0
通報って何?