以前作っていたReversiスクリプトを少しいじって公開。いわゆるオセロです。

ルール:
まず黒と白を選択します。ゲーム中はその選んだ色しか置けません。
(今回プレイヤーは黒固定です)
基本的に交互の順番がまわってきて石を置いていきます。
縦、横、斜めの列において同色の石で異なる色の石を挟むと、
挟まれた石は全て挟んだ石の色にできます。
石を置ける場所は上のように挟むことのできる場所のみです。
石を置ける場所がない場合はパスとなり番が流れ相手の番になります。
石を置ける場所がある場合はパスができません。
両者とも置くところがなくなったときゲーム終了です。
勝敗は選んだ色の石の多いほうの勝ちです。
導入方法:
下のスクリプトを全部scriptに組み込んだ後、
script_Riversi.zipを展開してscript_Riversiの中にあるReversiフォルダをGraphicsフォルダの中に入れます。
その後 DataManager(もともとある方を)を開いて
load_normal_data_takoreversiをself.initのload_databaseのあたりにおいてください。
例
使用する画像
script_Riversi.zip
スクリプト
Riversi_DataManager.txt
Riversi_Cache.txt
Riversi_Normal_People.txt
Riversi_Window_Reversi.txt
Riversi_Scene_Riversi_Message.txt
Riversi_Scene_Riversi.txt
Riversi_Scene_Riversi_AI.txt
使い方:
Reversi_DataManagerの中の$MINIGAMERESULTの番号の変数値に勝敗結果が入ります。
引き分けで0
プレイヤーが勝ちで1
相手が勝ちで2が入ります。
SceneManager.call(Scene_Riversi)で呼び出して開始してください。
例
AIについて:
デフォルトのAIもついていますが打てる場所にランダムに打っているだけなので弱いです。
AIは適当に作ってみてください。
もし作るのが面倒な方はまだ未完成なAIを用意したので使ってみてください。
Riversi_Scene_Riversi_AI2.txt
上のスクリプトの導入するときRiversi_Scene_Riversi_AIよりも下に配置してください。
(AIの一部の関数を部分を上書き更新するので)
テストゲーム(1.42MB)
(AI作成)
Riversi_Scene_Riversi_AI内にあるmake_cpu_aiのput_valueで(ix , iy)のセルに置く重みを決めます。
つまりput_valueが大きいほど置く可能性が高くなります。(Riversi_Scene_Riversi_AI2の場合はあまりにも最大のものと差がある場合は0になるようにしていますが、デフォルトではその機能はありません)
@stageという変数がありますが1で通常のゲーム,0ではじめに好きな場所に石が置けて
その後にゲームスタートできるのでAIのチェック用に使えます。
@boardでボードの石情報の配列です。
0で空白,1で黒,2で白です。
主な関数。
get_board_data(x , y , board = @board) : ボードの石をx,y座標で取得
set_board_data(x , y , value, board = @board) :x,yの座標のセルをvalueの状態にする。
reverse_stone(x , y , color , board = @board) : 石を返す。(置いた石は含まれない)
player_color : プレイヤーの石
cpu_color : コンピュータの石
op_color(color) : colorとは異なる色の石
find_puttable_cell(color , board = @board) : 置くことのできるセルのIDを配列で返す。
reverse_stone_puttable?(x , y , color , board = @board):石を置く事ができるか?
number_stone(color , board = @board) : 石の数のカウント
difference_stone(color = player_color , board = @board) : 石の個数差 (color の石 - 反対の石)
get_empty_cells(board = @board) :空白のセルのIDを配列で返す。
puttable_cell_exist?(color , board = @board) : 指定した石の置き場所があるか判定。
reversi_end?(board = @board) : ゲーム終了の判定。(ともに置き場所がない)
(余談)
Riversi_Scene_Riversi_AI2のAIだと終盤若干重いときがある。
なぜなら完全読みをさせているから。
再帰関数を利用して完全読みさせているんだけど
以前やったときうまくいかなくてrubyだと遅延評価はできないのかなと思ってたんだけど
先日またやってみたらなんか上手くいった。
RPGツクールの更新が1回あったからそこでなにか変更があったのか、それとも私の気のせいかもしれない。
ちょっとした遊びでデフォルトで遅延評価のhaskellでオセロを作ったことがあるので
そこから完全読みの部分だけ引っ張ってこれないかなと考えていたんだけど
まぁなんかrubyでも上手くいったのでそういう手間をかけることもなくなった。