>  기사  >  백엔드 개발  >  25가지 좋은 PHP 게임 프로그래밍 스크립트 코드 공유 (1)_PHP 튜토리얼

25가지 좋은 PHP 게임 프로그래밍 스크립트 코드 공유 (1)_PHP 튜토리얼

WBOY
WBOY원래의
2016-07-22 09:02:251147검색

간단한 주사위 롤러

많은 게임과 게임 시스템에는 주사위가 필요합니다. 쉬운 부분부터 시작해 보겠습니다. 6면체 주사위를 굴리는 것입니다. 기본적으로 6면체 주사위를 굴리는 것은 단순히 1에서 6 사이의 임의의 숫자를 선택하는 것입니다. PHP에서는 매우 간단합니다: echo rand(1,6);.

많은 경우 이는 기본적으로 간단합니다. 그러나 우연한 게임을 다룰 때는 더 나은 구현이 필요합니다. PHP는 더 나은 난수 생성기인 mt_rand()를 제공합니다. 둘 사이의 차이점을 너무 깊이 파고들지 않고도 mt_rand는 더 빠르고 더 나은 난수 생성기로 생각할 수 있습니다: echo mt_rand(1,6);. 이 난수 생성기를 함수에 넣으면 더욱 좋습니다.

목록 1. mt_rand() 난수 생성기 함수 사용

<ol class="dp-c">
<li class="alt"><span><span class="keyword">function</span><span> roll () {  </span></span></li>
<li>
<span class="keyword">return</span><span> mt_rand(1,6);  </span>
</li>
<li class="alt"><span>}  </span></li>
<li>
<span class="func">echo</span><span> roll(); </span>
</li>
</ol>

그런 다음 굴릴 주사위 유형을 함수에 매개 변수로 전달할 수 있습니다.

목록 2. 주사위 유형을 매개변수로 전달

<ol class="dp-c">
<li class="alt"><span><span class="keyword">function</span><span> roll (</span><span class="vars">$sides</span><span>) {  </span></span></li>
<li>
<span class="keyword">return</span><span> mt_rand(1,</span><span class="vars">$sides</span><span>);  </span>
</li>
<li class="alt"><span>}  </span></li>
<li>
<span class="func">echo</span><span> roll(6);  </span><span class="comment">// roll a six-sided die </span><span> </span>
</li>
<li class="alt">
<span class="func">echo</span><span> roll(10);  </span><span class="comment">// roll a ten-sided die </span><span> </span>
</li>
<li>
<span class="func">echo</span><span> roll(20);  </span><span class="comment">// roll a twenty-sided die</span><span> </span>
</li>
</ol>

여기에서 필요에 따라 한 번에 여러 개의 주사위를 굴릴 수 있으며, 일련의 결과를 반환할 수도 있습니다. 한 번에 여러 개의 주사위 다양한 유형의 주사위. 그러나 대부분의 작업은 이 간단한 스크립트를 사용하여 수행할 수 있습니다.

임의의 이름 생성기

게임을 실행하거나 스토리를 작성하거나 한 번에 많은 수의 캐릭터를 생성하는 경우 때로는 유지하기가 부담스러울 수 있습니다. 끊임없이 새로운 이름이 쏟아져 나옵니다. 이 문제를 해결하는 데 사용할 수 있는 간단한 임의 이름 생성기를 살펴보겠습니다. 먼저 이름과 성에 대한 두 개의 간단한 배열을 만들어 보겠습니다.

목록 3. 이름과 성으로 구성된 두 개의 간단한 배열

<ol class="dp-c">
<li class="alt"><span><span class="vars">$male</span><span> = </span><span class="keyword">array</span><span>(  </span></span></li>
<li>
<span class="string">"William"</span><span>,  </span>
</li>
<li class="alt">
<span class="string">"Henry"</span><span>,  </span>
</li>
<li>
<span class="string">"Filbert"</span><span>,  </span>
</li>
<li class="alt">
<span class="string">"John"</span><span>,  </span>
</li>
<li>
<span class="string">"Pat"</span><span>,  </span>
</li>
<li class="alt"><span>);  </span></li>
<li>
<span class="vars">$last</span><span> = </span><span class="keyword">array</span><span>(  </span>
</li>
<li class="alt">
<span class="string">"Smith"</span><span>,  </span>
</li>
<li>
<span class="string">"Jones"</span><span>,  </span>
</li>
<li class="alt">
<span class="string">"Winkler"</span><span>,  </span>
</li>
<li>
<span class="string">"Cooper"</span><span>,  </span>
</li>
<li class="alt">
<span class="string">"Cline"</span><span>,  </span>
</li>
<li><span>); </span></li>
</ol>

