2009年06月16日
Dots and Boxesの中身っす
別のパズルの解の存在条件調べてるっす。
出題がテキトーでも大丈夫なのか調べておかないとっす。
具体的には係数行列のランクを見るっす。
手計算するのは面倒すぎなので、コンピュータにやってもらうっす。
まあ、せっかくなのでLSLで書いてみるっす。
修行っすね。
どうもぺんぎんっす( ◎v◎ )
Dots and Boxesのスクリプトについてっす。
stateの組み立てを簡単に書いておくっす。
default
{
state_entry()
{
フローティングテキストを消したりする;
}
touch_start(integer total_number)
{
盤面の初期化;
state 参加者待ち;
}
}
state 参加者待ち
{
touch_start(integer total_number)
{
// 2人目がなかなかtouchしない時のためにtimerとか・・・
// その他にもいろいろ処理してるっすけど、省略
if( 対局者2名がtouchした )
{
state 対局の準備;
}
}
timer()
{
すでにtouchした1人目の情報を初期化;
}
on_rez(integer start_param)
{
llResetScript();
}
}
state 対局の準備
{
state_entry()
{
手番を決定後、対局者情報をリンクメッセージで飛ばす;
state ドット選択;
}
on_rez(integer start_param)
{
llResetScript();
}
}
state ドット選択
{
state_entry()
{
どっちの手番なのかをSayしたり;
timerかけたり;
}
touch_start(integer total_number)
{
if(llDetectedKey(0) == 手番のプレイヤーのkey)
{
if(正しい2つのドットをtouchした)
{
state ライン引き;
}
else
{
いろいろやる;
}
}
}
timer()
{
// 放置とみなして・・・
llResetScript();
}
on_rez(integer start_param)
{
llResetScript();
}
}
state ライン引き
{
state_entry()
{
ラインを引く;
if(ボックス獲得しなかった)
{
手番を入れ替える;
}
if(終局した)
{
結果をSay;
llResetScript();
}
state ドット選択;
}
on_rez(integer start_param)
{
llResetScript();
}
}
state ドット選択で微妙な点っす。
if(llDetectedKey(0) == 手番のプレイヤーのkey)
としてるっすけど、コレ、妨害にも使えちゃうっすね。
連打してれば妨害可能っす。
でも、小学生がやるようなゲームを妨害するとかいう、
そんな心の狭い人はいない、という考えでこのカタチっす。
あとはstate 対局の準備は関数で良いんじゃない?とかっすね。
これはstate ライン引きにも言えるっすね。
ここの部分、気持ち悪さを感じたってだけで、state分離したっす。
必要な変数が取得できたあとに、別のtouchがあると
変数の中身が上書きされたりしないかなぁ・・・とか心配してるっす。
いや、きっちりフラグ管理すれば大丈夫なのは分かってるっす。
でもモヤモヤしてる感じっす。
なので、いっそのことstate_entryしかないstateに移って、
touchの心配をしなくても良いようにしてみたっす。
・・・修行しますっす。
出題がテキトーでも大丈夫なのか調べておかないとっす。
具体的には係数行列のランクを見るっす。
手計算するのは面倒すぎなので、コンピュータにやってもらうっす。
まあ、せっかくなのでLSLで書いてみるっす。
修行っすね。
どうもぺんぎんっす( ◎v◎ )
Dots and Boxesのスクリプトについてっす。
stateの組み立てを簡単に書いておくっす。
default
{
state_entry()
{
フローティングテキストを消したりする;
}
touch_start(integer total_number)
{
盤面の初期化;
state 参加者待ち;
}
}
state 参加者待ち
{
touch_start(integer total_number)
{
// 2人目がなかなかtouchしない時のためにtimerとか・・・
// その他にもいろいろ処理してるっすけど、省略
if( 対局者2名がtouchした )
{
state 対局の準備;
}
}
timer()
{
すでにtouchした1人目の情報を初期化;
}
on_rez(integer start_param)
{
llResetScript();
}
}
state 対局の準備
{
state_entry()
{
手番を決定後、対局者情報をリンクメッセージで飛ばす;
state ドット選択;
}
on_rez(integer start_param)
{
llResetScript();
}
}
state ドット選択
{
state_entry()
{
どっちの手番なのかをSayしたり;
timerかけたり;
}
touch_start(integer total_number)
{
if(llDetectedKey(0) == 手番のプレイヤーのkey)
{
if(正しい2つのドットをtouchした)
{
state ライン引き;
}
else
{
いろいろやる;
}
}
}
timer()
{
// 放置とみなして・・・
llResetScript();
}
on_rez(integer start_param)
{
llResetScript();
}
}
state ライン引き
{
state_entry()
{
ラインを引く;
if(ボックス獲得しなかった)
{
手番を入れ替える;
}
if(終局した)
{
結果をSay;
llResetScript();
}
state ドット選択;
}
on_rez(integer start_param)
{
llResetScript();
}
}
state ドット選択で微妙な点っす。
if(llDetectedKey(0) == 手番のプレイヤーのkey)
としてるっすけど、コレ、妨害にも使えちゃうっすね。
連打してれば妨害可能っす。
でも、小学生がやるようなゲームを妨害するとかいう、
そんな心の狭い人はいない、という考えでこのカタチっす。
あとはstate 対局の準備は関数で良いんじゃない?とかっすね。
これはstate ライン引きにも言えるっすね。
ここの部分、気持ち悪さを感じたってだけで、state分離したっす。
必要な変数が取得できたあとに、別のtouchがあると
変数の中身が上書きされたりしないかなぁ・・・とか心配してるっす。
いや、きっちりフラグ管理すれば大丈夫なのは分かってるっす。
でもモヤモヤしてる感じっす。
なので、いっそのことstate_entryしかないstateに移って、
touchの心配をしなくても良いようにしてみたっす。
・・・修行しますっす。
Posted by ぺんぎん at 21:54│Comments(1)
│裏話
この記事へのトラックバック
UMLという実社会でソフトウエア製品の設計を行うときに使われるチャートがあります。このUMLというのは、いまチャートと言ってしまいましたが、実はUnified Modeling Languageの略で、日本語で...
ステートチャート図【明日できることは今日しない】at 2009年06月17日 15:07
この記事へのコメント
ええと、わたしのページへのコメントの返信をこちらにw。
ペンギンさんもご指摘のとおり、「対局の準備」ステートは、単に通過するだけのステートなので、これは設計上はステートになりません。
ですが、じゃあ、関数にしてしまえばいいかというと、そんなに単純なものではなくて、ここで、実装上の制約というものが出てくるわけです。
LSLには、かなり怪しげな点も含まれていますし、設計のとおりに実装すれば良いかといわれると、「必ずしもそうではない」とわたしは思っています。
この「対局の準備」ステートに関しては、まさにぺんぎんさんのおっしゃるとおりに、LSL実装上の問題として、実装担当者の権限で判断をしてかまわない部分だと思います。
そう考えると、とっても実践的な教材になりますです。はい。
では
ペンギンさんもご指摘のとおり、「対局の準備」ステートは、単に通過するだけのステートなので、これは設計上はステートになりません。
ですが、じゃあ、関数にしてしまえばいいかというと、そんなに単純なものではなくて、ここで、実装上の制約というものが出てくるわけです。
LSLには、かなり怪しげな点も含まれていますし、設計のとおりに実装すれば良いかといわれると、「必ずしもそうではない」とわたしは思っています。
この「対局の準備」ステートに関しては、まさにぺんぎんさんのおっしゃるとおりに、LSL実装上の問題として、実装担当者の権限で判断をしてかまわない部分だと思います。
そう考えると、とっても実践的な教材になりますです。はい。
では
Posted by midoriPaulse at 2009年06月18日 09:02