PHPじゃんけん勝負プログラムを書いてみた

じゃんけん勝負をするコードをPHPで書いてみました。

実務経験もほどんどなく、我流で書いておりますので酷いコードです。
コードレビューも兼ねて厳しいコメントを募集しております。

問題点をガンガン指摘いただけますと喜びます！よろしくお願いいたします！

#処理の流れ

Dateクラスから日時の要素を取り出しint型として返す。
↓
じゃんけんのタイプ別の配列を用意する。
パータイプ：["パー","グー","パー","チョキ","パー"]など
↓
取得したint型のパラメータの商のあまりを取得して、
それぞれ3つ作ったユーザーのじゃんけんタイプを選択します。

$a =（日時の戻り値 + ユーザー名の長さ) * 100 % 3

if($a === 0){
  パータイプ;
}elseif(…

↓
コンピューターとN回じゃんけんをします。
↓
勝率を求めます。
↓
勝負の結果をテキストファイルに保存します。
以上です。



#ファイル構成について
ファイル構成は以下のようになります。
Main.php(インスタンスを生成し、各処理を表示する）
User.php（ユーザークラスを定義している）
Status.php（ユーザークラスに引き渡すパラメータを作る親クラス）
Enemy.php（作られたユーザークラスとじゃんけん勝負をするためのトレイト）
result.txt（じゃんけん勝負の結果を日付と共に記録するテキストファイル）


```Main.php
<?PHP
    require_once('User.php');

    //Userインスタンスの生成
    $user = new User("aaa");

    $user->user_name();
    echo "<br />";
    $user->battle();
?>
```
```User.php
<?php
require_once('Status.php');
require_once('Enemy.php');

//
class User extends Status{
    //Enemyトレイトの宣言
    use Enemy;

    //乱数の変数の最大値４
    const MAX = 4;
    //乱数の変数の最小値０
    const MIN = 0;
    //じゃんけんの各配列
    public $arr_gu;
    public $arr_chiki;
    public $arr_pa;
    public $user;

    //ユーザーの名前
    public $name;

    //変数の初期化
    public function __construct($name){

        //ユーザーの名前
        $this->name = $name;

        //じゃんけんの配列グータイプ
        $this->arr_gu = ["グー","チョキ","グー","パー","グー"];
        //じゃんけんの配列チョキタイプ
        $this->arr_choki = ["チョキ","グー","チョキ","パー","チョキ"];
        //じゃんけんの配列パータイプ
        $this->arr_pa = ["パー","グー","パー","チョキ","パー"];

    }

    //ユーザー名の表示
    public function user_name(){

        echo "ユーザー名: ".$this->name;

    }

    //じゃんけんのタイプを求める処理
    public function type_select(){

        //$lengにint型パラメータを引き渡す処理。ユーザー名以外のパラメータはStatusクラスより継承
        $leng = strlen($this->name) + parent::from_date();

        if($leng % 3 === 0){
            $arr = $this->arr_gu;
        }elseif($leng %3 === 1){
            $arr = $this->arr_choki;
        }else{
            $arr = $this->arr_pa;
        }
        return $arr;

    }

    //Userのじゃんけんを行う処理
    public function rand_a(){

        //じゃんけん配列に引き渡す乱数　変数MAX～MIN参照
        $this->rnd = mt_rand(self::MIN, self::MAX);
        //じゃんけんの表示
        //echo $this->rnd.":". $this->type_select()[$this->rnd];

        //ここでrand_aメソッドの処理結果を返す。
        return $this->type_select()[$this->rnd];
        
        //じゃんけんタイプの表示
        if($this->type_select() == $this->arr_gu){
            echo "Type:グー";
            echo "<br />";
        }elseif($this->type_select() == $this->arr_choki){
            echo "Type:チョキ";
            echo "<br />";
        }else{
            echo "Type:パー";
            echo "<br />";
        }
        //じゃんけんタイプの中身
        for($i = 0;$i < self::MAX + 1; $i++){
            echo "*".$this->type_select()[$i]." ";
        }
        
        
    }

    //UserとEnemyのじゃんけんの処理
    public function battle(){

        //パラメータの初期化
        $count = 7;
        $win = 0;


        echo "<br />";

        //じゃんけんの繰り返し処理
        for($i = 1; $i <= $count; $i++){       
             //じゃんけん勝負の条件分岐処理
            if($this->rand_a() === $this->enemy()){
                //ここでメソッドを変数に格納して、戻り値を確定させる
                //※戻り値には乱数要素があるため

                //引き分けの場合の処理
                $user = $this->rand_a();
                $enemy = $this->enemy();
                echo $this->name."は ".$user;
                echo "<br />";
                echo "敵は ".$enemy;
                echo "<br />";
                echo "どちらも ".$user." なので引き分け";
                echo "<br /><br />";

            }elseif(($this->rand_a() === "グー" && $this->enemy() ==="チョキ") || ($this->rand_a() === "チョキ" && $this->enemy() ==="パー") || ($this->rand_a() === "パー" && $this->enemy() ==="グー")){
                //ここでメソッドを変数に格納して、戻り値を確定させる
                //※戻り値には乱数要素があるため
                
                //ユーザーが勝利した場合の処理
                $user = $this->rand_a();
                $enemy = $this->enemy();
                echo $this->name."は ".$user;
                echo "<br />";
                echo "敵は ".$enemy;
                echo "<br />";
                echo $this->name." の勝ち";
                echo "<br /><br />";
                //勝利数をカウント
                $win++;
            }else{
                //ここでメソッドを変数に格納して、戻り値を確定させる
                //※戻り値には乱数要素があるため

                //敵が勝利した場合の処理
                $user = $this->rand_a();
                $enemy = $this->enemy();
                echo $this->name."は ".$user;
                echo "<br />";
                echo "敵は ".$enemy;
                echo "<br />";
                echo "敵 の勝ち";
                echo "<br /><br />";

            }
        }
        //ユーザーの勝率の表示
        $win_rate = $this->name."の勝率は ".(int)(($win * 100) / $count)."% "."\n";

        echo $win_rate;

        //ファイル名の設定
        $fileName = './result.txt';
    
        //書き込む文字列
        $string = date("Y/m/d H:i:s ").$win_rate;
    
        //データの書込み
        file_put_contents($fileName, $string, LOCK_EX | FILE_APPEND);
    
        echo "<br />勝率をテキストファイルに保存しました。<br>";
        
            
    }
}
 
?>
```
```Status.php
<?php
    //Userクラスの親クラス
    //じゃんけんタイプを決める為のパラメータをステータスとして求めるクラス。
    class Status{

        //Dataクラスからじゃんけんタイプを決めるパラメータの取得処理
        public function from_date(){
            //月と年、秒の値をdateクラスから取得してint型に直す
            $date = (int)date('nys');
            return $date;
        }
    }
?>
```
```Enemy.php
<?php

    trait Enemy{
        //敵のじゃんけんの手
        public function enemy(){
            //敵のじゃんけん配列に引き渡す乱数処理
            $rand = mt_rand(0, 2);
            $enm_arr = ["グー","チョキ","パー"];
            $enm = $enm_arr[$rand];
            return $enm;
        }

    }
?>
`````
#処理の結果について
Main.phpをブラウザで呼び出し、出力結果を表示すると次のようになりました。
![Janken_result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550376/0072f16c-3c98-0fb1-db71-f01ba538871b.png)
この処理結果がresult.txtに保存されます。

```result.txt
2020/02/14 14:13:08 aaaの勝率は 42% 
2020/02/14 14:15:25 aaaの勝率は 42% 
2020/02/14 14:15:25 aaaの勝率は 14% 
2020/02/14 14:15:26 aaaの勝率は 0% 
2020/02/14 14:15:26 aaaの勝率は 42% 
2020/02/14 14:15:26 aaaの勝率は 28% 
2020/02/14 14:15:26 aaaの勝率は 57% 
2020/02/14 14:15:27 aaaの勝率は 28% 
2020/02/14 14:15:27 aaaの勝率は 0% 
2020/02/14 14:15:28 aaaの勝率は 0% 
2020/02/14 14:15:28 aaaの勝率は 42% 
2020/02/14 14:15:28 aaaの勝率は 14% 
```
以上となります。