【スキルチェック過去問題セット 】みんなでしりとり (paizaランク B 相当) 解答例 – PHP編【paiza】


【スキルチェック過去問題セット】 > みんなでしりとり (paizaランク B 相当)
※リンク先へ移動する為には「paiza」へのログインが必要です。

すごく難しかった…><。神経衰弱と同じかなぁっと思ったら見事に躓いた。
神経衰弱との違いはゲームプレイヤーが脱落していくことです。この部分をどう再現するかが鍵でした。「ポインタの操作」でなんとか再現でき、クリアできましたが…半日かかったよぉ( ;∀;)

解答例

 

解答方針

この問題は管理するべき項目が多いことが難易度を押し上げてると思います。まず大きな部分の管理項目として、ゲームに生き残っているプレイヤーを管理する「プレイヤー配列($playerarray)」、発言可能なワードを管理する「ワードリスト($wordarray)」、そして実際のゲームプレイで発言されるワード「ゲームプレイ配列($array)」、最後に既に発言されたワードを管理する配列「発言済み配列($remark)」の配列を活用して答えを導きます。
求める答えは「ゲームに脱落せず残っているプレイヤー」です。ゲームを進めながら、「プレイヤー配列」をどう動かしていくかが鍵となります。それでは各コードを見ていきます。

 

 

各情報の取得

ゲームに必要な情報を取得、配列に格納していきます。「$judge」は「最初の人以外の発言の頭文字は、直前の人の発言の最後の文字と一緒でなければならない。」とルール2を守る必要があるかないかを切り替えるフラグです。しりとりの開始や。脱落者が出た際など、このルールの変更が必要となります。

 

ゲームプレイ(しりとり)部分

長いですね(;^ω^) 細かなことはコードから読み取ってもらうとして、この問題で重要なのはターンプレイヤーの切り替え操作です。「unset」でプレイヤーを削除していくため、配列内には歯抜けの要素だらけになります。こういう時はポインタを利用した操作が有効です。

 

 

ターンプレイヤーの切り替え

ポイントがセットされているインデックスキーを「$playerkey = key($playerarray)」で取得し、「$nowplayer = $playerarray[$playerkey]」とすることで現在のターンプレイヤーを決定しています。しりとりの結果、次のプレイヤーに切り替わります。しりとりが普通に通過した場合は「next($playerarray)」でポインタを進めればいいのですが、プレイヤーが脱落した場合、「unset($playerarray[$playerkey])」でポイントがセットされているプレイヤーを削除します。このときセットされていたポインタはどのような挙動を行うのでしょうか?
答えは、ポインタは一つ進みますポインタが乗っている要素が削除されると自動的に次の要素にポインタが移るんですね。今回はこの原理を利用しています。

ただここで諸注意があります。それは配列の末尾のプレイヤーを削除、並びに「next()」でそれ以上要素がないのにポインタを移動させた場合です。その場合、「false」が返ってくるのですが「$playerkey = key($playerarray);」で変数に入れると変数が空になります。これを利用して発言前の

の部分で「$playerkeyが空の場合、ポインタを先頭に戻し、$playerkeyにポインタがセットされている要素をいれなさい」というコードで、残っている最後のプレイヤーから最初のプレイヤーへターンを回す仕組みを作っています。
これもっといい方法ありそうなんだけどなぁ(;^ω^)

 

エッグ

シェアする