しいたけサイクロン・アーカイブス

  1. トップ
  2. RGSS
  3. リバーシEx スクリプト

リバーシEx スクリプト

概要

現在、画面サイズが640, 480のバージョンです。通常画面サイズの場合はもう少しお待ちください

リバーシを実行できます。

仕様

リバーシをマップ上のイベントで呼び出せます。

ver.1との変更点

AIや顔グラフィク、メッセージの異なった対戦相手を作れます。
ゲーム中にキャンセルを実行できるかを設定できます。
定石を設定できます。

テストゲーム

REversi_sp_GY_ver.2.2.zip (1.4MB)

(注)テストゲームを行うにはRPGツクールVXAceのRTPが必要です。

スクリプト

・DataManager
DataManager
DataManagerOP(チャプターの設定)

・Cache
Cache

・クラス
CompCalcNode
Ecomp
Normal_Person
Opening_Node
Reversi_Message
SCENE_AI_OPENING
Scene_Reversi
Scene_Reversi_AI
Scene_Reversi_AI2
Scene_Reversi_Message
Window_Reversi

使用方法の説明

導入法

上のスクリプトたちを導入した後、本体のDataManager内のself.initのcreate_game_objectsの下にload_normal_data_takoreversiload_normal_data_takoreversi2を挿入してください。

使い方

マップ上のイベントコマンドでSceneManager.call(Scene_Riversi)を実行するとリバーシゲームが始まります。

最初にAIの流れを簡単に説明しておくと、
序盤(定石に従う)
中盤(評価値に従って打つ手を選択する)
終盤(角が取られる状況)
最終版(完全読み)
となります。

DataManagerのload_normal_data_takoreversiにある$REVERSIRESULTでリバーシの結果を入れる変数のIDを指定します。
$REVERSIFIRST で指定されたIDの変数の値でどちらが先攻するかを決めます。(変数値が0のときはプレイヤー先攻、それ以外で後攻になります)
$reversi_chara_idで指定されたIDの変数の値が対戦相手のIDとなります。
$reversi_chancelでリバーシを途中でキャンセルできるかを設定します。(trueでキャンセル可、falseでキャンセル不可)
DataManagerOPにおいて序盤の定石を登録できますがやり方は後述します。
$data_normal_personで対戦相手を設定します。
$data_normal_person[cid] = Normal_Person.new(cid)でIDがcidの対戦相手を作ります。
$data_normal_person[cid].nameで対戦相手の名前を設定します。 $data_normal_person[cid].face_nameと$data_normal_person[cid].face_indexで対戦相手の顔の 画像ファイル名とその番地を指定します。 $data_normal_person[cid].pre_eval_depthでvalue_eval_degreeを使う際の読みの深さを設定します。
あまり深くすると時間がかかるので4以下にしておくことをお勧めします。
$data_normal_person[cid].eval_fazzyでvalue_eval_degreeにおける評価値にどれだけ従うかを設定します。 値が大きいほど評価値の最善のみを選択するようになります。0以上の実数値を指定します。
$data_normal_person[cid].ai_complete_startで完全読みを開始する残り手数を設定します。ここをあまりにも大きくするととてつもなく時間がかかるので 12以下にすることをお勧めします。
$data_normal_person[cid].ai_functionsで中盤に使う評価関数たちを指定します。(評価関数たちについては後述)
$data_normal_person[cid].pre_last_functionsで完全読みよりも前に角を取られる状況になったときの評価関数たちを設定します。
$data_normal_person[cid].opening_list = [定石名,[a,b]]で序盤に使う定石を指定します。これにより定石に分岐する地点で、その定石が選択されるウエイトがa/bになります。 [a,b]の要素は、省略可能で省略した場合は[1,1]となります。DataManagerOPの$data_openingにあるハッシュのキーが定石名になります。({"hogehoge" => [node1,...,noden]}における"hogehoge"のことです)
$data_normal_person[cid].messages["win"]で勝利時のメッセージ
$data_normal_person[cid].messages["lose"]で敗北時のメッセージ
$data_normal_person[cid].messages["drow"]で引き分け時のメッセージ
$data_normal_person[cid].messages["start"]で開始時のメッセージ
$data_normal_person[cid].messages["normal"]で中盤のメッセージ1
$data_normal_person[cid].messages["normal2"]で中盤のメッセージ2
$data_normal_person[cid].messages["normal3"]で中盤のメッセージ3
$data_normal_person[cid].messages["last"]で最後の手を打つ時のメッセージ
$data_normal_person[cid].messages["pre_last"]で完全読みの時のメッセージ
$data_normal_person[cid].messages["pass"]でCPUがパスの時のメッセージ
$data_normal_person[cid].messages["pass2"]でプレイヤーがパスの時のメッセージ
$data_normal_person[cid].messages["opening"]で序盤の定石時のメッセージ
$data_normal_person[cid].messages["reaction"]で相手の手を見た時のメッセージ
$data_normal_person[cid].messages["reaction2"]で相手の手を見た時のメッセージ2
$data_normal_person[cid].messages["reaction3"]で相手の手を見た時のメッセージ3
$data_normal_person[cid].messages["reaction_onepoint"]でプレイヤーの打つ場所が1箇所の時の反応メッセージ
$data_normal_person[cid].messages["normal_one_point"]でCPUの打つ場所が1箇所の時のメッセージ
$data_normal_person[cid].messages["reaction_last"]でゲーム終了時のメッセージ
をセットできます。
メッセージは文字列の配列となります。[1列目,2列目]のように配列のindexでメッセージの列が決まります。
をセットできます。
$data_normal_person[cid].messages[code]でメッセージ時に顔を変更します。
(codeは上のメッセージのところにあるような文字列を入れます。(例:"win"で勝利時))

