PHP で書かれた 25 個のゲーム スクリプト

WBOY
リリース: 2016-06-13 12:23:43
オリジナル
1096 人が閲覧しました

紙とペンを使った単純なゲームを 1 人でプレイする場合でも、グループで複雑なテーブルトップ ロールプレイング ゲームをプレイする場合でも、あらゆる種類のオンライン ゲームをプレイする場合でも、このシリーズはあなたに合ったものを提供します。 「PHP で書ける 30 のゲーム スクリプト」シリーズの各記事では、10 個のスクリプトを 300 語未満で紹介します (3d10 は「10 面のサイコロを 3 つ振る」という意味です)。これらの紹介文は、初心者の開発者にとっても十分に簡単です。経験豊富なゲーマーにとって役立ちます。このシリーズの目標は、ニーズに合わせて変更できるものを提供し、次回のゲーム交流会でノートブックを披露して友人やゲーマー仲間に感銘を与えることができるようにすることです。
始める前に
ゲームの専門家/デザイナー、開発者として、私は役に立つユーティリティやスクリプトをほとんど書かずにゲームを実行、計画、プレイしていることに気づくことがよくあります。時にはアイデアを素早く思いつく必要があることもあります。また、大量のノンプレイヤー キャラクター (NPC) の名前を作成する必要がある場合もあります。場合によっては、数値を計算したり、例外を処理したり、言葉遊びをゲームに組み込んだりする必要もあります。これらのタスクは、事前に少しスクリプトを作成するだけでより適切に管理できます。
この記事では、さまざまなゲームで使用できる 10 個の基本スクリプトについて説明します。コード zip には、説明した各スクリプトの完全なソース コードが含まれており、スクリプトの動作をカオスニュートラルで確認できます。
これらのスクリプトを簡単に紹介します。ホストの検索方法やサーバーのセットアップ方法については説明されていません。 PHP を提供する Web ホスティング会社は数多くありますが、独自のものをインストールする必要がある場合は、XAMPP インストーラーが簡単に使用できます。 PHP のベスト プラクティスやゲーム デザインのテクニックについては、多くの時間を費やすつもりはありません。この記事で説明するスクリプトは理解しやすく、使いやすく、すぐに習得できます。
シンプルなサイコロローラー
多くのゲームやゲームシステムではサイコロが必要です。まずは簡単な部分、つまり 6 面体のサイコロを振ることから始めましょう。基本的に、6 面体のサイコロを振ることは、1 から 6 までの乱数を選択するだけです。 PHP では、これは非常に単純です: echo rand(1,6);。
多くの場合、これは基本的に簡単です。しかし、運次第のゲームを扱う場合は、より良い実装が必要です。 PHP は、より優れた乱数ジェネレーター mt_rand() を提供します。 2 つの違いをあまり深く掘り下げずに、mt_rand はより高速で優れた乱数生成器であると考えることができます: echo mt_rand(1,6);。この乱数ジェネレーターを関数に組み込むとさらに良くなります。
リスト 1. mt_rand() 乱数生成関数の使用

コードをコピーします コードは次のとおりです。 >

Function roll () {
return mt_rand(1,6);
}
echo roll();

次に、型を渡すことができます。関数に渡されるパラメーターとして振る必要があるサイコロの数。

リスト 2. サイコロの型をパラメーターとして渡す

コードをコピーします コードは次のとおりです。

function roll ($sides) {
return mt_rand(1,$sides);
}
echo roll(6) // 6 面のサイコロを振る
エコーロール(10); // 10 面のサイコロを振る
echo roll(20); // 20 面のサイコロを振る

ここから、任意の数のサイコロを振り続けることができます。必要に応じて時間を指定し、結果の配列を返すこともできます。異なる種類の複数のサイコロを一度に振ることもできます。ただし、ほとんどのタスクはこの単純なスクリプトを使用して実行できます。
ランダム ネーム ジェネレーター
ゲームを実行したり、ストーリーを書いたり、一度に多数のキャラクターを作成したりしている場合、絶え間なく流れてくる新しい名前に対処するのが大変な場合があります。この問題を解決するために使用できる単純なランダム名ジェネレーターを見てみましょう。まず、2 つの単純な配列を作成しましょう。1 つは名用、もう 1 つは姓用です。

リスト 3. 名と姓の 2 つの単純な配列

