この記事で紹介されているスクリプトは理解しやすく、使いやすく、すぐに習得できます。
シンプルなサイコロロール
多くのゲームやゲーム システムではサイコロが必要です。まずは簡単な部分、つまり 6 面体のサイコロを振ることから始めましょう。基本的に、6 面体のサイコロを振ることは、1 から 6 までの乱数を選択するだけです。 PHP では、これは非常に単純です: echo rand(1,6);。
多くの場合、これは基本的に簡単です。しかし、運次第のゲームを扱う場合は、より良い実装が必要です。 PHP は、より優れた乱数ジェネレーター mt_rand() を提供します。 2 つの違いをあまり深く掘り下げずに、mt_rand はより高速で優れた乱数生成器であると考えることができます: echo mt_rand(1,6);。この乱数ジェネレーターを関数に組み込むとさらに良くなります。
リスト 1. mt_rand() 乱数生成関数の使用
関数ロール () {
mt_rand(1,6) を返します;
}
エコーロール();
次に、振りたいサイコロの種類をパラメータとして関数に渡すことができます。
リスト 2. サイコロの種類をパラメータとして渡す
関数ロール ($sides) {
return mt_rand(1,$sides);
}
echo roll(6); // 6 面体のサイコロを振る
echo roll(10); // 10 面サイコロを振る
echo roll(20); // 20 面のサイコロを振る
ここから、必要なだけ一度にサイコロを振り続け、結果の配列を返すことができます。また、異なる種類の複数のサイコロを一度に振ることもできます。ただし、ほとんどのタスクはこの単純なスクリプトを使用して実行できます。
ランダムな名前ジェネレーター
ゲームを実行したり、ストーリーを書いたり、一度に多数のキャラクターを作成したりしている場合、絶え間なく流れてくる新しい名前に追いつくのが大変な場合があります。この問題を解決するために使用できる単純なランダム名ジェネレーターを見てみましょう。まず、2 つの単純な配列を作成しましょう。1 つは名用、もう 1 つは姓用です。
リスト 3. 名と姓の 2 つの単純な配列
$male = 配列(
「ウィリアム」
「ヘンリー」
「ヘーゼルベルト」
「ジョン」
「パット」
);
$last = 配列(
「スミス」
「ジョーンズ」
「ウィンクラー」
「クーパー」
「クライン」
);
その後、各配列からランダムな要素を選択できます: $last[array_rand($last)] 。複数の名前を一度に抽出するには、配列を混合し、必要に応じて抽出するだけです。
リスト 4. 混合名の配列
シャッフル($male);
シャッフル($last);
for ($i = 0; $i
$last[$i] をエコーします。
}
この基本概念に基づいて、姓名を保持するテキスト ファイルを作成できます。テキスト ファイルの各行に名前を保存すると、ファイルの内容を改行で区切ってソース コードの配列を簡単に構築できます。リスト 5. 名前のテキスト ファイルの作成
$male = 爆発(
、file_get_contents(names.女性.txt));
$last = 爆発(
、file_get_contents(names.last.txt));
シーンジェネレーター
名前ジェネレーターの構築に使用したのと同じ基本原則を使用して、シーンジェネレーターを構築できます。このジェネレーターは、ロール プレイング ゲームだけでなく、擬似ランダム環境のコレクション (ロール プレイング、即興、執筆などに使用できる) を使用する必要がある状況でも役立ちます。私のお気に入りのゲームの 1 つである Paranoia には、GM パックに「ミッション ブレンダー」が含まれています。ミッション ミキサーを使用すると、サイコロをすばやく振りながら、完全なミッションを組み合わせることができます。独自のシーンジェネレーターを組み立ててみましょう。
次のシナリオを考えてみましょう。あなたは目が覚めると、ジャングルの中で迷っていることに気づきました。ニューヨークに行かなければならないことはわかっていますが、その理由はわかりません。近くで犬の吠え声と敵の探索者の独特の音が聞こえます。あなたは寒くて震えていて、武装していません。シーン内の各文は、シーンの特定の側面を紹介します:
「目が覚めると、あなたはジャングルで迷っていることに気づきました。」この一文が設定を確立します。
「ニューヨークに行かなければならないことはわかっていますね」 - この文は目標を説明します。
「犬の吠え声が聞こえます」—この文は敵を紹介します。
「あなたは寒くて震えていて、武装していません。」この文はさらに複雑になります。
姓と名用のテキスト ファイルを作成したのと同じように、まず設定、目的、敵、および複雑さ用に個別のテキスト ファイルを作成します。サンプル ファイルはコード アーカイブに含まれています。これらのファイルを取得したら、シーンを生成するコードは基本的に名前を生成するコードと同じになります。
リスト 6. シーンの生成
$settings = 爆発("
", file_get_contents(scenario.settings.txt));
$objectives = 爆発("
", file_get_contents(scenario.objectives.txt));
$アンタゴニスト = 爆発("
", file_get_contents(scenario.antagonists.txt));
$complicati**** = 爆発("
", file_get_contents(scenario.complicati****.txt));
シャッフル($設定);
シャッフル($objectives);
シャッフル($アンタゴニスト);
シャッフル($complicati****);
$settings[0] .
$complicati****[0] . "
";
新しいテキスト ファイルを追加することでシーンに要素を追加できますが、複数の複雑さを追加したい場合もあります。基本的なテキスト ファイルに追加するコンテンツが増えるほど、時間の経過とともにシーンがより多く変化します。
デッキビルダーとシャッフル
リスト 7. 標準的なトランプのデッキを作成する
$suits = 配列 (
「スペード」、「ハート」、「クラブ」、「ダイヤモンド」
);
$faces = 配列 (
「二」、「三」、「四」、「五」、「六」、「七」、「八」、
「ナイン」、「テン」、「ジャック」、「クイーン」、「キング」、「エース」
);
次に、すべてのカードの値を保持するデッキ配列を構築します。これは、1 対の foreach ループを使用するだけで簡単に実行できます。
リスト 8. カードの配列を作成する
$deck = array();
foreach ($suits を $suit) {
foreach ($faces として $face) {
$deck[] = 配列 ("顔"=>$face, "スーツ"=>$suit);
}
}
トランプの配列を作成したら、簡単にデッキをシャッフルし、ランダムにカードを引くことができます。
リスト 9. デッキをシャッフルし、ランダムにカードを 1 枚引く
シャッフル($デッキ);
$card = array_shift($deck);
$card[顔] をエコーします。
勝率計算ツール: 取引
カードのデッキを構築するときに各カードの表とスーツが個別に追跡されるため、そのデッキをプログラムで使用して、特定のカードが得られる確率を計算できます。まず、各手札からカードを 5 枚ずつ引きます。
リスト 10. 各手から 5 枚のカードを引く
$hands = array(1 =>array(), 2=>array());
for ($i = 0; $i
$hands[1][] = implode(" of ", array_shift($deck));
$hands[2][] = implode(" of ", array_shift($deck));
}
その後、デッキを見て、カードが何枚残っているか、特定のカードを引く確率がどのくらいかを確認できます。カードが何枚残っているかが簡単にわかります。 $deck 配列に含まれる要素の数を数えるだけです。特定のカードを引くチャンスを得るには、デッキ全体を調べて残りのカードを推定し、それらが一致するかどうかを確認する関数が必要です。リスト 11. 特定のカードを引く確率の計算
関数計算オッズ($draw, $deck) {
$remaining = count($deck);
$オッズ = 0;
foreach ($deck を $card として) {
if ( ($draw[顔] == $card[顔] && $draw[スーツ] ==
$card[スーツ] ) ||
($draw[顔] == && $draw[スーツ] == $card[スーツ] ) ||
($draw[顔] == $card[顔] && $draw[スーツ] == ) ) {
$オッズ++;
}
}
$残りの $odds を返します;
}
どのカードを引くかを選択できるようになりました。シンプルにするために、カードのような配列を渡します。特定のカードを探すことができます。
リスト 12. 指定されたカードを検索します
$draw = array(顔 => エース、スーツ => スペード);
echo implode(" of ", $draw) : .calculate_odds($draw, $deck);
または、指定した顔またはスーツのカードを検索することもできます。
リスト 13. 指定されたカードフェイスまたはスーツのカードを検索します
$draw = array(face => , suit => スペード);
$draw = array(顔 => エース、スーツ => );
シンプルなポーカーディーラー
デッキ ビルダーと、特定のカードを引く確率を計算するためのツールが用意できたので、カードを配るための非常に単純なカード ディーラーを組み立てることができます。この例では、5 枚のカードを引くカード ディーラーを構築します。カードディーラーはデッキ全体から 5 枚のカードを提供します。数字を使用してどのカードを捨てる必要があるかを指定すると、ディーラーはデッキからカードを使用します