プロフィール

YOTTI

Author:YOTTI
関東在住のエンジニアの卵

カテゴリー

カレンダー

06 ≪│2008/07│≫ 08
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -

最近の記事

最近のコメント

ブログ内検索

リンク

このブログをリンクに追加する

Technorati

RSSフィード

Powered By FC2ブログ

Powered By FC2ブログ
ブログやるならFC2ブログ

アクセス解析

ブロとも申請フォーム

この人とブロともになる

Orfeon Blog
読んだ本の要約、感想など。 他にも日々思ったことをつれづれと書き連ねます。
NOT 30


1ヶ月間ブログ未更新だと表示される広告を消す為にFlexの勉強も兼ねて2時間で作ったプログラム。

「遊び方」
だいぶ前に流行っていた(?)ノットハンドレッドと同じルールのゲームで、 30個ある石をプレイヤとコンピュータが、予め決めた範囲内の数で交互に取ってゆき、最後の1個を取った方が負けというシンプルなルールです。
最大取得数と先攻、後攻を選択して、開始を押すとゲームがスタートします。 右下の方から石を選んでクリックすると石を取得できます。プレイヤが取得した後はコンピュータが石を取得します。プレイヤが取得した石は緑色で、コンピュータが取得した石は灰色で表示されます。 交互に石を取ってゆき、最後の左上の1個を取る羽目になった方が負けとなります。

