« UJMLサンプル029:うろうろ+ジャンプ | メイン | 何を作るか?プレゼンテーションViewer。その2 »

UJMLサンプル030:大脳刺激-数字記憶(2006/02/06)

Samples_030_numbermem2 記念すべき30回目はちょっとしたゲームを作成した(動作サンプル)。最近、脳を刺激する大人のゲーム(計算やら記憶等)が流行っているが、それにインスパイアされたサンプルだ。10桁の数字を10秒間で記憶した後、回答する。

このゲームは今まで紹介した次のサンプルを参考にして作成した。あまり美しくないコードになってしまったが、おいおい直せたらと思っている。30回記念なので勘弁して。

UJMLサンプル003:ステート変数千本ノック その3 タイマー
記憶時間制限部分

UJMLサンプル010:数あてゲーム その2
回答時のボタン入力処理

UJMLサンプル021:スタートボタン
最初のスタートボタン

ちなみに、001-025のサンプル一覧はこちらにまとめている。

遊び方:
1.START画面でクリックまたはENTER
2.10秒間で10桁の数字を記憶
3.回答開始、、全てできるまでがんばる。ギブアップ無し。
4.10桁正解で終了

今後の改良予定:
・回答制限時間をつける
・最速スコアを表示
・間違い数カウント
・成績をどこかのサーバーに保存して偏差値を出す
等等

動作サンプル
※動作にはJAVA Runtimeが必要
※キーボードのENTERで開始

