🦔

【PHP初心者】range関数を用いて戦争ゲームのトランプの強さを比較する

2024/02/25に公開

はじめに

戦争ゲームは52枚のトランプを使いプレイヤー同士が勝負するゲーム🃏
https://www.card-asobi.com/sensou.html
実装するにあたってカードの強さを比較するときに苦戦したのでまとめてみました!

連想配列で試してみた

連想配列のキーと値にカードの数字と強さを紐づけて比べられるかを試してみました!

deck.php
public function __construct() {
            $suits = ['スペード','ハート','ダイヤ','クラブ'];
            $ranks = ['A' => 14,'K' => 13,'Q' => 12,'J' => 11,'10' => 10,'9' => 9,'8' => 8,'7' => 7,'6' => 6,'5' => 5,'4' => 4,'3' => 3,'2' => 2];
            // 内容をcardsに入れていく
            foreach ($suits as $suit) {
                // Cardクラスのメンバ変数にsuitsとranksを振り分ける
                foreach ($ranks as $rank => $strength) {
                    $this->cards[] = new Card($suit, $rank, $strength);
                }

このコードでは$strengthを呼び出して比較させてもなぜかできなかった、、(var_dumpで見ても値は入ってた)
なので、新しく$strengthsを作ってその値と$ranksの値を紐づけよう!と考えました。
そこで使ったのがrange関数です。

range関数を使ってみた

range関数は(開始値、終了値、ステップ)を引数に整数の配列を作ってくれます。
〜ステップは各値の間の差です。(今回は1ずつ減っていくので-1にしています)〜

今回は$ranksにA~2の順番で値が入ってるので、強さも14~2の順番で値を入れてみました。

deck.php
public function __construct() {
            $suits = ['スペード', 'ハート', 'ダイヤ', 'クラブ'];
            $ranks = ['A', 'K', 'Q', 'J', '10', '9', '8', '7', '6', '5', '4', '3', '2'];
            $strengths = range(14, 2, -1);
            foreach ($suits as $suit) {
            foreach ($ranks as $index => $rank) {
                $strength = $strengths[$index]; // 強さはranksの順番に対応
                $this->cards[] = new Card($suit, $rank, $strength);
            }

これで$strengthを引っ張ってこれるようになりカードの比較がうまくいきました!

終わりに

今回は1人でコードを書いてデータの流れを考えるだけでよかったので大丈夫でしたが、実際の実務ではデータのやり取りが複雑になっていくと思うので今後はデータフローを可視化して実装に入れるようにしたいなと思いました。
https://and-engineer.com/articles/YDYO9BAAACIAOhu3

今回の戦争ゲームのコードはこちら
https://github.com/MK-1305/PHP_QUEST.git

Discussion