그런 다음 각 배열에서 임의의 요소를 선택할 수 있습니다: echo $male[array_rand($male)] '. ' . $last[array_rand($last)];. 여러 이름을 한 번에 추출하려면 배열을 혼합하고 필요에 따라 추출하면 됩니다.

목록 4. 혼합 이름 배열

<ol class="dp-c">
<li class="alt"><span><span>shuffle(</span><span class="vars">$male</span><span>);  </span></span></li>
<li>
<span>shuffle(</span><span class="vars">$last</span><span>);  </span>
</li>
<li class="alt">
<span class="keyword">for</span><span> (</span><span class="vars">$i</span><span> = 0; </span><span class="vars">$i</span><span> <span class="vars">$i</span><span>++) {  </span></span>
</li>
<li>
<span class="func">echo</span><span> </span><span class="vars">$male</span><span>[</span><span class="vars">$i</span><span>] . </span><span class="string">' '</span><span> . </span><span class="vars">$last</span><span>[</span><span class="vars">$i</span><span>];  </span>
</li>
<li class="alt"><span>} </span></li>
</ol>

이러한 기본 개념을 바탕으로 이름과 성을 포함하는 텍스트 파일을 만들 수 있습니다. 텍스트 파일의 각 줄에 이름을 저장하면 줄 바꿈으로 파일 내용을 쉽게 구분하여 소스 코드 배열을 구축할 수 있습니다.

목록 5. 이름이 포함된 텍스트 파일 만들기

<ol class="dp-c">
<li class="alt"><span><span class="vars">$male</span><span> = </span><span class="func">explode</span><span>(</span><span class="string">'n'</span><span>, </span><span class="func">file_get_contents</span><span>(</span><span class="string">'names.female.txt'</span><span>));  </span></span></li>
<li>
<span class="vars">$last</span><span> = </span><span class="func">explode</span><span>(</span><span class="string">'n'</span><span>, </span><span class="func">file_get_contents</span><span>(</span><span class="string">'names.last.txt'</span><span>)); </span>
</li>
</ol>

좋은 이름 파일을 만들거나 찾으면(일부는 코드 아카이브에 포함되어 있음) 이름에 대해 다시는 걱정할 필요가 없습니다. .

시나리오 생성기

이름 생성기를 구축할 때 사용한 것과 동일한 기본 원리를 사용하여 시나리오 생성기를 구축할 수 있습니다. 이 생성기는 롤플레잉 게임뿐만 아니라 의사 무작위 환경 모음(롤플레잉, 즉흥 연주, 글쓰기 등에 사용할 수 있음)을 사용해야 하는 상황에서도 유용합니다. 내가 가장 좋아하는 게임 중 하나인 Paranoia에는 GM 팩에 "미션 블렌더"가 포함되어 있습니다. 미션 믹서를 사용하면 주사위를 빠르게 굴리면서 전체 미션을 결합할 수 있습니다. 우리 자신의 장면 생성기를 함께 구성해 봅시다.

다음 시나리오를 생각해 보세요. 잠에서 깨어나 정글에서 길을 잃은 자신을 발견합니다. 당신은 뉴욕에 가야 한다는 것을 알지만, 그 이유는 모릅니다. 근처에서 개들이 짖는 소리와 적 수색자들의 뚜렷한 소리가 들립니다. 당신은 차갑고, 떨리고, 무장도 하지 않았습니다. 장면의 각 문장은 장면의 특정 측면을 소개합니다.

“당신은 잠에서 깨어나 정글에서 길을 잃은 자신을 발견합니다” — 이 문장이 배경을 설정합니다.

“You Know you have to get to New York” — 이 문장은 목표를 설명합니다.

“개들이 짖는 소리가 들립니다.” — 이 문장은 적을 소개합니다.

