UJMLサンプル005:数あてゲーム(2006/01/31)
0~9の数字を当てるゲーム。開始後、0~9のボタンを押して数字を当てる。もしはずれたら、正解が大きいか小さいか教えてくれます。
ボタン0~9のイベント処理のためのコードが長くなってしまったので、ここは短くまとめたいところ。ちょっとだらだら感がありますが、一応動きます。
SDKのサンプルの webapps/ujmlsamples/standalone/visualelements/settings.ujml あたりが使えそうですが、settings.ujmlがincludeするpadbuttons.ujmsの347行目ぐらいからがヒントになりそうな感じだ。ちなみにpadbuttons.ujmsは webapps/ujmlsamples/standalone/components の中に入っている。
ソースコード
----
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ujml PUBLIC "-//UIEVOLUTION//DTD UJML 1.2//EN" "ujml.dtd" >
<ujml>
<application>
<state-variables>
<state-var name="sMessage" type="boolean" />
<state-var name="sInput" type="int" />
</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 = "ボタン「0」で開始";
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>
<script>
<!-- まず問題用の数字をランダムに作る -->
mNumber = randRange(_msec(), 0, 9);<!-- 新しい数字 -->
sMessage = false;
mMessage = "0から9の数字をあてよう。";
sMessage = true;
sInput = 1;
</script>
</event>
</box>
</display>
</transition>
<transition value="1"><!-- 「回答中」状態です、あたったらsInput=2に遷移しますよ -->
<display>
<!-- 0から9までのボタン押しイベント処理 -->
<!-- エレメント1つで済ませたいけど、10個のboxを配置してます、もちろん空で -->
<box>
<event name="onSelect">
<accelerators>
<key>0</key>
</accelerators>
<script>
sMessage = false;
if(mNumber == 0){
mMessage = "正解 ボタン「0」で開始";
sInput = 2;
}else if(mNumber &_GT; 0){
mMessage = "大きいよ";
}else{
mMessage = "小さいよ";
}
sMessage = true;
</script>
</event>
</box>
<box>
<event name="onSelect">
<accelerators>
<key>1</key>
</accelerators>
<script>
sMessage = false;
if(mNumber == 1){
mMessage = "正解 ボタン「0」で開始";
sInput = 2;
}else if(mNumber &_GT; 1){
mMessage = "大きいよ";
}else{
mMessage = "小さいよ";
}
sMessage = true;
</script>
</event>
</box>
<box>
<event name="onSelect">
<accelerators>
<key>2</key>
</accelerators>
<script>
sMessage = false;
if(mNumber == 2){
mMessage = "正解 ボタン「0」で開始";
sInput = 2;
}else if(mNumber &_GT; 2){
mMessage = "大きいよ";
}else{
mMessage = "小さいよ";
}
sMessage = true;
</script>
</event>
</box>
<box>
<event name="onSelect">
<accelerators>
<key>3</key>
</accelerators>
<script>
sMessage = false;
if(mNumber == 3){
mMessage = "正解 ボタン「0」で開始";
sInput = 2;
}else if(mNumber &_GT; 3){
mMessage = "大きいよ";
}else{
mMessage = "小さいよ";
}
sMessage = true;
</script>
</event>
</box>
<box>
<event name="onSelect">
<accelerators>
<key>4</key>
</accelerators>
<script>
sMessage = false;
if(mNumber == 4){
mMessage = "正解 ボタン「0」で開始";
sInput = 2;
}else if(mNumber &_GT; 4){
mMessage = "大きいよ";
}else{
mMessage = "小さいよ";
}
sMessage = true;
</script>
</event>
</box>
<box>
<event name="onSelect">
<accelerators>
<key>5</key>
</accelerators>
<script>
sMessage = false;
if(mNumber == 5){
mMessage = "正解 ボタン「0」で開始";
sInput = 2;
}else if(mNumber &_GT; 5){
mMessage = "大きいよ";
}else{
mMessage = "小さいよ";
}
sMessage = true;
</script>
</event>
</box>
<box>
<event name="onSelect">
<accelerators>
<key>6</key>
</accelerators>
<script>
sMessage = false;
if(mNumber == 6){
mMessage = "正解 ボタン「0」で開始";
sInput = 2;
}else if(mNumber &_GT; 6){
mMessage = "大きいよ";
}else{
mMessage = "小さいよ";
}
sMessage = true;
</script>
</event>
</box>
<box>
<event name="onSelect">
<accelerators>
<key>7</key>
</accelerators>
<script>
sMessage = false;
if(mNumber == 7){
mMessage = "正解 ボタン「0」で開始";
sInput = 2;
}else if(mNumber &_GT; 7){
mMessage = "大きいよ";
}else{
mMessage = "小さいよ";
}
sMessage = true;
</script>
</event>
</box>
<box>
<event name="onSelect">
<accelerators>
<key>8</key>
</accelerators>
<script>
sMessage = false;
if(mNumber == 8){
mMessage = "正解 ボタン「0」で開始";
sInput = 2;
}else if(mNumber &_GT; 8){
mMessage = "大きいよ";
}else{
mMessage = "小さいよ";
}
sMessage = true;
</script>
</event>
</box>
<box>
<event name="onSelect">
<accelerators>
<key>9</key>
</accelerators>
<script>
sMessage = false;
if(mNumber == 9){
mMessage = "正解 ボタン「0」で開始";
sInput = 2;
}else if(mNumber &_GT; 9){
mMessage = "大きいよ";
}else{
mMessage = "小さいよ";
}
sMessage = true;
</script>
</event>
</box>
</display>
</transition>
<transition value="2"><!-- 正解したので初期化、0ボタン押したら開始します。 -->
<display>
<box>
<event name="onSelect">
<accelerators>
<key>0</key>
</accelerators>
<script>
mNumber = randRange(_msec(), 0, 9);<!-- 新しい数字 -->
sMessage = false;
mMessage = "0から9の数字をあてよう。";
sMessage = true;
sInput = 1;
</script>
</event>
</box>
</display>
</transition>
</state>
</states>
</application>
</ujml>
コメント