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