간단한 주사위 롤러
많은 게임과 게임 시스템에는 주사위가 필요합니다. 쉬운 부분부터 시작해 보겠습니다. 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