2008/11/27

麻雀シミュレータを作ってみる(1) このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

目的

「統計データに基づいた知識を得て麻雀生活に役立てたい」的な。

麻雀の楽しいところは、運の要素が勝敗に少なからず絡んでくるため
素人とベテランが混じっても圧倒的大差にならずにいい勝負ができたりする所かなと思っています。

それでも、長期的には運の要素が相殺されるため、確率をより正しく推定できる人が強かったりします。

そこでひとつ、
こんな方法ではどんな勝率になるのかとか、
こういうときはこうなる可能性が高いとか、
そういった統計データに基づいた知識を見つけていこうかなといったところです。

例えば、中盤以降は全探索して得失点の期待値が最大になる捨て牌が計算できちゃうんじゃないかとか、
そのような打ち方を勉強して自分の推定精度を改善するとか、いろんなことができそうな気がして楽しみです。



先人の例

かなり研究されてるみたいです。商用ゲームの AI とか、もっと進んでいたりするかもです。





とりあえず実装

まずはゲームの進行をシミュレートする基本的な部分。

今日の実装は


  • 実装の手間を考えて Python で
  • ランダムに牌を切る SimpleAI が4人
  • 鳴きなし
  • ドラ、赤牌なし
  • リーチなし
  • 和了り判定なし
  • 得点計算なし


という、とりあえずみんなランダムに捨てていって流局というしょぼいものです。

いまのところコードは 130 行です。

↓序盤、プレイヤー「3」が中をツモって打3筒の図



=== Tumo 3 中
=== Da 3 ③
-- Board state --
Yama:
⑨⑥⑦九二七6③⑧七五7八3



⑤西南中③二⑧九⑦白白
三③67⑨四2七143九五⑦北北8
9發1白①6南二西⑥四5八⑨9三5
5一①8⑤三4八②東⑧四1⑤②④1

0 Hand: 二七①⑥⑦2346東白發發
1 Hand: 一四①④4799東東北中中
2 Hand: 一三六九②④⑨238南南發
3 Hand: 一五六六②⑧2578西西中

0 Kawa: ⑥八
1 Kawa: 北⑤
2 Kawa: 六④
3 Kawa: 五③





今後?


  • 和了り判定、向聴数計算
  • 見えている牌の情報を使ってなるべく早く和了る AI
  • 点数計算
  • 得点の期待値が最大になるような手を選ぶ AI
  • 他家も効率的な打ち手だと仮定したときの AI(確率分布の修正、攻め/ベタオリの行動決定)
  • ...など?


Cygwin のコンソールから

「二七①⑥⑦2346東白發發」

とか出てくると、ついニヤけてしまいます。

2008/11/13

Hello Renderer このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

Photorealistic 指向なレンダラを書いています。



HISTORY

まずは球。シェーダは法線を RGB にするもの。
しばらくは球プリミティブだけで行きます。
画像出力は、float RGBA をバイナリで書き出して、Imagemagick で png などに変換します。

convert -depth 32 -define quantum:format=floating-point -size ${W}x${H} -define quantum:scale=65536.0 -endian lsb RGBA:fb out.png


20080909

シーンファイルを JSON にして雪だるま的な物体にしてみる。
JSON ライブラリは YAJL を使用。
交差判定のアクセラレータはなし。総当たり。
20080918

phong shader 的なもの。点光源。局所照明。
20081006_0

光源を4つにしてみる。
20081006_1

影光線を追加。
20081007

反射を追加。左のでかい球が鏡面反射。
20081015

エリアライトを追加。ちょっとそれっぽくなった。
Light->Eye (LE) をどう描画すればいいか、よくわからん。
20081111



TODO

あとはこの辺りを実装して、何か動画でも作れたらおもしろいかなと。


  • Texture
  • Bump mapping
  • Image based lighting
  • Motion blur
  • Depth of field
  • Local coordinate system
  • Blinn shading
  • Path tracing
  • Triangle intersection
  • 別途 scene generator ... blender のプラグイン


blender ってオブジェクト同士の積、差を計算できたりするんでしょうか。

2008/10/16

bash で連番日付を作る one liner このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