ai_functionsの配列には中盤に評価に使用する関数を文字列で指定します。
"value_eval_degree"で数手先の盤面から評価値を算出します。総合的な評価値です。
"value_x"でx打ち関連の評価、
"value_c"でc打ち関連の評価、
"value_prevent_corner_put"で角を取られるのを防ぐようにします。
"value_corner_put"で角をとりに行きます。
"value_edge"で辺周りの評価をします。
"value_less_number" で評価値が返す石の数に反比例します。

pre_last_functionsの配列には終盤に評価に使用する関数を指定します。
上のai_functionsで使った文字列に加えて次の文字列が使えます。 "put_in_pre_last"で簡易な終盤の評価を返します。

定石の設定法はこちら
定石設定

広告

使用例

IDが2の対戦相手を作ってみます。

$data_normal_person[2] = Normal_Person.new(2)

この対戦相手の設定を行ってみます。
名前はスティーナ、画像はデフォルトのバニーガールの画像を使い、
value_eval_degreeの深さは2、
完全読みは残り5手から開始します。

$data_normal_person[2].pre_eval_depth = 2
$data_normal_person[2].ai_complete_start = 5
$data_normal_person[2].name = "スティーナ"
$data_normal_person[2].face_name = "People3.png"
$data_normal_person[2].face_index = 7

次に中盤と終盤の手筋にかかわる評価関数を設定します。

$data_normal_person[2].ai_functions =
["value_eval_degree","value_","value_x","value_c","value_corner_put","value_prevent_corner_put"]
$data_normal_person[2].pre_last_functions = ["put_in_pre_last"]
$data_normal_person[2].eval_fazzy = 2.0

今回は
"value_eval_degree","value_","value_x","value_c","value_corner_put","value_prevent_corner_put"を使います。 value_eval_degreeは3手以上の読みの深さがあれば、他はなしでも十分なのですが手数が少ない場合は角や辺をうまく対処できないため 個別にそれぞれを対処する関数を入れてやる必要があります。またeval_fazzy = 2.0程度にしておきます。

次に序盤の定石を設定します。

$data_normal_person[2].opening_list =[
["opening_rabbit0",[0,1]],
["opening_tiger0"],["opening_ship0"],
["opening_tairyo0"],["opening_tobidashi0",[4,5]],
["opening_tobidashi0"],["opening_snake0",[1,2]],
["opening_buffalo0",[1,5]],["opening_rat0",[0,1]]
]

"opening_rabbit0"の定石や"opening_rat0"の定石は[0,1]によりウエイトが0になっているので自ら行うことはありませんが、定石そのものはセットしてあるので 相手に打たれた場合は定石通りに対処します。 自分からは"opening_tiger0"の定石を選択します。

次にメッセージの設定です。

$data_normal_person[2].messages["win"] = ["私の勝ちよ!"]
$data_normal_person[2].messages["lose"] = ["悔しい…" ]
$data_normal_person[2].messages["drow"] = ["うーん、惜しかったなぁ…。"]
$data_normal_person[2].messages["start"] = ["よーし、やるぞー。"]
$data_normal_person[2].messages["normal"] = ["ここね。"]
$data_normal_person[2].messages["normal2"] = ["うーん…","ここかな。"]
$data_normal_person[2].messages["normal3"] = ["これならどう?。"]
$data_normal_person[2].messages["last"] = ["これでおしまい。"]
$data_normal_person[2].messages["pre_last"] = ["ここね。"]
$data_normal_person[2].messages["pass2"] = ["パスみたいね。"]
$data_normal_person[2].messages["pass"] = ["打つところがないわ…","パスよ。"]
$data_normal_person[2].messages["opening"] = [ "ここまでは定石の範囲ね。"]
$data_normal_person[2].messages["reaction"] = ["ほうほう…"]
$data_normal_person[2].messages["reaction2"] = ["なるほど…"]
$data_normal_person[2].messages["reaction3"] = ["そこかぁ。"]
$data_normal_person[2].messages["reaction_onepoint"] = ["そこしかないわね。"]
$data_normal_person[2].messages["reaction_last"] = ["これで終わりね。"]
$data_normal_person[2].messages["normal_one_point"] = ["ここにしか打てないわ。"]

こうすることで新しい対戦相手が作れました。
そして実際対戦してみます。
まず$reversi_chara_id = 2なのでID2の変数を2に設定します。

そして下のようになります。

質問やバグなどの報告は製作ブログのコメント欄でお願いします。
ブログ

広告