---コード
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ujml PUBLIC "-//UIEVOLUTION//DTD UJML 1.5//EN"
"http://www.uievolution.com/dtd/ujml-1.5.dtd" [
    <!ENTITY SALUTATION "0000000000">
    <!ENTITY START_MESSAGE "START" >
    <!ENTITY SPACING "4">
    <!ENTITY BORDER_SIZE "2">
    <!ENTITY SEC_LIMIT "10"><!-- 覚える秒数 -->
    <!ENTITY PAD_BUTTON_COUNT "10">   
]>
<!-- http://uiengineda.blogs.com 数字を記憶しておく-->
<ujml>
    <application>
        <state-variables>
            <state-var name="sStartButton" type="boolean"/>
            <state-var name="sTimer" type="boolean"/>
            <state-var name="sAnswer" type="boolean"/>
            <state-var name="sBackGround" type="boolean"/>
            <state-var name="sEnding" type="boolean"/>

            <state-var name="sButton" type="boolean" size="&PAD_BUTTON_COUNT;"/>
        </state-variables>
        <variables>
            <var name="mScrWidth" type="int" />
            <var name="mScrHeight" type="int" />

            <var name="mPosX" type="int" />
            <var name="mPosY" type="int" />

            <var name="mWidth" type="int"/>
            <var name="mHeight" type="int"/>

            <var name="mTimer" type="int"/>
            <var name="mSeed" type="int"/>
            <var name="mIndex" type="int"/><!-- 何文字目の文字を回答しているところか? -->

            <var name="mAnswerWidth" type="int"/>
            <var name="mPosXAnswer" type="int"/>

            <var name="mTrueAnswer" type="string"/>
            <var name="mTempAnswer" type="string"/><!-- 今の回答状況を表示する -->

            <var name="mBackColor" type="int"/>
            <var name="mBadColor" type="int"/>
            <var name="mNormalColor" type="int"/>
        </variables>
        <functions>
            <function name="randRange" type="int"><!-- これは指定範囲の数字をランダムに作る関数 -->
                <parameters>
                    <var name="seed" type="int"/>
                    <var name="min" type="int"/>
                    <var name="max" type="int"/>
                </parameters>
                <return>
                    <eval>
                        (_srand(seed) % (max - min + 1)) + min
                    </eval>
                </return>
            </function>
            <function name="startNumberMemory" type="void">
                <script>
                    // スタートボタンがクリックされた
                    sStartButton = false;

                    <!-- まず問題用の数字をランダムに作る -->
                    mTrueAnswer = _strcat(randRange(_msec(),10000,99999),randRange(mSeed,10000,99999));
                    mSeed = _msec();
                    mIndex = 0;

                    sAnswer = false;
                    mTempAnswer = mTrueAnswer;
                    sAnswer = true;

                    mTimer = &SEC_LIMIT;;
                    sTimer = true;
                </script>
            </function>
        </functions>

        <script>
            mSeed = _msec();

            <!-- スクリーンのサイズを調べる -->
            mScrWidth = _getIntProperty(&_PROPERTY_INT_SCREEN_WIDTH;);
            mScrHeight = _getIntProperty(&_PROPERTY_INT_SCREEN_HEIGHT;);

            <!-- 全文字数分の幅 -->
            mWidth = (&SPACING; * 2) +
                _text_width("&START_MESSAGE;", &_FONT_SIZE_MEDIUM;,
                &_FONT_STYLE_BOLD;, &_FONT_FACE_SYSTEM;);

            mAnswerWidth= (&SPACING; * 2) +
                _text_width("&SALUTATION;", &_FONT_SIZE_MEDIUM;,
                &_FONT_STYLE_BOLD;, &_FONT_FACE_SYSTEM;);

            <!-- 高さ -->
            mHeight = (&SPACING; * 2) +
                _text_height(&_FONT_SIZE_MEDIUM;, &_FONT_STYLE_ITALIC;,
                &_FONT_FACE_SYSTEM;);

            <!-- 中心の位置 -->
            mPosX = (mScrWidth / 2) - (mWidth / 2);
            mPosY = (mScrHeight / 2) - (mHeight / 2);
            mPosXAnswer = (mScrWidth / 2) - (mAnswerWidth / 2);

            mBadColor = &_COLOR_RED;;
            mNormalColor = &_COLOR_WHITE;;
            mBackColor = mNormalColor;
            sBackGround = true;

            sStartButton = true;
        </script>
        <states>
            <state var="sBackGround">
                <transition value="true">
                    <display>
                        <box>
                            <width><eval>mScrWidth</eval></width>
                            <height><eval>mScrHeight</eval></height>
                            <fg><eval>mBackColor</eval></fg>
                            <bg><eval>mBackColor</eval></bg>
                        </box>
                    </display>
                    <delay>100</delay>
                    <script>
                        mBackColor = mNormalColor;
                        sBackGround = false;
                        sBackGround = true;
                    </script>
                </transition>
            </state>
            <state var="sStartButton">
                <transition value="true">
                    <display>
                        <box>
                            <width><eval>mScrWidth</eval></width>
                            <height><eval>mScrHeight</eval></height>
                            <fg>&_COLOR_TRANSPARENT;</fg>
                            <bg>&_COLOR_TRANSPARENT;</bg>
                            <event name="onSelect">
                                <accelerators>
                                    <key>FIRE</key>
                                </accelerators>
                                <script>
                                    startNumberMemory();
                                </script>
                            </event>
                        </box>

                        <!-- ボタンの枠 -->
                        <box>
                            <x><eval>mPosX-&BORDER_SIZE;</eval></x>
                            <y><eval>mPosY-&BORDER_SIZE;</eval></y>
                            <width><eval>mWidth+&BORDER_SIZE;*2</eval></width>
                            <height><eval>mHeight+&BORDER_SIZE;*2</eval></height>
                            <fg>&_COLOR_BLUE;</fg>
                            <bg>&_COLOR_BLUE;</bg>
                        </box>
                        <!-- 四角い箱の中にラベルを配置しています。 -->
                        <box>
                            <x><eval>mPosX</eval></x>
                            <y><eval>mPosY</eval></y>
                            <width><eval>mWidth</eval></width>
                            <height><eval>mHeight</eval></height>
                            <fg>&_COLOR_SILVER;</fg>
                            <bg>&_COLOR_SILVER;</bg>
                            <event name="onSelect">
                                <script>
                                    startNumberMemory();
                                </script>
                            </event>
                            <label>
                                <text>&START_MESSAGE;</text>
                                <x>&SPACING;</x>
                                <y>&SPACING;</y>
                                <fg>&_COLOR_BLACK;</fg>
                                <bg>&_COLOR_SILVER;</bg>
                                <style>&_FONT_STYLE_BOLD;</style>
                            </label>
                        </box>
                    </display>
                </transition>
            </state>
            <state var="sTimer">
                <transition value="true">
                    <display>
                        <label>
                            <text><eval>_strcat("覚えましょう:",mTimer,"sec")</eval></text>
                            <fg>&_COLOR_WHITE;</fg>
                            <bg>&_COLOR_BLACK;</bg>
                        </label>
                    </display>
                    <delay>1000</delay>
                    <script>
                        sTimer = false;
                        mTimer--;
                        if(mTimer > 0){
                            sTimer=true;
                        }else{
                            <!-- 制限時間 -->
                            sAnswer = false;
                            mTempAnswer = "**********";
                            sAnswer = true;

                            <!-- 回答ボタンを使えるようにする -->
                            mIndex = 0;
                            while(mIndex &_LT; &PAD_BUTTON_COUNT;){
                                sButton[mIndex] = true;
                                mIndex++;
                            }
                            mIndex = 0;
                        }
                    </script>
                </transition>
            </state>

            <state var="sButton" index="*">
                <!-- ボタンです:実際は空というか透明なので画面上に表示されません。 -->
                <!-- イベント処理のためだけにあります。 -->
                <transition value="true">
                    <display>
                        <box>
                            <event name="onSelect">
                                <accelerators>
                                    <key><eval>_state_index(0)</eval></key>
                                </accelerators>
                                <variables>
                                    <var name="tmpIndex" type="int" />
                                    <var name="tmpNumber" type="int" />
                                </variables>
                                <script>
                                    <!-- 1文字切り出す -->
                                    tmpNumber = _string_to_int(_substring(mTrueAnswer, mIndex, mIndex + 1));

                                    sAnswer = false;
                                    if(tmpNumber == _state_index(0)){
                                        <!-- あたったから、表示する。 -->
                                        mTempAnswer = _strcat(_substring(mTempAnswer,0,mIndex),tmpNumber);
                                        <!-- 残りは*を表示 -->
                                        tmpIndex = 0;
                                        while(tmpIndex &_LT; 9 - mIndex){
                                            mTempAnswer = _strcat(mTempAnswer,"*");
                                            tmpIndex++;
                                        }

                                        sAnswer = false;
                                        sAnswer = true;

                                        if(mIndex == _strlen(mTrueAnswer) - 1){
                                            <!-- 全部あたったらおしまいにして、スタートボタンを表示 -->
                                            tmpIndex = 0;
                                            while(tmpIndex &_LT; &PAD_BUTTON_COUNT;){
                                                sButton[tmpIndex] = false;
                                                tmpIndex++;
                                            }
                                            sEnding = true;
                                        }

                                        mIndex++;
                                    }else{
                                        <!-- 間違ったら画面を赤くしたい -->
                                        mBackColor = mBadColor;
                                        _clear_state(sBackGround);
                                        sBackGround = true;
                                        sAnswer = true;
                                    }
                                </script>
                            </event>
                        </box>
                    </display>
                </transition>   
            </state>
            <state var="sAnswer">
                <transition value="true">
                    <display>
                        <!-- ボタンの枠 -->
                        <box>
                            <x><eval>mPosXAnswer-&BORDER_SIZE;</eval></x>
                            <y><eval>mPosY-&BORDER_SIZE;</eval></y>
                            <width><eval>mAnswerWidth+&BORDER_SIZE;*2</eval></width>
                            <height><eval>mHeight+&BORDER_SIZE;*2</eval></height>
                            <fg>&_COLOR_BLUE;</fg>
                            <bg>&_COLOR_BLUE;</bg>
                        </box>
                        <!-- 四角い箱の中にラベルを配置しています。 -->
                        <box>
                            <x><eval>mPosXAnswer</eval></x>
                            <y><eval>mPosY</eval></y>
                            <width><eval>mAnswerWidth</eval></width>
                            <height><eval>mHeight</eval></height>
                            <fg>&_COLOR_WHITE;</fg>
                            <bg>&_COLOR_WHITE;</bg>
                            <label>
                                <text><eval>mTempAnswer</eval></text>
                                <x>&SPACING;</x>
                                <y>&SPACING;</y>
                                <fg>&_COLOR_BLACK;</fg>
                                <bg>&_COLOR_SILVER;</bg>
                                <style>&_FONT_STYLE_BOLD;</style>
                            </label>
                        </box>
                    </display>
                </transition>
            </state>
            <state var="sEnding">
                <transition value="true">
                    <display>
                        <label>
                            <text>おめでとうございます。</text>
                            <fg>&_COLOR_WHITE;</fg>
                            <bg>&_COLOR_BLACK;</bg>
                        </label>
                    </display>
                    <delay>1000</delay>
                    <script>
                        sAnswer = false;
                        sEnding = false;
                        sStartButton = true;
                    </script>
                </transition>
            </state>
        </states>
    </application>
</ujml>

トラックバック

この記事のトラックバックURL:
https://www.typepad.com/services/trackback/6a00d8341c2e2e53ef00e550a962db8834

UJMLサンプル030:大脳刺激-数字記憶を参照しているブログ:

コメント

この記事へのコメントは終了しました。