コードをコピー コードは次のとおりです。

$male = array(
"ウィリアム",
"ヘンリー",
"フィルバート",
"ジョン",
"パット",
) ;
$last = array(
「スミス」,
「ジョーンズ」,
「ウィンクラー」,
「クーパー」,
「クライン」,
); 🎜>
>
次に、各配列からランダムな要素を選択できます: echo $male[array_rand($male)] ' ' 。複数の名前を一度に抽出するには、配列を混合し、必要に応じて抽出するだけです。


リスト 4. 混合名前配列

コードをコピー コードは次のとおりです。


shuffle($male);
shuffle($last);
for ($i = 0; $i echo $male[$ i] . $last[$i];
}


この基本的な概念に基づいて、姓と名を保存するテキスト ファイルを作成できます。テキスト ファイルの各行に名前を保存すると、ファイルの内容を改行で区切ってソース コードの配列を簡単に構築できます。
リスト 5. 名前のテキスト ファイルの作成
$male =explode('n', file_get_contents('names. Female.txt'));
$last =explode( ' n', file_get_contents('names.last.txt'));
適切な名前のファイルをいくつか構築または検索すれば (一部はコード アーカイブに含まれています)、名前について心配する必要はなくなります。
シナリオ ジェネレーター
名前ジェネレーターの構築に使用したのと同じ基本原則を使用して、シナリオ ジェネレーターを構築できます。このジェネレーターは、ロール プレイング ゲームだけでなく、擬似ランダム環境のコレクション (ロール プレイング、即興、執筆などに使用できる) を使用する必要がある状況でも役立ちます。私のお気に入りのゲームの 1 つである Paranoia には、GM パックに「ミッション ブレンダー」が含まれています。ミッション ミキサーを使用すると、サイコロをすばやく振りながら、完全なミッションを組み合わせることができます。独自のシーンジェネレーターを組み立ててみましょう。
次のシナリオを考えてみましょう: あなたは目が覚めると、ジャングルで迷っていることに気づきました。ニューヨークに行かなければならないことはわかっていますが、その理由はわかりません。近くで犬の吠え声と敵の探索者の独特の音が聞こえます。あなたは寒くて震えていて、武装していません。シーン内の各文は、シーンの特定の側面を紹介します。
「あなたは目を覚ますと、ジャングルで迷っていることに気づきます。」 — この文は設定を確立します。
「ニューヨークに行かなければならないことはわかっていますね」 — この文は目標を説明します。
「犬の吠え声が聞こえる」 — この文は敵を紹介します。
「あなたは寒くて震えていて、武装していません」 - この文はさらに複雑になります。
姓と名用のテキスト ファイルを作成したのと同じように、まず設定、目的、敵、および複雑さ用に個別のテキスト ファイルを作成します。サンプル ファイルはコード アーカイブに含まれています。これらのファイルを取得したら、シーンを生成するコードは基本的に名前を生成するコードと同じになります。
リスト 6. シーンの生成

コードのコピー コードは次のとおりです。


$設定 =explode("n", file_get_contents('scenario.settings.txt'));
$objectives =explode("n", file_get_contents('scenario.objectives.txt'));
$antagonists = explode(" n", file_get_contents('scenario.antagonists.txt'));
$complicati**** =explode("n", file_get_contents('scenario.complicati****.txt'));
シャッフル($settings);
シャッフル($アンタゴニスト);
シャッフル($complicati****); ' ' . $objectives[0] '
. "


新しいテキスト ファイルを追加することでシーンに要素を追加できますが、複数の複雑さを追加したい場合もあります。基本的なテキスト ファイルに追加するコンテンツが増えるほど、時間の経過とともにシーンがより多く変化します。

デッキ ビルダーとシャッフラー
ポーカーをプレイし、カード関連のスクリプトを扱う場合は、デッキ ビルダーとシャッフラーのツールを統合する必要があります。まず、標準的なトランプのデッキを構築しましょう。 2 つの配列を構築する必要があります。1 つは同じスーツのカードのグループを保持するため、もう 1 つはカードの表を保持するためです。これにより、後で新しいデッキやカード タイプを追加する必要がある場合に大きな柔軟性が得られます。

リスト 7. 標準的なトランプ デッキの作成

コードをコピーします コードは次のとおりです。