“당신은 차갑고, 떨리고, 무장하지 않았습니다” — 이 문장은 복잡성을 더할 것입니다.

이름과 성에 대한 텍스트 파일을 만든 것처럼 먼저 설정, 목표, 적 및 복잡성에 대해 별도의 텍스트 파일을 만듭니다. 샘플 파일은 코드 아카이브에 포함되어 있습니다. 이러한 파일이 있으면 장면을 생성하는 코드는 기본적으로 이름을 생성하는 코드와 동일합니다.

목록 6. 장면 생성

<ol class="dp-c">
<li class="alt"><span><span class="vars">$settings</span><span> = </span><span class="func">explode</span><span>(</span><span class="string">"n"</span><span>, </span><span class="func">file_get_contents</span><span>(</span><span class="string">'scenario.settings.txt'</span><span>));  </span></span></li>
<li>
<span class="vars">$objectives</span><span> = </span><span class="func">explode</span><span>(</span><span class="string">"n"</span><span>, </span><span class="func">file_get_contents</span><span>(</span><span class="string">'scenario.objectives.txt'</span><span>));  </span>
</li>
<li class="alt">
<span class="vars">$antagonists</span><span> = </span><span class="func">explode</span><span>(</span><span class="string">"n"</span><span>, </span><span class="func">file_get_contents</span><span>(</span><span class="string">'scenario.antagonists.txt'</span><span>));  </span>
</li>
<li>
<span class="vars">$complicati</span><span>**** = </span><span class="func">explode</span><span>(</span><span class="string">"n"</span><span>, </span><span class="func">file_get_contents</span><span>(</span><span class="string">'scenario.complicati****.txt'</span><span>));  </span>
</li>
<li class="alt">
<span>shuffle(</span><span class="vars">$settings</span><span>);  </span>
</li>
<li>
<span>shuffle(</span><span class="vars">$objectives</span><span>);  </span>
</li>
<li class="alt">
<span>shuffle(</span><span class="vars">$antagonists</span><span>);  </span>
</li>
<li>
<span>shuffle(</span><span class="vars">$complicati</span><span>****);  </span>
</li>
<li class="alt">
<span class="func">echo</span><span> </span><span class="vars">$settings</span><span>[0] . </span><span class="string">' '</span><span> . </span><span class="vars">$objectives</span><span>[0] . </span><span class="string">' '</span><span> . </span><span class="vars">$antagonists</span><span>[0] . </span><span class="string">' '</span><span> </span>
</li>
<li>
<span>. </span><span class="vars">$complicati</span><span>****[0] . </span><span class="string">"<br>n"</span><span>; </span>
</li>
</ol>

새 텍스트 파일을 추가하여 장면에 요소를 추가할 수 있으며 여러 수준의 복잡성을 추가할 수도 있습니다. 기본 텍스트 파일에 더 많은 콘텐츠를 추가할수록 시간이 지남에 따라 장면이 더 많이 변경됩니다.

덱 빌더 및 셔플러

카드를 플레이하고 카드 관련 스크립트를 처리하려면 덱 빌더와 통합된 셔플 도구를 사용해야 합니다. 먼저 표준 카드 덱을 만들어 보겠습니다. 두 개의 어레이를 구성해야 합니다. 하나는 동일한 모양의 카드 그룹을 보관하기 위한 것이고, 다른 하나는 카드 앞면을 보관하기 위한 것입니다. 이는 나중에 새로운 덱이나 카드 유형을 추가해야 할 경우 뛰어난 유연성을 제공합니다.

목록 7. 표준 카드 덱 빌드

<ol class="dp-c">
<li class="alt"><span><span class="vars">$suits</span><span> = </span><span class="keyword">array</span><span> (  </span></span></li>
<li>
<span class="string">"Spades"</span><span>, </span><span class="string">"Hearts"</span><span>, </span><span class="string">"Clubs"</span><span>, </span><span class="string">"Diamonds"</span><span> </span>
</li>
<li class="alt"><span>);  </span></li>
<li>
<span class="vars">$faces</span><span> = </span><span class="keyword">array</span><span> (  </span>
</li>
<li class="alt">
<span class="string">"Two"</span><span>, </span><span class="string">"Three"</span><span>, </span><span class="string">"Four"</span><span>, </span><span class="string">"Five"</span><span>, </span><span class="string">"Six"</span><span>, </span><span class="string">"Seven"</span><span>, </span><span class="string">"Eight"</span><span>,  </span>
</li>
<li>
<span class="string">"Nine"</span><span>, </span><span class="string">"Ten"</span><span>, </span><span class="string">"Jack"</span><span>, </span><span class="string">"Queen"</span><span>, </span><span class="string">"King"</span><span>, </span><span class="string">"Ace"</span><span> </span>
</li>
<li class="alt"><span>); </span></li>
</ol>