「実装」
ゲームといいつつ、コンピュータは常に必勝パターンで石を取得してくるので、ゲームの必勝パターンを見破らないと勝てません。元ネタは確か東大大学院の院試問題だったと思いますが、プログラムにしてわずか1行で実装できるとてもシンプルなパターンです。 何度かゲームをしてよーくコンピュータの石の取り方を見ていると必勝パターンは見えてくると思います。
今回、時間がかかったのは、内容が単純なコーディングよりもUI仕様設計の方でした。お互い取った石をわかり易くUIで表現するにはどうしたらいいか少し工夫する必要があったからです。 今回は全体の石の数を30個としていますが、ここはプレイヤが自由に設定できるようにもできるものの、面倒なので30個で決め打ちに。1回の最大取得数を同様に2〜8個の範囲内で決め打ち。この数字には特に意味はないです。
今回は、Flexのmxmlによる実装を行ったのですが、やはりUIの設計はFlexを使うとかなり楽にできてしまいます。日本でのFlex Builder3の発売が待ち遠しいです。
  • このエントリーを含むはてなブックマーク
  • 遺伝的アルゴリズムを用いた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の謎を解く遺伝的アルゴリズムの基礎―GAの謎を解く
    伊庭 斉志

    オーム社 1994-09
    売り上げランキング : 215402

    Amazonで詳しく見る
    by G-Tools
    ブックオフで100円で売っていたのでとりあえず買って読んでみた本なのですが、GAの基本的な最適化問題への適用方法が簡略な数式で説明されているため、GAの概略を知る意味で役立ちました。

    進化論的計算手法 (知の科学)進化論的計算手法 (知の科学)
    伊庭 斉志 人工知能学会 JSAI=

    オーム社 2005-01
    売り上げランキング : 169621

    Amazonで詳しく見る
    by G-Tools
    巡回セールスマン問題の具体的な解法はこの本を参考にしたのですが、こちらの本はGAの勉強のためというよりは、科学読み物的な感じで読んだ本で、遺伝的プログラミングが音楽情報処理に用いられる例や、蟻の協調性に注目した最適化問題の解法などが紹介されていてとても面白いです。各手法の説明では数式がほとんど用いられておらず、あっても簡単な式なので、手軽に幅広く進化論的な手法の応用例について知るには良い本だと思います。
  • このエントリーを含むはてなブックマーク
  • 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ゲームプログラミングブックActionScript 3.0ゲームプログラミングブック
    布留川 英一

    毎日コミュニケーションズ 2006-11
    売り上げランキング : 77548

    Amazonで詳しく見る
    by G-Tools
    ActionScript3.0のリファレンスガイドはAdobeのサイトに載っているので、Flashプログラミングについてある程度知識のある方には必要ないかもしれませんが、この本が数少ないActionScript3.0参考書であることと、開発環境のセッティングに始まり、ゲームを作る際に必要な基本的な機能についてソースコードとセットで広くおさえられているので、とりあえずFlashで何かゲームを作ってみたい入門者の方にはおおまかな言語の概容をつかむ上でも重宝すると思います。 ただし言語の仕組みなどの内容には突っ込んでいないので、プログラミング初心者の方は言語的に似ているJavaなどをあわせて勉強するとよいかもしれません。
    リバーシのアルゴリズムリバーシのアルゴリズム
    Seal Software

    工学社 2003-06
    売り上げランキング : 133421

    Amazonで詳しく見る
    by G-Tools
    リバーシを強くするために評価関数の仕組みについて知りたくて読んでみました。自分は評価関数の箇所しかあまり読んでいないのですが、探索アルゴリズムから評価関数、実装設計まで、幅広く扱っていて、コード付で解説されているので仕組みがとても理解し易くて役立ちました。リバーシに限らず、ゲーム探索の勉強を始めるにはうってつけの本のように思います(ただ自分の場合、リバーシの基盤となるボード構成で違っていた部分が多かったのでコード自体は使えませんでしたが…)。ちなみにこの本の著者は(執筆当時)現役の大学生だというからオドロキです。
  • このエントリーを含むはてなブックマーク
  • 暗算トレーニング(JavaScript)

    脳トレブームにちょっと乗って暗算ゲームを作ってみました。たまたまテレビで暗算大会があって、画面に次々と数字を出てくる装置を見て、JavaScriptで作れるかな〜と思ったのがきっかけです。 でもこういうのはFlashで作ったほうが見栄えが良くなりそうなので、今度Flash作成ソフトを買うことができたら勉強がてらにそっちでも作ってみようかと思います。

    実際、ネット上で見かける暗算物はFlashが多かったのですが(しかも有料ソフトだったり)、基本的には入力をキーボードで打ち込む形式で、マウスとキーボードの手の移動がめんどくさいのでブログパーツということもあって、気軽にマウスでボタン入力できるようにしました。

    使い方ですが、"START"ボタンを押して画面に次々と出てくる数字を足し合わせたものを入力して"Check"ボタンで確かめます。 答えの入力は簡易電卓の要領でマウスで数字をクリックして入力してください。"C"ボタンは入力クリアです。 最初はランク0からスタートしていって徐々に難しい問題を解いていきます。 現在の自分のランクの問題を3つ連続でクリアすると次のランクにレベルアップします。一つクリアすると自動的に次の問題に移るので途中で"START"ボタンは押さないでください(押すとまた3つの最初からになってしまいます)。クリアすると出てくる上の"+"マークは3つ中何個クリアしたかを示しています。
    "START"ボタンの隣のフォームでは自分のランクまでの問題レベルを自由に選べます。 自分のランクはクッキーに保存され、パソコンの電源を切っても残ります。 このランクはあくまでプレーした本人のものなので、同じブログにあるゲームでも人によってランクは異なります。 (クッキーを消すか60日間ゲームをやらないとこのランクは0に戻ってしまいます)
    また、コンピュータの計算負荷が大きいとテンポ良く表示されない時もありますのでご理解の程よろしくお願いします。

    ちょっと回りくどいシステムになっていますが、なるべくやればやるほど上達できるようにといろいろ考えてみた結果こうなりました。自分でデバックしながらやってみた主観なのですが毎日やり続ければ結構暗算が速くなりそうです。 レベルはとりあえず10まで用意しましたが、随時不定期に追加していく予定です。(といっても作者もまだまだそこまで到達できそうにありません…)。入力ボタンに引き算があるように将来的には足し算だけでなく引き算もできるようにしたいと思います。

    ちょっとした工夫があればいろいろとこの手の脳トレ系は面白いものが作れそうなので、DSのゲームとかを参考にいろいろ作っていきたいと思います(修論が順調にいけばの話ですが…)。
    ブログパーツとして利用されたい方は下のソースを所定の場所に貼り付けてください。

    「iframe用」


    「divタグ用」
    上のでうまく表示されなかったらこちらを使ってください。
    逆に、こちらはfc2ブログの共有プラグインで公開している方のソースなので、
    fc2ブログの共有プラグインでうまく表示されなかった人は上のものを貼り付けてみてください。


    開発後記

    テーマ:自作ゲーム - ジャンル:ゲーム

  • このエントリーを含むはてなブックマーク
  • ライフゲーム(JavaScript)
    なんとなくJavaScriptでライフゲームを作りたくなったので作ってみました。
    ライフゲームについての詳しくはウィキペディアにて。

    「使い方」
    画面上で左クリックでセルを打ち込むことができます。 もう一度クリックすると消せます。
    動いている途中でも同様の操作が可能です。
    RANDOMボタンを押すと画面上にランダムにセルを打て、CLEARボタンで全てのセルを消せます。
    STARTボタンで動作を開始できて、動いている途中なら停止するSTOPボタンになります。
    一番右のフォームは動作の速さを設定するもので、1が一番遅く、4が一番速くなっています。
    でも速くなるかは使っているコンピュータのスペックによるので速くならなかったり、フリーズすることもありうるのであまり無理はしないほうがいいかもしれません。
    ちなみにブラウザはIE6よりはFirefox2.0の方が結構速いようです。

    同じのをC++で書いたことがあったのですが、そっちなら36×36マスでも全然速いのに、JavaScriptだと16×16なのにだいぶ遅くなってしまいました。こういうものはJavaAppletとかで作った方がよさそうです。

    テーマ:自作ゲーム - ジャンル:ゲーム

  • このエントリーを含むはてなブックマーク