3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

じゃんけん勝負をするコードを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;

    //乱数の変数の最大値4
    const MAX = 4;
    //乱数の変数の最小値0
    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
この処理結果が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% 

以上となります。

3
2
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?