그런 다음 모든 카드 값을 보유하는 데크 배열을 빌드합니다. 이는 한 쌍의 foreach 루프를 사용하여 간단하게 수행할 수 있습니다.

목록 8. 카드 배열 구성

<ol class="dp-c">
<li class="alt"><span><span class="vars">$deck</span><span> = </span><span class="keyword">array</span><span>();  </span></span></li>
<li>
<span class="keyword">foreach</span><span> (</span><span class="vars">$suits</span><span> </span><span class="keyword">as</span><span> </span><span class="vars">$suit</span><span>) {  </span>
</li>
<li class="alt">
<span class="keyword">foreach</span><span> (</span><span class="vars">$faces</span><span> </span><span class="keyword">as</span><span> </span><span class="vars">$face</span><span>) {  </span>
</li>
<li>
<span class="vars">$deck</span><span>[] = </span><span class="keyword">array</span><span> (</span><span class="string">"face"</span><span>=></span><span class="vars">$face</span><span>, </span><span class="string">"suit"</span><span>=></span><span class="vars">$suit</span><span>);  </span>
</li>
<li class="alt"><span>}  </span></li>
<li><span>} </span></li>
</ol>

카드 배열을 구성한 후 쉽게 덱을 섞고 카드를 무작위로 뽑을 수 있습니다.

목록 9. 덱을 섞고 무작위로 카드 뽑기

<ol class="dp-c">
<li class="alt"><span><span>shuffle(</span><span class="vars">$deck</span><span>);  </span></span></li>
<li>
<span class="vars">$card</span><span> = </span><span class="func">array_shift</span><span>(</span><span class="vars">$deck</span><span>);  </span>
</li>
<li class="alt">
<span class="func">echo</span><span> </span><span class="vars">$card</span><span>[</span><span class="string">'face'</span><span>] . </span><span class="string">' of '</span><span> . </span><span class="vars">$card</span><span>[</span><span class="string">'suit'</span><span>]; </span>
</li>
</ol>

이제 여러 덱의 카드를 뽑거나 멀티 덱 슈를 만드는 단축키가 생겼습니다.

확률 계산기: 딜링

덱을 구성할 때 각 카드의 앞면과 모양이 개별적으로 추적되므로 프로그래밍 방식으로 덱을 활용하여 얻을 확률을 계산할 수 있습니다. 특정 카드. 먼저 각 손에서 5장의 카드를 뽑습니다.

清单 10. 每只手抽出五张牌

<ol class="dp-c">
<li class="alt"><span><span class="vars">$hands</span><span> = </span><span class="keyword">array</span><span>(1 => </span><span class="keyword">array</span><span>(), 2=></span><span class="keyword">array</span><span>());  </span></span></li>
<li>
<span class="keyword">for</span><span> (</span><span class="vars">$i</span><span> = 0; </span><span class="vars">$i</span><span> <span class="vars">$i</span><span>++) {  </span></span>
</li>
<li class="alt">
<span class="vars">$hands</span><span>[1][] = implode(</span><span class="string">" of "</span><span>, </span><span class="func">array_shift</span><span>(</span><span class="vars">$deck</span><span>));  </span>
</li>
<li>
<span class="vars">$hands</span><span>[2][] = implode(</span><span class="string">" of "</span><span>, </span><span class="func">array_shift</span><span>(</span><span class="vars">$deck</span><span>));  </span>
</li>
<li class="alt"><span>} </span></li>
</ol>

然后可以查看这副牌,看看剩余多少张牌以及抽到特定牌的机率是多少。查看剩余的牌数十分简单。只需要计算 $deck 数组中包含的元素数。要获得抽到特定牌的机率,我们需要一个函数来遍历整副牌并估算其余牌以查看是否匹配。

