ホームページ  >  記事  >  バックエンド開発  >  PHP_PHP チュートリアルで書かれた 25 のゲーム スクリプト

PHP_PHP チュートリアルで書かれた 25 のゲーム スクリプト

WBOY
WBOYオリジナル
2016-07-21 15:46:351270ブラウズ

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

ここから、必要に応じて複数のサイコロを一度にロールし、結果の配列を返すことができます。また、異なる種類の複数のサイコロを一度に振ることもできます。ただし、ほとんどのタスクはこの単純なスクリプトを使用して実行できます。
ランダムネームジェネレーター
ゲームを実行したり、ストーリーを書いたり、一度に多数のキャラクターを作成したりしている場合、絶え間なく流れてくる新しい名前に対処するのが大変な場合があります。この問題を解決するために使用できる単純なランダム名ジェネレーターを見てみましょう。まず、2 つの単純な配列を作成しましょう。1 つは名用、もう 1 つは姓用です。 " ジョン",
"パット", ); $last = array(
"スミス",
"ジョーンズ", "ウィンクラー", "クーパー", "クライン",
);各配列からランダムな要素を選択できます: echo $male[array_rand($male)] 。複数の名前を一度に抽出するには、配列を混合し、必要に応じて抽出するだけです。

リスト4. 混合名前配列




コードをコピー

コードは以下の通りです

shuffle($male);
shuffle($last);
for ($i = 0; $i echo $male[$i] . 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.objectives.txt'));
$antagonists =explode("n", file_get_contents('scenario.antagonists.txt'));
$complicati**** =explode( "n" , file_get_contents('scenario.complicati****.txt');
shuffle($settings)
shuffle($antagonists); );
echo $settings[0] . ' ' '
. "
";


新しいテキスト ファイルを追加することでシーンに要素を追加できますが、複数のレベルの複雑さを追加したい場合もあります。基本的なテキスト ファイルに追加するコンテンツが増えるほど、時間の経過とともにシーンがより多く変化します。
デッキビルダー(デッキビルダー)とギア(シャッフラー)
ポーカーをプレイしてカード関連のスクリプトを扱う場合は、デッキビルダーとギア内のツールを統合する必要があります。まず、標準的なトランプのデッキを構築しましょう。 2 つの配列を構築する必要があります。1 つは同じスーツのカードのグループを保持するため、もう 1 つはカードの表を保持するためです。これにより、後で新しいデッキやカード タイプを追加する必要がある場合に大きな柔軟性が得られます。

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




コードをコピーします
コードは次のとおりです。
$suits = array ( "Spades", "Hearts", "Clubs", "ダイヤモンド" ); $faces = array (
「Two」、「Three」、「Four」、「Five」、「Six」、「Seven」、「Eight」、
「Nine」、「Ten」、" Jack」、「Queen」、「King」、「Ace」
);


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

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



コードをコピーします コードは次のとおりです。
$deck = array() foreach ($suits as $suit) { foreach ( $faces as $face ) { $deck[] = array ("face"=>$face, "suit"=>$suit);トランプの配列を作成したら、簡単にデッキをシャッフルし、ランダムにカードを引くことができます。
リスト 9. デッキをシャッフルしてカードをランダムに引きます
コードをコピーします コードは次のとおりです。 $card[' face'] . ' of . $card['suit'];
これで、複数のカードを引くか、マルチデッキシューを構築するためのショートカットができました。
オッズ計算機: ディーリング
ポーカーデッキを構築する際、各カードのフェイスとスートが個別に追跡されるため、デッキをプログラム的に使用して、特定のカードを取得するオッズを計算できます。まず、各手札からカードを 5 枚ずつ引きます。

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




コードをコピー
コードは以下の通りです:
$hands = array(1 => array(), 2=>array() ); for ($i = 0; $i $hands[1][] = implode(" of ", array_shift($deck)); = implode( " of ", array_shift($deck)); }

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

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



コードをコピーします
コードは次のとおりです:
function Calculate_odds($draw, $deck) { $remaining = count($deck ); $odds = 0; foreach ($deck as $card) { if ( ($draw['face'] == $card['face'] && $draw['suit'] ==
$カード['スーツ' ] ) ||
($draw['顔'] == '' && $draw['スーツ'] == $card['スーツ'] ) || ] == $card ['face'] && $draw['suit'] == '' ) ) {
$odds++;
}
}
return $odds ' in ' $remaining;カードを引くことを選択できるようになりました。シンプルにするために、カードのような配列を渡します。特定のカードを探すことができます。

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




コードをコピーします

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

$draw = array('face' => 'Ace', 'suit' => ' Spades' );
echo implode(" of ", $draw) . ' : ' .calculate_odds($draw, $deck); または、指定したフェイスまたはスートを持つカードを検索することもできます。 リスト13. 指定されたカードフェイスまたはスートを持つカードを検索します
コードをコピーします
コードは次のとおりです:


$draw = array('face' => '', 'suit ' => 'スペード ');
$draw = array('face' => 'Ace', 'suit' => ''); これで、シンプルなポーカーディーラー
が完成しました。ツールでは、特定のカードを引く確率を計算するために、カードを配る非常に単純なカード ディーラーを統合できます。この例では、5 枚のカードを引くカード ディーラーを構築します。カードディーラーはデッキ全体から 5 枚のカードを提供します。数字はどのカードを捨てる必要があるかを指定するために使用され、ディーラーはこれらのカードをデッキの他のカードと置き換えます。ライセンス制限や特別なルールを指定する必要はありませんが、これらは個人的に非常に有益な経験になるかもしれません。
前のセクションで示したように、カードを生成してシャッフルし、それぞれの手札に 5 枚のカードを持ちます。配列インデックスによってカードを表示するので、どのカードが返されるかを指定できます。これを行うには、交換するカードを示すチェックボックスを使用します。
リスト 14. チェックボックスを使用して、置き換えるカードを指定します
foreach ($hand as $index =>$card) {
echo " . $card['face'] . "
" 次に、入力配列 $_POST[ 'card'] を使用して、置換対象として選択されたカードを確認します。
リスト 15. 入力の計算



コードをコピー

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


$i = 0; while ($i < 5) { if (isset($_POST['card '][ $i])) {
$hand[$i] = array_shift($deck)
}
}

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

$words = array (
"giants",
"triangle",
"particle",
"birdhouse" ,
「minimum」、
「flood」
);

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

$wrong[$guess] = $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[ '推測'] . "$/",$word)) { echo $word . } }

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