$suits = array (

"スペード"、"ハート"、"クラブ"、"ダイヤモンド"
); 「、「フォー」、「ファイブ」、「シックス」、「セブン」、「エイト」、
「ナイン」、「テン」、「ジャック」、「クイーン」、「キング」、「エース」
);


次に、カード配列のデッキを構築して、すべてのカードの値を保存します。これは、1 対の foreach ループを使用するだけで簡単に実行できます。

リスト 8. トランプ配列の構築



コードをコピーします

コードは次のとおりです。 $ Deck = array(); foreach ($suits as $suit) {

foreach ($faces as $face) {

$deck[] = array ("face"=> ;$face, " suit"=>$suit);
}
}

トランプの配列を作成したら、簡単にデッキをシャッフルし、ランダムにカードを引くことができます。
リスト 9. カードをシャッフルしてランダムに引く

コードをコピーします コードは次のとおりです。


shuffle($deck);
$card['face'] ' . $card['suit']; 🎜>
これで、複数のカードデッキを引いたり、マルチデッキシューを構築したりするためのショートカットができました。
勝ちオッズ計算機: カードの配り

カードのデッキを構築するときに各カードの表とスーツが個別に追跡されるため、デッキをプログラムで使用して特定のカードを取得する確率を計算できます。まず、各手札からカードを 5 枚ずつ引きます。

リスト 10. 各手から 5 枚のカードを引く


コードをコピーします

コードは次のとおりです。 $hands = array(1 => array(), 2=>array());

for ($i = 0; $i $ hand[1 ][] = implode(" of ", array_shift($deck));
$hands[2][] = implode(" of ", array_shift($deck)); >

その後、デッキを見て、カードが何枚残っているか、特定のカードを引く確率を確認できます。カードが何枚残っているかが簡単にわかります。 $deck 配列に含まれる要素の数を数えるだけです。特定のカードを引くチャンスを得るには、デッキ全体を調べて残りのカードを推定し、それらが一致するかどうかを確認する関数が必要です。

リスト 11. 特定のカードを引く確率を計算します



コードをコピーします
コードは次のとおりです。

関数 Calculate_odds($draw, $deck) { $remaining = count($deck); $odds = 0;

foreach ($deck as $card) {

if ( ($draw['face'] == $card['face'] && $draw['suit'] ==
$card['suit'] ) ||
($draw[ '顔'] = = '' && $draw['スーツ'] == $card['スーツ'] )
($draw['顔'] == $card['顔'] && $ draw['suit' ] == '' ) ) {
$odds ;
}
}
return $odds ' in ' $remaining;物事をシンプルにするために、カードのように見える配列を渡します。特定のカードを探すことができます。

リスト 12. 指定されたカードを検索します




コードをコピーします


コードは次のとおりです:
$draw = array('face' => 'Ace', 'suit' => 'Spades');
echo implode(" of ", $draw) ' : ' . , $デッキ);

または、指定したフェイスまたはスートを持つカードを検索することもできます。 リスト 13. 指定されたカードの表またはスーツのカードを検索します




コードをコピーします


コードは次のとおりです。

$draw = array('face' => '', 'suit' => 'スペード');
$draw = array('face' => 'エース' , 'suit' => ; '');

シンプルなポーカー ディーラー 特定のカードを引く確率を把握するためのツールが用意されました。非常に簡単にまとめる カードディーラーはカードを配るのに使用されます。この例では、5 枚のカードを引くカード ディーラーを構築します。カードディーラーはデッキ全体から 5 枚のカードを提供します。数字はどのカードを捨てる必要があるかを指定するために使用され、ディーラーはこれらのカードをデッキの他のカードと置き換えます。ライセンス制限や特別なルールを指定する必要はありませんが、これらは個人的に非常に有益な経験になるかもしれません。 前のセクションで示したように、デッキを生成してシャッフルし、各手に 5 枚のカードを持ちます。配列インデックスによってカードを表示するので、どのカードが返されるかを指定できます。これを行うには、交換するカードを示すチェックボックスを使用します。

リスト 14. チェックボックスを使用して、置き換えるカードを指定します

foreach ($hand as $index =>$card) {
echo "

" . $card['face'] . ' of ' . $card['suit'] . "
";
}
次に、入力配列 $_POST['card'] を計算して、どのカードが置換対象として選択されたかを確認します。

リスト 15. 計算入力


コードをコピー

コードは次のとおりです。

コードは次のとおりです。 i = 0 ; while ($i if (isset($_POST['card'][$i])) { $hand[$i] = array_shift($デッキ); }

}



このスクリプトを使用すると、特定のカードのセットに対処する最適な方法を見つけることができます。
ハングマン ゲーム
ハングマンは基本的に推測ゲームです。単語の長さを考慮すると、限られた数の機会を利用して単語を推測します。単語に現れる文字を推測する場合は、その文字が現れる位置をすべて埋めてください。何度か (通常は 6 回) 間違った推測をすると、ゲームに負けます。大まかな絞首刑執行人ゲームを構築するには、単語のリストから始める必要があります。では、単語リストを単純な配列にしてみましょう。
リスト 16. 単語リストの作成

コードをコピー コードは次のとおりです。




$words = array (
"巨人",
"三角形",
"粒子",
"巣箱",
"最小",
"洪水"

) ;


前述の手法を使用して、これらの単語を外部の単語リスト テキスト ファイルに移動し、必要に応じてインポートできます。
単語リストを取得したら、ランダムに単語を選択し、各文字を空として表示してから、推測を開始する必要があります。推測するたびに、正しい推測と不正解の推測を追跡する必要があります。推測配列をシリアル化し、追跡目的で各推測に渡すだけです。ページのソースを見て人々が推測するのを防ぐ必要がある場合は、より安全な措置を講じる必要があります。 文字と正しい/間違った推測を保持する配列を構築します。正確に推測するには、キーとして文字を、値としてピリオドを配列に入力します。
リスト 17. 文字を保存し結果を推測する配列を構築します

コードをコピーします

コードは次のとおりです。


$letters = array('a','b','c','d','e','f','g','h','i','j ','k' ,'l','m','n','o',
'p','q','r','s','t','u',' v','w ','x','y','z');
$right = array_fill_keys($letters, '.');

$wrong = array(); 🎜>
次に、単語推測ゲームを完了する際に、推測を評価して単語を表示するためのコードが必要です。
リスト 18. 推測を評価し、進捗状況を表示する

コードをコピー コードは次のとおりです。


if (stristr($word, $guess)) {
$show = '';
$right[$guess] = $guess
$wordletters = str_split($word); > foreach ( $wordletters as $letter) {
$show .= $right[$letter];
}
} else {
$show = '';推測] = $guess;
if (count($wrong) == 6) {
$show = $word;
} else {
foreach ($wordletters as $letter) {
$show .= $right[$letter];
}
}
}