清单 11. 计算抽到特定牌的几率

<ol class="dp-c">
<li class="alt"><span><span class="keyword">function</span><span> calculate_odds(</span><span class="vars">$draw</span><span>, </span><span class="vars">$deck</span><span>) {  </span></span></li>
<li>
<span class="vars">$remaining</span><span> = </span><span class="func">count</span><span>(</span><span class="vars">$deck</span><span>);  </span>
</li>
<li class="alt">
<span class="vars">$odds</span><span> = 0;  </span>
</li>
<li>
<span class="keyword">foreach</span><span> (</span><span class="vars">$deck</span><span> </span><span class="keyword">as</span><span> </span><span class="vars">$card</span><span>) {  </span>
</li>
<li class="alt">
<span class="keyword">if</span><span> (  (</span><span class="vars">$draw</span><span>[</span><span class="string">'face'</span><span>] == </span><span class="vars">$card</span><span>[</span><span class="string">'face'</span><span>] && </span><span class="vars">$draw</span><span>[</span><span class="string">'suit'</span><span>] ==  </span>
</li>
<li>
<span class="vars">$card</span><span>[</span><span class="string">'suit'</span><span>] ) ||  </span>
</li>
<li class="alt">
<span>(</span><span class="vars">$draw</span><span>[</span><span class="string">'face'</span><span>] == </span><span class="string">''</span><span> && </span><span class="vars">$draw</span><span>[</span><span class="string">'suit'</span><span>] == </span><span class="vars">$card</span><span>[</span><span class="string">'suit'</span><span>] ) ||  </span>
</li>
<li>
<span>(</span><span class="vars">$draw</span><span>[</span><span class="string">'face'</span><span>] == </span><span class="vars">$card</span><span>[</span><span class="string">'face'</span><span>] && </span><span class="vars">$draw</span><span>[</span><span class="string">'suit'</span><span>] == </span><span class="string">''</span><span> ) ) {  </span>
</li>
<li class="alt">
<span class="vars">$odds</span><span>++;  </span>
</li>
<li><span>}  </span></li>
<li class="alt"><span>}  </span></li>
<li>
<span class="keyword">return</span><span> </span><span class="vars">$odds</span><span> . </span><span class="string">' in '</span><span> </span><span class="vars">$remaining</span><span>;  </span>
</li>
<li class="alt"><span>} </span></li>
</ol>

现在可以选出尝试抽出的牌。为了简单起见,传入看上去类似某张牌的数组。我们可以查找特定的一张牌。

清单 12. 查找指定的一张牌

<ol class="dp-c">
<li class="alt"><span><span class="vars">$draw</span><span> = </span><span class="keyword">array</span><span>(</span><span class="string">'face'</span><span> => </span><span class="string">'Ace'</span><span>, </span><span class="string">'suit'</span><span> => </span><span class="string">'Spades'</span><span>);  </span></span></li>
<li>
<span class="func">echo</span><span> implode(</span><span class="string">" of "</span><span>, </span><span class="vars">$draw</span><span>) . </span><span class="string">' : '</span><span> . calculate_odds(</span><span class="vars">$draw</span><span>, </span><span class="vars">$deck</span><span>); </span>
</li>
</ol>

或者可以查找指定牌面或花色的牌。

清单 13. 查找指定牌面或花色的牌

<ol class="dp-c">
<li class="alt"><span><span class="vars">$draw</span><span> = </span><span class="keyword">array</span><span>(</span><span class="string">'face'</span><span> => </span><span class="string">''</span><span>, </span><span class="string">'suit'</span><span> => </span><span class="string">'Spades'</span><span>);  </span></span></li>
<li>
<span class="vars">$draw</span><span> = </span><span class="keyword">array</span><span>(</span><span class="string">'face'</span><span> => </span><span class="string">'Ace'</span><span>, </span><span class="string">'suit'</span><span> => </span><span class="string">''</span><span>); </span>
</li>
</ol>

1

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/445840.htmlTechArticle简单的掷骰器 许多游戏和游戏系统都需要骰子。让我们先从简单的部分入手:掷一个六面骰子。实际上,滚动一个六面骰子就是从 1 到 6...
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.