日誌などをテキストファイルで管理する際、最初にこれでダダダーっと日付を生成します。

そして日々適切な日付のところに内容を書きこんでいきます。

ごく稀にしか使われないかもしれませんw



$ for i in `seq 100`; do date '+%Y/%m/%d (%a)' -d ${i}day; echo -e "\n\n\n"; done > a.txt




実行結果 (a.txt)


2008/10/18 (Sat)




2008/10/19 (Sun)




2008/10/20 (Mon)


:
:

2008/09/30

perlで直積 cross product with perl このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

ほかのモジュールを使わずに直積を書いてみました。



sub cross_product
{
my $r = [[]];
$r = [ map{ my $t=$_; map{ [$t, @$_] } @$r } @$_ ]
for reverse @_;
$r;
}

$result = cross_product(["+", "-"], ["A".."C"], [0..2]);

print join "\n", map { join "", @$_ } @$result;





実行結果



+A0
+A1
+A2
+B0
+B1
+B2
+C0
+C1
+C2
-A0
-A1
-A2
-B0
-B1
-B2
-C0
-C1
-C2




pythonなら



[ x+y+str(z) for x in ["+","-"]
for y in ["A", "B", "C"]
for z in range(0,2)]



内包表記、便利ですね。



参考

2008/08/06

Baba walkr (BETA) released このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

20080806_01



仮想散策ツール「Baba walkr (BETA)」をリリースしました。

Google maps の Street view 機能を API から使用することにより、ユーザーが何も操作しなくても視点が自動的に移動する仕組みになっております。

前々から少しずつ作ってたんですが、ちょうど Street view が日本の一部地域に対応したこともあり、良いタイミングなので公開します。

眠いので概要だけ書いて寝ます。


  • Google Maps API を使っています。:)

  • 隣接する地点のリストと通行カウンタに基づいて、一度通った所はなるべく通らないように動きます。

  • 画像のロードが遅いのが気になったので、何気にダブルバッファリングしています。

  • そのせいで滑らかな移動が犠牲になりましたが、モザイクが見えるよりはいいかなと。

  • マーカーのドラッグ&ドロップで好きな場所に飛べます。

  • TODO いろんなプリセットの場所を見れるようにする。NewYork walkr とか。Tokyo wal... おっと!

  • TODO Tokyo random walkr とかならセーフでしょうか。




Baba walkr (BETA)

2008/06/16

XNA メモ このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

SketchUp で作ったモデルを .X ファイルにエクスポートして XNA Framework 2.0 で表示させてみるところまでやってみました。


モデルを作って描画するまでのパイプライン


  1. 3D Rad の SketchUp 用プラグインでエクスポートする。
  2. テクスチャ形式、テクスチャサイズの修正(後述)
  3. 一応 DirectX Viewer で確認。
  4. あとは参考ページと同様に Content フォルダに .x を追加してテクスチャを別途フォルダにコピーして読み込みと描画のコードを書いて実行。


20080616_game

ほんとは鉄筋と鉄筋の間が黒じゃなくて透明になるはずなんだけど、なってないですね。これはよくわからん。手始めとしてはこんなもんでしょうか。



気づいたこと/気をつけること


  • SketchUp models into DirectX games
    では DirectX Viewer で読み込めなかった。(東京タワーで確認)
  • Tiff 形式のテクスチャは読めないらしい。png に保存しなおして .X ファイル内の .tif を .png に置換したらうまくいった
  • テクスチャのサイズは 2 のべき乗でないといけない


テクスチャをいじるあたりは自動で処理させたいんですが、IrfanView ではファイル名を変えずにリサイズと特定形式で保存というのができないみたいで無理でした。
ファイル名が変わっちゃうと .x ファイルに書いてあるファイル名も変えなきゃいけないんですね。sed でやればいいのか。

まだワークフローが固まったわけではないので、今は手動で我慢。



参考ページ

2008/05/23

ゲームが作りたくなってきたので下調べ このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

2,3年前にクレタク系のゲームを途中まで作っていたわけですが、またにわかに作りたくなってきました。