ソースコードアーカイブでは、推測配列をシリアル化して変換する方法を確認できますある推測からの配列が別の推測に渡されます。

クロスワード ヘルパー
これが不適切であることは承知していますが、クロスワード パズルをプレイしているときに、C で始まり T で終わる 5 文字の単語を見つけるのに苦労することがあります。 Hangman ゲーム用に構築されたのと同じ単語リストを使用して、パターンに一致する単語を簡単に検索できます。まず、言葉を伝える方法を見つけます。簡単にするために、欠落している文字をピリオドに置き換えます: $guess = "c...t";。正規表現ではピリオドが 1 文字として扱われるため、単語のリストを簡単に反復処理して一致するものを見つけることができます。

リスト 19. 単語リストのトラバース

コードをコピー コードは次のとおりです。

foreach ($words as $word) {

if (preg_match("/^" . $_POST['guess'] . "$/",$word)) {
echo $word . br /> n";
}
}


単語リストの品質と推測の精度に応じて、一致の可能性があるものに使用する適切な単語リストを取得できるはずです。 「ルール外の遊び」を表す 5 文字の単語の答えが「チェスト」なのか「チート」なのかは、自分で決める必要があります。
Midribis
Midribis は、プレーヤーに短い物語が与えられ、主要な種類の単語を同じ種類の別の単語に置き換えることで、同じ物語のより退屈なバージョンを作成する単語ゲームです。次のテキストを読みます。「公園を歩いているときに湖を見つけました。飛び込み、水を飲みすぎました。病院に行かなければなりませんでした。」 単語の種類を他の単語マーカーに置き換え始めます。予期しない文字列の一致を防ぐために、開始タグと終了タグには下線が付いています。
リスト 20. 単語タイプを単語タグで置き換える
$text = "_NOUN_ を見つけたとき、_PLACE_ で _VERB_ing していました。
私は _VERB_ed しました、そして _NOUN_ を _VERB_ed しすぎました。 _PLACE_ に行かなければなりませんでした。";
次に、いくつかの基本的な単語リストを作成します。この例では、あまり複雑にしません。
リスト 21. いくつかの基本的な単語リストを作成します

