Orfeon Blog
読んだ本の要約、感想など。 他にも日々思ったことをつれづれと書き連ねます。
算数力トレーナー
次々と出てくる算数問題を解いて算数力を鍛えるブログパーツです。
「遊び方」
「START」ボタンを押すとゲームを開始します。ゲームを開始すると算数問題が出題されます。出題された問題の回答を下の3つのボタンから選択してクリックしていきます。制限時間内に正答すると次の問題が出題されます。制限時間は画面右上の灰色のバーで表され徐々に短くなるバーが消える前に回答します。出題される問題は全10問で、10問全て正答するとクリアとなります。
問題の難易度は下のLv.から選択できます。難易度はユーザのランク(左上に表示)まで選択できます。ユーザのランクと同じ難易度のゲームをクリアするとランクが上がります(最初はランク0からスタート)。
ユーザのこれまでの成績は左下の「成績」ボタンをクリックすることで確認できます。成績画面ではこれまでの難易度ごとのクリアに要した最短時間と1秒以内に正答できた問題数(Coolの数)を確認できます。また正答時に音を鳴らすかどうかも成績画面の右下のボタンをクリックすることで設定できます。「音ON」が正答時に音を鳴らし、「音OFF」が音を鳴らさない設定になります。
「ブログパーツの貼り付け方」
ブログパーツとして利用されたい方は下のHTMLをコピーしてプラグインエリアやフリーエリアに貼り付けてください。FC2ブログの方であれば「共有プラグイン」から簡単にダウンロードできます。楽天ブログやYahoo!ブログ、はてなDiary、gooブログなどの外部ブログパーツの利用を禁止しているブログサービス以外のメジャーなブログサービスならおおよそ動くかと思います。ブログ以外のホームページなどでも利用できます。
もし上のHTMLを貼り付けても動かなかった場合はこちらのHTMLを貼り付けてみてください。
17
NOT 30
1ヶ月間ブログ未更新だと表示される広告を消す為にFlexの勉強も兼ねて2時間で作ったプログラム。
「遊び方」
だいぶ前に流行っていた(?)ノットハンドレッドと同じルールのゲームで、 30個ある石をプレイヤとコンピュータが、予め決めた範囲内の数で交互に取ってゆき、最後の1個を取った方が負けというシンプルなルールです。
最大取得数と先攻、後攻を選択して、開始を押すとゲームがスタートします。 右下の方から石を選んでクリックすると石を取得できます。プレイヤが取得した後はコンピュータが石を取得します。プレイヤが取得した石は緑色で、コンピュータが取得した石は灰色で表示されます。 交互に石を取ってゆき、最後の左上の1個を取る羽目になった方が負けとなります。
「実装」
ゲームといいつつ、コンピュータは常に必勝パターンで石を取得してくるので、ゲームの必勝パターンを見破らないと勝てません。元ネタは確か東大大学院の院試問題だったと思いますが、プログラムにしてわずか1行で実装できるとてもシンプルなパターンです。 何度かゲームをしてよーくコンピュータの石の取り方を見ていると必勝パターンは見えてくると思います。
今回、時間がかかったのは、内容が単純なコーディングよりもUI仕様設計の方でした。お互い取った石をわかり易くUIで表現するにはどうしたらいいか少し工夫する必要があったからです。 今回は全体の石の数を30個としていますが、ここはプレイヤが自由に設定できるようにもできるものの、面倒なので30個で決め打ちに。1回の最大取得数を同様に2~8個の範囲内で決め打ち。この数字には特に意味はないです。
今回は、Flexのmxmlによる実装を行ったのですが、やはりUIの設計はFlexを使うとかなり楽にできてしまいます。日本でのFlex Builder3の発売が待ち遠しいです。
01
遺伝的アルゴリズムを用いたTSPデモ
大学院時代に授業の課題で作った遺伝的アルゴリズムを使った巡回セールスマン問題のデモプログラム(当時はVisual C++で実装)を、ActionScript3.0で作ってみました。
ちなみに巡回セールスマン問題とは、地図上に配置された何箇所かの町があるとき、全ての町をちょうど1回ずつ経由してもとに戻る閉路のうち長さが最小のものを求める問題です。 遺伝アルゴリズムは生命の進化の仕組みを最適化問題に応用したもので、興味のある方は詳しくはwikipediaを参照ください↓
・巡回セールスマン問題
・遺伝的アルゴリズム
「使い方」
まず緑の画面に、町にあたる点を3箇所以上、左クリックして打ち込みます。各パラメータの設定を下のコントロールボックスで行います(各パラメータの意味は下記参照)。点を打ち込んでから「開始」を押すと、パラメータで設定した世代数に達するまでプログラムが走ります。停止したい場合は「開始」ボタンを押した後の「停止」ボタンを押してください。停止した状態からそのまま続けたい時は「継続」を押してください。ただし継続する場合は個体数のパラメータ変更はできません。町の位置を残したまま遺伝子コードだけ初期化したい場合は「リセット」を、町の位置から全て初期化したい場合は「クリア」を押してください。
・パラメータ
個体数: 遺伝子の総数で、多いほど探索能力が向上しますがその分計算時間がかかります。
世代数: この世代に達するまでプログラムは動き続けます。
変異率: この値が大きいと探索に広がりが出て局地解に陥りにくくなる反面、解が収束しづらくなります。
「仕様」
基本的にはGAを基本どおりにTSPに適用しただけで、遺伝子交配方式は2点交差を用いています。ただ次世代に残す遺伝子の選択方式が少し偏っていて、2位の遺伝子と1位の遺伝子で交配。3位と1位、2位。4位と1位、2位、3位…という感じで選択しています。ルーレット方式、ランキング方式、トーナメント方式だとなかなか収束しなかったのでこの方式を用いてみました。突然変異では変異率で選ばれた遺伝子の任意の2点を入れ替える操作を行っております。また、普通に入れ替えるだけでなく、突然変異が起きたときは半々の確率で任意の2点で切り離した経路を逆にしてつなげる"逆位"を行っています。これを用いることで結構収束が早まったように思います。
「実装」
前回C++で組んだプログラムと速度を比べたのですが、C++の方が5倍以上速いようでした。 あと、今回ActionScriptに移植する際、コアの部分は結構楽にできたのですが、自作でコントロールボックスを作った際などで制御が少し込み入って手間取ってしまいました。今回もガリガリ書いたコードをFlex2 SDKでコンパイルして作ったのですが、せっかくFlash CS3環境があるのでインタフェース実装の手間を考えるとそろそろそちらにも慣れ親しむ時なのかもしれません。mxmlについてももっと勉強したいと思いました。
「参考図書」
今回のプログラムのコアの部分は大学院時代に宿題として作ったものをベースにしているのですが、今見てみると当時書いたプログラムはかなり読みにくいものだったので、当時読んでいた以下の本を読み返しながらゼロから作り直しました。といっても自分は遺伝的アルゴリズムが専門というわけではないので、ここで紹介する本も、専門書というよりは、かなり入門書的な色合いが強い本になっています。
![]() | 遺伝的アルゴリズムの基礎―GAの謎を解く 伊庭 斉志 オーム社 1994-09 売り上げランキング : 215402 Amazonで詳しく見る by G-Tools |
![]() | 進化論的計算手法 (知の科学) 伊庭 斉志 人工知能学会 JSAI= オーム社 2005-01 売り上げランキング : 169621 Amazonで詳しく見る by G-Tools |
25
Flashリバーシ
「遊び方」
"黒"、"白"ボタンを押すとゲームが開始します。黒が先行で白が後攻になっています。コンピュータのレベルは0~2まであって、0が簡単、1が普通、2が難しい、となっています。遊びたいレベルの数字のLvボタンを押して"黒"、"白"ボタンを押してゲームを開始すると難易度が切り替わります。Lvボタンを押すだけでは難易度は切り替わらないので要注意です。
上の"成績"ボタンを押すと今までのコンピュータとの対戦成績を見ることができます。記録に残るのは、各レベルの黒と白ごとの、勝ち数、負け数、勝ったときの最大石差、勝率、となっています。右下の"消す"ボタンを押すと記録を消すことができます(一度消すと記録は元に戻らないので要注意です)。この対戦記録はあくまでプレイした人のコンピュータに残る記録なので、ブログを見ている複数の人で記録を共有することはできません。
あと、プレイヤーが石を打てるところが無い場合は、コンピュータが勝手にプレイヤーを飛ばして、続けて打ってきます。逆にコンピュータが打てるところがないときはコンピュータは何もしないのでそのまま打ち続けてください。
「仕様」
プログラムはFlashのActionScript3.0で作っていて、Flash Player9以降でないと動作しません。動かない人はAdobeのサイトからFlash Player最新バージョンにアップグレードできます(もちろん無料です)。
今回のFlash版は前回のJavaScript版に比べると難易度が高くなりました。レベル0では5手先の自分の石数が最大になるように、レベル1は5手先の局面を簡単な評価テーブルを用いて一番有利になるように(前回のJavaScript版のレベル2に相当します)、レベル2では5手先の局面を、開放度、取得可能手数、確定石数、危険手数、を基に一番有利になるように、それぞれ手を打ちます。レベル2はさらに終局11手前から完全読みを行います。このレベル2はちょっと難しくてリバーシ経験者じゃないと楽しめないかもしれませんが、リバーシ上達を目指してたまにでも挑戦していただければ幸いです。
あと、対戦記録はPCのFlashの共有オブジェクトとして記憶されますが、共有オブジェクトのスペースがいっぱいになったり、ユーザが設定で共有オブジェクトへの書き込みを禁止していた場合などは記録はできないこともあります。
「ブログパーツの貼り付け方」
ブログパーツとして利用されたい方は下のHTMLをコピーしてプラグインエリアやフリーエリアに貼り付けてください。FC2ブログの方であれば「共有プラグイン」から簡単にダウンロードできます。「iframe」の利用を禁止している楽天とYahoo!ブログ以外のメジャーなブログサービスならおおよそ動くかと思います。ブログ以外のホームページなどでも利用できます。
もし上のHTMLを貼り付けても動かなかった場合はこちらのHTMLを貼り付けてみてください。
「参考図書」
今回は初めてのFlashプログラミングということと、もう少し強いリバーシプログラムを作ってみたいということで、以下の2図書を参考にしました。
![]() | ActionScript 3.0ゲームプログラミングブック 布留川 英一 毎日コミュニケーションズ 2006-11 売り上げランキング : 77548 Amazonで詳しく見る by G-Tools |
![]() | リバーシのアルゴリズム Seal Software 工学社 2003-06 売り上げランキング : 133421 Amazonで詳しく見る by G-Tools |
10
暗算トレーニング(JavaScript)
脳トレブームにちょっと乗って暗算ゲームを作ってみました。たまたまテレビで暗算大会があって、画面に次々と数字を出てくる装置を見て、JavaScriptで作れるかな~と思ったのがきっかけです。 でもこういうのはFlashで作ったほうが見栄えが良くなりそうなので、今度Flash作成ソフトを買うことができたら勉強がてらにそっちでも作ってみようかと思います。
実際、ネット上で見かける暗算物はFlashが多かったのですが(しかも有料ソフトだったり)、基本的には入力をキーボードで打ち込む形式で、マウスとキーボードの手の移動がめんどくさいのでブログパーツということもあって、気軽にマウスでボタン入力できるようにしました。
使い方ですが、"START"ボタンを押して画面に次々と出てくる数字を足し合わせたものを入力して"Check"ボタンで確かめます。 答えの入力は簡易電卓の要領でマウスで数字をクリックして入力してください。"C"ボタンは入力クリアです。 最初はランク0からスタートしていって徐々に難しい問題を解いていきます。 現在の自分のランクの問題を3つ連続でクリアすると次のランクにレベルアップします。一つクリアすると自動的に次の問題に移るので途中で"START"ボタンは押さないでください(押すとまた3つの最初からになってしまいます)。クリアすると出てくる上の"+"マークは3つ中何個クリアしたかを示しています。
"START"ボタンの隣のフォームでは自分のランクまでの問題レベルを自由に選べます。 自分のランクはクッキーに保存され、パソコンの電源を切っても残ります。 このランクはあくまでプレーした本人のものなので、同じブログにあるゲームでも人によってランクは異なります。 (クッキーを消すか60日間ゲームをやらないとこのランクは0に戻ってしまいます)
また、コンピュータの計算負荷が大きいとテンポ良く表示されない時もありますのでご理解の程よろしくお願いします。
ちょっと回りくどいシステムになっていますが、なるべくやればやるほど上達できるようにといろいろ考えてみた結果こうなりました。自分でデバックしながらやってみた主観なのですが毎日やり続ければ結構暗算が速くなりそうです。 レベルはとりあえず10まで用意しましたが、随時不定期に追加していく予定です。(といっても作者もまだまだそこまで到達できそうにありません…)。入力ボタンに引き算があるように将来的には足し算だけでなく引き算もできるようにしたいと思います。
ちょっとした工夫があればいろいろとこの手の脳トレ系は面白いものが作れそうなので、DSのゲームとかを参考にいろいろ作っていきたいと思います(修論が順調にいけばの話ですが…)。
ブログパーツとして利用されたい方は下のソースを所定の場所に貼り付けてください。
「iframe用」
「divタグ用」
上のでうまく表示されなかったらこちらを使ってください。
逆に、こちらはfc2ブログの共有プラグインで公開している方のソースなので、
fc2ブログの共有プラグインでうまく表示されなかった人は上のものを貼り付けてみてください。
開発後記
09