無料ツールを使った個人のゲーム製作環境も以前より充実してきているので、こんなのが使えそうだなというものをざっくり列挙してみます。


このへんを使っていこうかな!リスト


Visual C# 2008 Express Edition

以前途中まで書いたコードは C# だけど、Bullet が C++ だから C++ に移行しようかな...と考えていたら Bullet on C# を見つけたので C# で。XNA を使うと Direct3D を使う上での定型処理とかを書かなくていいっぽい。あと XBOX でもほぼそのまま動くとか。


Bullet for XNA Physics Library

物理シミュレーションライブラリ。段ボールが飛び散るといった効果に使いたいなと。


Collada

個人の 3D ゲーム開発において難所となるのが 3D モデルデータの扱いだと思います。モデルデータはどのツールで作るか、モデルのファイル形式はどうするか、それをどうやって描画するか、など。
以前は Direct3D の.X ファイルを Metasequoia で作って DirectX にある Mesh.FromFile で読み込んでいましたが、どうもこのパイプラインだとアニメーションが面倒らしく、ここはひとつオープンで共通化を目指していて XML な Collada に期待してみよう、という。


Skeletal Bone Animation and Skinning with Collada Models in XNA

これでさっくりアニメーション付きモデルが描画できたらいいなぁ。


Google SketchUp

Collada モデルが出力できるし、既にある膨大な建物モデルが使えそう。(著作権とか要調査)


Softimage Mod Tool

アニメーション付きのモデルはこれで作れるんじゃないかと期待。操作方法から覚える。


Google map

地図データをそのまま使いたいけど公開されていないのでマイマップを作って自分で道路に沿ってポリラインをひいていく。それを kml でエクスポートしてスクリプトとかで道路モデルを生成する。以前は地図サイトの画面キャプチャを Metasequoia にロードして、同様に道路に沿ってポリラインをひいていました。地図インフラが整ったことで作業がしやすくなりそう。(本当は道路のベクタデータまで公開してほしいんですけどね!!)





おもうところ

全体的に個人が無料で使えるツールやオープンな規格が充実しつつあります。いいことであります。

あと何気に Google のツールを使うことになりそうです。よろしくお願いいたします。

2008/04/14

Googleカレンダーの例文が良く出来ている このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

Googleカレンダーで予定を追加するときに出る例文って状況によって違うんですね。



日本版の場合

1日の場合「19:00に水族館で待ち合わせ」

2日以上の場合「北海道へツーリング」

「日」or「週」ビューで、1日内の特定時刻範囲を選択した場合「旅行の準備」



英語版の場合

1日の場合"7pm Dinner at Pancho's"

2日以上の場合"Visiting in NYC"

「日」or「週」ビューで、1日内の特定時刻範囲を選択した場合"Breakfast at Tiffany's"



感想

細かい所ですが作りこまれていて好感が持てます。

状況によって場合分けして、適切なメッセージを考える仕事は想像するだけで楽しそうです。


ここまでしたなら、欲を出してもうちょっと細かくしてもいいんじゃないかなと思ったり。

平日なら「退屈なミーティング」とか、深夜なら「お疲れ様デス」とか。(もはや予定の例文じゃないですが)

2008/03/13

仲間内でリアル会話しながらネット麻雀したい このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

日常の不満をブログに書くことで誰かが解決してくれるのを期待するシリーズ

本当は雀荘で打ちたいんだけど、そうはいっても仲間内でなかなか集まる時間もないので、
音声チャットで盛り上がりながらハンゲームやりたいなあ。



skype

と思ったですが、skypeしながらやればいいということですね。はい終了。


...でも別々にログインしたり面倒だし、やっぱしハンゲームにも音声チャットのオプションをつけてほしいなあ。

2008/03/04

携帯からの路線検索サービスを評価する このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

モビール検索

携帯から乗り換え検索をするときはヤフー路線検索を使うことが多かったんですが、Googleトランジットに変えてみました。

Y!からGに乗り換えて今のところ満足しているので、goo, livedoor, jordan などは評価しません。

以下、YとGを使ってみた感想です。



Yahoo路線検索に比してGoogleトランジットの方が優れていると思う仕様

1 検索結果の画面から出発時刻や駅名を変えられる

時刻の微調整をするには必須だと思うんですが、ヤフーの場合、これができないです。
Livedoor の路線検索にはあったかも。

できないのでブラウザで入力画面に戻ると、今までの検索条件が消えてしまい、もう一度駅名から入力し直しになります。
(携帯によっては検索条件が保持されたままなのかもしれませんが)


2 同一名称の複数駅に関する対応

入力した駅名に対して複数の駅候補がある場合、所要時間が最も短くなるような駅が選択され、とりあえずその結果が出ます。

例えば、「牛田」という駅は広島県と愛知県と東京都にあるらしいのですが、
Googleトランジットで「原宿→牛田」と検索すると「原宿→牛田(東京都)」の検索結果が出ます。

ヤフーですと、「原宿→牛田(広島県)」なのか「原宿→牛田(愛知県)」なのか「原宿→牛田(東京都)」なのかを選ぶ画面になります。
原宿にいる人が広島とか愛知に行く可能性は都内に行く可能性より低いわけですから、とりあえず近い所の結果を出しておけば大多数の人は画面遷移が1回少ない分快適なわけです。



Googleトランジットに比してYahoo路線検索の方が優れていると思う仕様

1 「検索」ボタンにショートカットキーが割り当てられている

ヤフーですと数字の「1」ボタンを押すと検索されますが、グーグルの方は単なるボタンなのでそこまでカーソルを持っていかないと検索できません。

これはググール残念。

検索条件を入力する部分へ移動するショートカットが無いのも残念です。
検索結果から検索条件を入力するとき、「4」で4番目の検索結果に飛んでから下にスクロールしないといけません。




部分計算結果の識別子を memorize する

ちょっとアレなセクション名ですが、

よく検索する場所の組は毎回入力したくないので、検索結果をブックマークするという意味です。
(今思いついたので今度からやります)

一度登録しておけば、次に使うときは、ブックマークからページを開いて、あとは時刻を変えて検索するだけです。

YahooもLivedoorもマイページでお気に入りの駅追加や履歴参照ができるようですが、(端末固有番号を使うにしても)ログインや駅選択の画面遷移が増えるので、ブックマーク方式の方がスマートかなと思います。



2008/3/13(Thu)追記 - もっと早く

ブックマークよりも、(i-modeで言う)「画面メモ」の方が手間が少ないことに気付きました。

1 特定駅間の検索結果の画面メモを開く(ローカルなのですぐに表示される)

2 スクロールして時刻を入力して検索ボタン押下(ネットに接続するので7秒くらいかかる)


「現在時刻で検索」というボタンがあって、検索結果にも表示されていればさらに早いですね。

さらにさらに、「現在時刻で検索」の結果でブックマークすれば、ブクマを開くだけで良いですね。
(METHOD=GETでよろしくお願いいたします)

さらにさらにさらに、常に現在時刻から±10分以内の時刻に対して事前に検索しておいて、
見たい時に見るだけのアプリor常時起動のウィジェット、なんてのがあると、やり過ぎですね:)

2008/02/07

いろんな施設の開館時間をすぐに知りたい このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

日常の不満をブログに書くことで誰かが解決してくれるのを期待するシリーズ

いきなり変なシリーズが始まりました。

1 自分が感じた日常の不便な点を書き記すことによつて、

2 暇人さんや、ネタ探し中の人にそれが伝わり、

3 ゆくゆくはこの不満が解決されるといいなぁ~

という期待が入ったなんとも都合の良い記事です。

「それもうあるって。おみゃーがが知らないだけ」というときはコメントなどでお知らせ頂ければと存じます。



いろんな施設の開館時間をすぐに知りたい

今回の不満な点はこれです。

休日の計画を練るときに、

「どこどこのショールームは何曜日が休みで、でも今月はこの日が休みで、何曜日は何時から何時まで開いていて、場所はどこで、どの駅からいくとよい」

という情報を探し、当該日の当該時間に自分が訪問できそうな場所を選ぶ作業を繰り返すのですが、