コードをコピーします コードは次のとおりです:


$verbs = array('ポンプ', 'ジャンプ', '歩く', '飲み込む', '這う', '泣き叫ぶ', '転がる');
$places = array('公園', '病院'、'北極'、'海'、'食料品店'、'地下室'、
'屋根裏部屋'、'下水道')
$nouns = array('水', '湖', '唾' 、'foot '、'worm'、
'dirt'、'river'、'wankel ロータリー エンジン');


テキストを繰り返し評価して、必要に応じてトークンを置き換えることができるようになりました。
リスト 22. テキストを評価する

コードをコピー コードは次のとおりです。


while (preg_match( "/(_VERB_)|(_PLACE_)|(_NOUN_)/", $text, $matches)) {
switch ($matches[0]) {
case '_VERB_' :
shuffle($ 動詞);
$text = preg_replace($matches[0], current($verbs), $text, 1);
case '_PLACE_' :
shuffle( $places) ;
$text = preg_replace($matches[0], current($places), $text, 1);
break '_NOUN_' :
shuffle($nouns) );
$text = preg_replace($matches[0], current($nouns), $text, 1);
break;
}
echo $text; >

明らかに、これは単純かつ大雑把な例です。単語リストが正確であればあるほど、そしてベーステキストに費やす時間が長くなるほど、より良い結果が得られます。テキスト ファイルを使用して、名前のリストと基本的な単語のリストを作成しました。同じ原理を使用して、ジャンルごとに分割された単語リストを作成し、これらの単語リストを使用してより多様な Midlibis ゲームを作成できます。
ロトマシン
6 つすべての正しいロト番号を選択することは、控えめに言っても統計的に不可能です。それでも、多くの人がお金を払ってプレイしているので、数字が気に入ったら、傾向グラフを眺めるのも楽しいでしょう。当選番号を追跡し、リスト内の選択数が最も少ない 6 つの番号を提供できるスクリプトを作成してみましょう。

(免責事項: これは宝くじの賞品を獲得するのに役立つものではないため、チケットにお金を費やさないでください。これは単なる楽しみです)。
当選したロトの選択内容をテキスト ファイルに保存します。数値をカンマで区切って、数値の各グループを別の行に配置します。改行とカンマを使用してファイルの内容を区切って行を区切ると、リスト 23 のような結果が得られます。

リスト 23. 選択した当選ロトをテキスト ファイルに保存します


コードをコピーします

コードは次のとおりです: $picks = array( array('6', '10', '18', '21', '34', '40'),

array('2' , '8', '13', '22', '30', '39'),

array('3', '9', '14', '25', '31', '35' ) ,
array('11', '12', '16', '24', '36', '37'),
array('4', '7', '17', ' 26 ', '32', '33')
);


明らかに、これは統計をプロットするための基本ファイルとしては十分ではありません。しかし、これは始まりであり、基本原則を説明するには十分です。
選択範囲を保持するための基本配列を設定します。たとえば、1 ~ 40 の数値を選択した場合 ($numbers = array_fill(1,40,0); など)、選択内容を繰り返し、対応する一致値を増加させます。

リスト 24. 選択範囲のトラバース



コードをコピー

コードは次のとおりです。 foreach ($picks as $pick) { foreach ($pick as $number) {

$numbers[$number] }

}


最後に、数値を値に従って並べ替えます。この操作では、選択された最小の数値が配列の先頭に配置されます。
リスト 25. 値に従って数値を並べ替えます

コードをコピー コードは次のとおりです:


asort ($numbers);
$pick = array_slice($numbers,0,6,true);
echo implode(',', array_keys($pick)); 🎜> パス 当選番号のリストを含むテキスト ファイルに実際の当選番号を定期的に追加することで、番号選択の長期的な傾向を見つけることができます。特定の数字がどのくらいの頻度で現れるかを確認するのは興味深いことです。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート