自分のコーディング能力の計測のためミニマムなゲーム、じゃんけんを最速で作ってみた

こんにちは。ヤマヤタケシです。
先週の日曜に一人ゲームジャムだ!とか言いながらコードを書き始めたのだけど、なかなか進捗が遅くてしょんぼりしています。
ゲームを考えながらコードも書きながらってのは、先が見えない中で右往左往している感じで進みが遅くて不満です。
普通に平日真面目に仕事していると精神力がすり減っているってのももちろんあるんですけど、まあ、やってる人はやってるし、頑張りましょう。
それにしても、コード書きながら仕様を考えるのはキツイっすね。

というわけで、進捗が悪い原因追求と気分転換にゲームの仕様がはっきりしている、最小のゲームを最速で作ってみました。
完全にミニマム。
UnityのGUIを使うだけ。
結果、45分かかりました。
まあ、こんなもんかなぁ・・・。
始める前は15分くらいでできるかも?とか思ってましたけど。
遊んでみるまで、「あいこ」がぬけていることに気づかなかったのには、びっくりだぜ!

これからプログラミングを始めるような人には参考になるかもしれないので、コードを公開します。

//
// ミニマムなじゃんけん
//
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Janken : MonoBehaviour
{
    public enum StateTag
    {
        None,
        Ready,
        Jan,
        Ken,
        Pon,
        Aikode,
        Sho,
        Result,
        End,
    }
    public StateTag state;

    public enum Card
    {
        None,
        Gu,
        Choki,
        Pa,
    }
    public Card playerCard;
    public Card cpuCard;

    public enum Result
    {
        None,
        Win,
        Lose,
        Draw,
    }
    public Result result;

    public enum YesNo
    {
        None,
        Yes,
        No,
    }
    public YesNo retry;
    bool isReady;
    IEnumerator Start()
    {
        do
        {
            // 開始
            isReady = false;
            state = StateTag.Ready;
            while (!isReady)
            {
                yield return null;
            }
            // じゃん
            state = StateTag.Jan;
            yield return new WaitForSeconds(1.0f);
            // けん
            state = StateTag.Ken;
            yield return new WaitForSeconds(1.0f);

            // ぽん
            state = StateTag.Pon;
            playerCard = Card.None;
            while (playerCard == Card.None)
            {
                yield return null;
            }
            cpuCard = (Card)Random.Range(1, 3);
            result = CheckResult(playerCard, cpuCard);

            while (result == Result.Draw)
            {
                state = StateTag.Aikode;
                yield return new WaitForSeconds(1.0f);

                state = StateTag.Sho;
                playerCard = Card.None;
                while (playerCard == Card.None)
                {
                    yield return null;
                }
                cpuCard = (Card)Random.Range(1, 3);
                result = CheckResult(playerCard, cpuCard);
            }


            // 結果
            state = StateTag.Result;
            result = CheckResult(playerCard, cpuCard);

            // もう一回?
            retry = YesNo.None;
            while (retry == YesNo.None)
            {
                yield return null;
            }
        }
        while (retry == YesNo.Yes);
        state = StateTag.End;
    }

    void OnGUI()
    {
        switch (state)
        {
            case StateTag.Ready:
                if (GUILayout.Button("はじめる")) { isReady = true; }
                break;

            case StateTag.Jan:
                GUILayout.Label("じゃん");
                break;

            case StateTag.Ken:
                GUILayout.Label("けん");
                break;

            case StateTag.Pon:
                GUILayout.Label("ぽん");
                playerCard = SelectCard();
                break;

            case StateTag.Aikode:
                GUILayout.Label("あいこで");
                break;

            case StateTag.Sho:
                GUILayout.Label("しょ");
                playerCard = SelectCard();
                break;

            case StateTag.Result:
                CardLabel("CPU ", cpuCard);
                CardLabel("PLAYER ", playerCard);
                switch (result)
                {
                    case Result.Win: GUILayout.Label("かち!"); break;
                    case Result.Lose: GUILayout.Label("まけ..."); break;
                }
                if (GUILayout.Button("もういっかいやる")) { retry = YesNo.Yes; }
                if (GUILayout.Button("やらない")) { retry = YesNo.No; }
                break;
            case StateTag.End:
                GUILayout.Label("おわり");
                break;
        }
    }

    Card SelectCard()
    {
        if (GUILayout.Button("ぐー")) { return Card.Gu; }
        if (GUILayout.Button("ちょき")) { return Card.Choki; }
        if (GUILayout.Button("ぱー")) { return Card.Pa; }
        return Card.None;
    }

    void CardLabel(string side, Card card)
    {
        switch (card)
        {
            case Card.Gu: GUILayout.Label(side + "ぐー"); break;
            case Card.Choki: GUILayout.Label(side + "ちょき"); break;
            case Card.Pa: GUILayout.Label(side + "ぱー"); break;
        }
    }

    Result CheckResult(Card playerCard, Card cpuCard)
    {
        if (playerCard == Card.Gu && cpuCard == Card.Gu) { return Result.Draw; }
        if (playerCard == Card.Gu && cpuCard == Card.Choki) { return Result.Win; }
        if (playerCard == Card.Gu && cpuCard == Card.Pa) { return Result.Lose; }
        if (playerCard == Card.Choki && cpuCard == Card.Gu) { return Result.Lose; }
        if (playerCard == Card.Choki && cpuCard == Card.Choki) { return Result.Draw; }
        if (playerCard == Card.Choki && cpuCard == Card.Pa) { return Result.Win; }
        if (playerCard == Card.Pa && cpuCard == Card.Gu) { return Result.Win; }
        if (playerCard == Card.Pa && cpuCard == Card.Choki) { return Result.Lose; }
        if (playerCard == Card.Pa && cpuCard == Card.Pa) { return Result.Draw; }
        return Result.None;
    }

}

そんじゃまた。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です