$verbs = array('pump', 'jump', 'walk', 'swallow', 'クロール' , '泣き声', 'ロール');
$places = array('公園', '病院', '北極', '海', '食料品店', '地下室',
'屋根裏部屋', '下水道' );
$nouns = array('water', '湖', '唾', '足', 'ワーム',
'土', '川', 'ヴァンケルロータリーエンジン');繰り返し評価されます。必要に応じてマークアップを置き換えるテキスト。
リスト 22. テキストを評価する


コードをコピー
コードは次のとおりです: while (preg_match("/(_VERB_)|(_PLACE_)|(_NOUN_)/", $text, $matches )) {
switch ($matches[0]) {
case '_VERB_' :
shuffle($verbs)
$text = preg_replace($matches[0], current($verbs), $text, 1);
break;
case '_PLACE_' :
shuffle($places);
case '_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. 値に従って数値を並べ替える
コードをコピーする コードは次のとおりです。
echo implode (',', array_keys($pick));


当選番号のリストを含むテキストファイルに実際のロト当選番号を定期的に追加することで、番号選択の長期的な傾向を見つけることができます。特定の数字がどのくらいの頻度で現れるかを確認するのは興味深いことです。


http://www.bkjia.com/PHPjc/320130.html

www.bkjia.com

http://www.bkjia.com/PHPjc/320130.html技術記事紙とペンを使った簡単なゲームを 1 人でプレイする場合でも、グループで複雑なテーブルトップ ロールプレイング ゲームをプレイする場合でも、あらゆる種類のオンライン ゲームをプレイする場合でも、このシリーズには必ず何かがあります...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。