using System.Runtime.CompilerServices;

namespace JankenForm_Matsuda;

public partial class JankenForm : Form {
    /**************************
     * インスタンスメンバー
     **************************/

    ///<summary>フォームのコンストラクタ</summary>
    public JankenForm() {

        InitializeComponent();
        resetBtn();
    }

    /*------------------------------
     * コントロールイベントハンドラ
     ------------------------------*/

    ///<summary>グーボタンクリック</summary>
    private void btnGu_Click(object sender, EventArgs e) {

        yourHandNo = Hand.GUU;
        judge();
    }

    ///<summary>チョキボタンクリック</summary>
    private void btnChoki_Click(object sender, EventArgs e) {

        yourHandNo = Hand.CHOKI;
        judge();
    }

    ///<summary>パーボタンクリック</summary>
    private void btnPa_Click(object sender, EventArgs e) {

        yourHandNo = Hand.PAA;
        judge();
    }

    ///<summary>ゲームスタートボタンクリック</summary>
    private void btnGameStart_Click(object sender, EventArgs e) {

        StartGame();
    }

    ///<summary>リプレイボタンクリック</summary>
    private void btnReplay_Click(object sender, EventArgs e) {

        StartGame();
    }

    /*------------------------------
    * クラス内メソッド
    ------------------------------*/
    ///<summary>ゲームスタート時のボタン表示制御</summary>
    private void resetBtn() {

        // ゲームスタートボタンを表示
        btnGameStart.Visible = true;
        // 各手のボタンを非表示
        btnGu.Visible = false;
        btnChoki.Visible = false;
        btnPa.Visible = false;
        // リプレイボタンを非表示
        btnReplay.Visible = false;
        // 初期メッセージ設定
        message.Text = "5秒以内に手を決めないと負けです!";
    }


    ///<summary>ゲーム開始処理</summary>
    private void StartGame() {

        // ボタンを隠す
        btnGameStart.Visible = false;
        btnReplay.Visible = false;

        // 手のボタンを表示
        btnGu.Visible = true;
        btnChoki.Visible = true;
        btnPa.Visible = true;

        // ラベルのテキストを設定
        message.Text = "ゲームスタート!";
        winLoss.Text = "";
    }

    ///<summary>じゃんけんの勝敗判定</summary>
    ///<remarks>勝敗がついたらリプレイボタンを表示</remarks>
    private void judge() {

        // PCの手を乱数で決める(下の式で手の数-1の値になる)
        pcHandNo = rnd.Next(Hand.hands.Length);

        // プレイヤーの手を取得
        Hand yourHand = Hand.hands[yourHandNo];

        // 勝敗を得て表示する
        int result = yourHand.judge(pcHandNo);
        showWinLoss(result);

        // 勝敗による制御
        if (Hand.DRAW != result) {
            // タイマーストップ

            btnReplay.Visible = true;
        }
    }

    ///<summary>勝敗表示</summary>
    private void showWinLoss(int result) {

        message.Text = $"あなたの手「{Hand.hands[yourHandNo]}」 私の手「{Hand.hands[pcHandNo]}」";
        winLoss.Text = RESULT_MSG[result];
    }


    /**************************
     * スタティックメンバー
     **************************/

    ///<summary>プレーヤーの手</summary>
    private static int yourHandNo = 0;
    ///<summary>PCの手</summary>
    private static int pcHandNo = 0;
    ///<summary>乱数取得用インスタンス</summary>
    private static readonly Random rnd = new Random();

    ///<summary>勝敗を知らせるメッセージ</summary>
    private static readonly string[] RESULT_MSG = new string[] {
        "あなたの勝ちです!",
        "わたしの勝ちです",
        "あいこです",
        "ゲームが中断されました"
    };
}


<まとめ:隣の人に正しく説明できたらチェックを付けましょう>