UJMLサンプル010:数あてゲーム その2(2006/02/02)
以前作成した「数あてゲーム」はソースコード300行と長すぎたので、150行にまとめたものです。動作は同じです。
回答時のボタン入力を処理するためのboxエレメントを配列化するために、ステート変数sButtonを配列にしました。
以前作成したような長いコードを書かずに済むように日々学習です。UJMLは言語仕様がコンパクトですが、こういったところをしっかりまとめられるように作ってあるのは気が利くなぁと実感。
---コード
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ujml PUBLIC "-//UIEVOLUTION//DTD UJML 1.2//EN" "ujml.dtd" [
<!ENTITY PAD_BUTTON_COUNT "10">
<!ENTITY START_MESSAGE "ボタン「0」で開始">
]>
<ujml>
<application>
<state-variables>
<state-var name="sMessage" type="boolean" />
<state-var name="sInput" type="int" />
<state-var name="sButton" type="boolean" size="&PAD_BUTTON_COUNT;"/>
</state-variables>
<variables>
<var name="mNumber" type="int"/><!-- 正解を保存する -->
<var name="mMessage" type="string"/><!-- 表示するメッセージ -->
</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>
</functions>
<templates>
<template name="messageLabel">
<display>
<label>
<text><eval>mMessage</eval></text>
<bg>&_COLOR_WHITE;</bg>
</label>
</display>
</template>
</templates>
<script>
mMessage = "&START_MESSAGE;";
sMessage = true;<!-- 「0」を押してもらうメッセージを表示 -->
sInput = 0;
</script>
<display>
<fn>
<text>Back</text>
<event name="onselect">
<accelerators> <key>F1</key> </accelerators>
<script>
_unload();
</script>
</event>
</fn>
</display>
<states>
<state var="sMessage">
<transition value="true">
<display>
<expand template="messageLabel"/>
</display>
</transition>
</state>
<state var="sInput">
<transition value="0">
<display>
<box>
<event name="onSelect">
<accelerators>
<key>0</key>
</accelerators>
<variables>
<var name="tmpIndex" type="int"/>
</variables>
<script>
<!-- まず問題用の数字をランダムに作る -->
mNumber = randRange(_msec(), 0, 9);<!-- 新しい数字 -->
sMessage = false;
mMessage = "0から9の数字をあてよう。";
sMessage = true;
<!-- 回答ボタンを使えるようにする -->
tmpIndex = 0;
while(tmpIndex &_LT; &PAD_BUTTON_COUNT;){
sButton[tmpIndex] = true;
tmpIndex++;
}
</script>
</event>
</box>
</display>
</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" />
</variables>
<script>
sMessage = false;
if(mNumber == _state_index(0)){
mMessage = _strcat("正解!","&START_MESSAGE;");
<!-- 回答ボタンを無効化する -->
tmpIndex = 0;
while(tmpIndex &_LT; &PAD_BUTTON_COUNT;){
sButton[tmpIndex] = false;
tmpIndex++;
}
sInput = 0;
}else if(mNumber &_GT; _state_index(0)){
mMessage = "大きいよ";
}else{
mMessage = "小さいよ";
}
sMessage = true;
</script>
</event>
</box>
</display>
</transition>
</state>
</states>
</application>
</ujml>
コメント