21世紀になった今でもこういう情報がサイトごとにばらばらなのが不満なのであります。


かといってデザイン的に統一するのも堅苦しいので、

RSS, iEPG みたいな「営業時間 XML スキーマ」みたいなのに沿ったメタ情報が各サイトにひっそりと用意されていれば良いと思うのです。

そんで、「Google Opening Hours (BETA)」「グーグル営業時間検索(ベータ)」的なものでそれらの情報をインデックス化して、
「今週の土曜日、どこどこ、何時くらいまで、雨なら行かない」などと自分の嗜好で検索、乗るべき電車の路線検索までして欲しいんです。

もしかして google カレンダーとかで出来ちゃうものなのかしら?



まとめ - 実現してほしいこと

1. 営業時間の統一的な表現方法が決まる

2. 各施設/店舗などが、自分とこの営業時間を統一フォーマットで表し、サイトで公開する

3. 場所、キーワード、ジャンル、営業時間で施設/店舗が検索でき、移動時間なども含めてプランをお勧めしてくれる



ある程度おすすめプランが出てくるようになったら、営業時間を入力する金銭的価値も出てくるので、あとは勝手に広がるような気がします。

2008/01/24

HaloScanのトラックバック機能だけを使う方法 このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

HaloScan にはもれなくコメント機能がついてくる

今日現在、Bloggerにはトラックバック機能がありません。
トラックバックを使うには外部サービスのHaloScanを使う方法が巷では知られています。

そのようにすると、トラックバックだけでなくコメントもHaloScanが提供するものを使うようになりますが、「コメント機能はBloggerのものがいい」という方もいるかもしれません。

トラックバックだけHaloScanが提供する仕組みを使う方法を紹介します。

あんましテンプレートを手作業で書き換えるというのはやりたくないんですけどね....。



HaloScanのトラックバック機能だけ使うには

1
HaloScan の automatic install で改変されたテンプレートを使っている場合、
テンプレートをBloggerのものに戻します。

2
Bloggerのテンプレート編集画面で、「<span class='post-icons'>」という文字列を検索します。
見つかった場所は、ブログに表示したときに「投稿者 ...... 場所 01:31」と表示されるあたりです。

3
以下のタグを、検索した span タグの直前に入れます。
ただし、[[あなたのHaloScanID]]にはあなたのHaloSanIDを入れます。

ここから<script type="text/javascript" src="http://www.haloscan.com/load/[[あなたのHaloScanID]]"> </script><span class="post-comment-link"><a class="comment-link" href="'" onclick="'"><script type="'text/javascript'">postCountTB('<data:post.id/>');</script></a></span>ここまで

以上で、記事の最後にある「投稿者 ...... 場所 01:31」の隣に「Trackback (1) 」などと表示されるようになります。

クロスドメインのHTTP GET このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

Dojoで簡単にクロスドメインAjaxを実現

[Dojo] JavaScriptのみでクロスドメインXMLHttpRequest


従来、クロスドメイン制限については以下のような回避策も考えられてきましたが、
どれも短所があって、イマイチ使いにくいところがありました。

・HTMLを設置しているドメインのサーバ上にプロキシCGI等を設置する
   →オープンプロキシ(誰でも利用できてしまう。掲示板の匿名投稿にも悪用可能)
・FLASHのクロスドメイン通信の機能を経由させる
   →JavaScriptからFLASHを呼び出す必要がある
・接続先ウェブサービス側の出力フォーマットに JavaScript を追加する
   →データでなくJavaScriptプログラムを返す。グローバル変数を書き換える。



サーバ側がJavaScript対応するのがベスト、プロキシCGIが次善策、Dojoはいいけどブラウザのクリック音が出る、といった感じでしょうか。
プロキシに関しては、アクセスできるリクエストURLをプロキシ側で制限すればいいのかな。

って、自分、1年以上遅れてますか。そうですか。


Firefox3のクロスサイトXMLHttpRequestの仕様

むこうのサーバ側が許可すれば、返ってきたレスポンスをブラウザがユーザーに渡す。というもの。
Firefox3のみ。

ふむふむ、こういう流れもあるんですね。(これは最近の記事ですね)