2013年12月23日月曜日

コード分析結果表示ツールを作ってみた

 この前紹介したCode Metrics PowerTool 10.0が出力するXMLファイルを解析して分かりやすく表示してくれるツールを作ってみました。こんな感じでXMLファイルの内容を表示します。



ダウンロードは以下から

Metrics Viewer (約20KB)


2013年12月19日木曜日

Systema 0.7.2 更新

ゲームの不具合を修正しました。

更新内容
GUI  ver 0.7.2:
  ・牌譜の書式の一部が東風荘のものに沿っていなかったので修正

AI ver 1.3
  ・無駄な処理を省き、思考時間を少しだけ短縮

2013年11月26日火曜日

2013年11月16日土曜日

Visual Studio 2010 Professional でコード分析を行う

大きなソフトウェアを開発する際にはコードの品質が重要になってくる。とりあえず動くからと言って汚いコードを書き続けていると、後々修正・変更する際に多大なツケを払う羽目になる。しかし、大量のコードをいちいちチェックするのは手間がかかる。特にチームで開発するときは他人のコードを読まないといけないので大変である。
 Visual Studioにはコードの品質を手軽にチェックできるコード分析機能が搭載されているらしいので、さっそく使ってみようとメニューを探してみたのだが見つからない。よく調べてみると、コード分析機能はVisual Studio 2010ではPremium以上のエディションでしか使えないようだ。(Professionalで使えてもいいのに…)
 そこで、別の方法を探ってみたところ、Visual Studio Code Metrics PowerTool を使うと同様の分析をProfessionalでも行うことができるというので早速、使ってみた。


2013年9月9日月曜日

Systema 0.7.1 更新

ご無沙汰してます。
リアルで色々なイベントがあったのですっかりブログを放置してました。

不具合をいくつか修正しました。

・鳴き選択時、牌にカーソルを合わせるとまれにクラッシュするバグを修正
・残りツモ4枚以下での立直をできないように変更
・河底牌を暗槓できないように修正


そういえば、自作AI追加機能をサポート予定とか言ってましたが、今はプロセス通信規約を調整している段階です。実はAIは他のプレイヤーのツモ切りを感知できなかったり、見逃しを選択できなかったりするので。その辺を何とかしようとしています。


2013年5月3日金曜日

Systema ver 0.7 更新

Systemaをご利用いただき、ありがとうございます。こんなソフトですが、遊んでくださっている方がいて嬉しい限りです。
いくつかの機能が追加されました。

2013年4月27日土曜日

TopCoder SRM 577 Div2

TopCoderとは、TopCoder社の主催するオンライン参加型のプログラミングコンテストである。
その中の競技形式のひとつであるSRMは、与えられた問題に対して正確な答えを出力するプログラムを書くスピードを競うというものである。問題は単純なものが多いが、データ数が多かったり処理時間に制限があったりするので、いかに最適なアルゴリズムを考え、素早く実装できるかが勝負のカギとなる。


今回、久々にSRMに参加したのでレポートを書いてみたり。


2013年4月25日木曜日

Systema ver 0.6.1 更新

公開後、いくつかバグのご報告を頂きました。ご協力を頂いた方々に感謝を申し上げます。
以下の項目について修正いたしました。


ゲーム本体 ver 0.6.1
・役なし状態で和了ボタンが押せるバグ(押すとフリーズ)を修正
・南場にもかかわらず、南が役として認められなかったバグを修正
・ポンの直後にカンができるバグを修正


AIプログラム ver 1.1
・自風牌を正しく認識していなかったバグを修正。意味不明な喰い仕掛けをしなくなった。

2013年4月20日土曜日

とりあえず公開

あらかたバグを修正し、とりあえず麻雀できるレベルにはなったので公開します。
忘れていましたが、ソフト名はSystema(システマ)です。システム+麻雀みたいな。

ゲーム本体:ver 0.6
AIプログラム:ver1.0
https://sites.google.com/site/systemanopeji/


今は東風と半荘の対局ができるだけですが、少しずつ機能を加えていきたいと思っております。ご要望や不具合がございましたら遠慮なくコメントやtwitter(@takesho0214)までご連絡ください。


アイコン

ソフトウェアのアイコンを作ってみた。
「麻雀」「コンピュータ」「強そう」という印象が一目で与えられるものを目指したかったのだが…

2013年4月10日水曜日

鳴き対象牌強調表示の実装

前々から、「どの牌が鳴き対象なのか分かりづらい」と身内に不評だったので実装。
黄色の枠で対象牌が強調される。背景と混ざって見づらいので色は変えるかもしれない(というかそもそも背景の色が明るすぎる?)


これでかなり遊びやすくなったとの評価。ユーザにとって使いやすいインターフェース・動作になるように工夫することがソフト開発では重要だと認識させられる。

2013年4月8日月曜日

押し引き判断実装完了

最終順位予測ルーチンが完成したので、それを利用して押し引き判断を実装した。
前までのAIはリーチをかければすぐ降りてくれていたが、今回のは手がいい時は粘り強く押してくるようになった。それでいて、点数を多く持っているときは手が良くてもそう簡単に振り込んではくれない。総合的に見てかなり手強くなった印象がある。

現在はソフト公開に向けて説明書や免責事項などのドキュメントを作成している。ソフトのロゴとアイコンも欲しいのだがどうしよう…。その方面のセンスはほとんどないので困ったものである。

2013年3月25日月曜日

最終順位予測を用いた押し引き判断

現在開発している麻雀AIには、最終順位予測を用いた押し引き判断ルーチンを実装する予定である。麻雀は基本的に順位を目指すものであるから、押し引きも局単位の収入期待値ではなく最終順位によって評価されるべきだ、という発想である。
このルーチンを実現できれば、より正確な押し引きを行う打ち手になると思われる。また、各順位に重み付けを行うことで、トップ重視、平均順位重視、ラス回避重視など豊富な種類の打ち手を簡単に作れることが期待できる。さらに、このルーチンを高速化し打牌選択ルーチンに適用すれば、ラス目の時は高い手を作る、トップ目のときは速い手で流す、といった最終順位を考慮した手作りを行う打ち手を作ることができる…かもしれない。

このルーチンを実現するためには、「今の手からどの点数をどのくらいの確率であがれるか」という情報が必要なので、今はそれを木構造で表現するアルゴリズムを実装中である。

222567m2256p56s西北 から構築される木



詳しい中身については、もう少し考えをまとめてから。

2013年3月21日木曜日

麻雀AI完成まであと少し

現在、麻雀AIは

・ 局収入期待値に基づく打牌(立直判断)
・ 局収入期待値に基づく鳴き判断
・ 安全牌探索ルーチン

までできている。処理を高速化し、探索範囲を広くできたおかげで、向聴戻しや浮き牌残しを行ってできる限り良形に持っていく打ち方をしてくれるようになった。また、特に意図したわけではないが積極的に後付けを行うという特徴もある。

あとは押し引き判断ルーチンさえ作ればゲーム公開の目処が立つ。
(今のAIは、敵のリーチに対してテンパイなら全押し、それ以外全オリ)


2013年3月16日土曜日

ツモ切り表示実装

ツモ切り表示を実装してみた。
ツモ切られた牌は紫の枠で囲まれる。

あとやることは

・ 途中流局の実装(四槓流れ、四風連打、九種九牌)
・ 槍槓の実装
・ 複数の槓のパターン選択
・ 鳴き対象牌のハイライト表示

メモリの使用量も調査したところ、ゲーム本体とAI4体あわせて200MB位だった。
メモリリークもなさそうだったし、多分大丈夫だろう…

2013年3月14日木曜日

麻雀ゲーム画面

開発中の麻雀ゲームについて。
現在のゲーム画面はこんな感じである。























牌画は雀のお宿様の素材を使用させて頂いてます。

なんだかファミコンみたいで味気ない気もするが、当分はこれでいこうと思っている。ルールも実装済みで、クイタンあり赤ナシの東風と半荘が遊べる。途中流局は未実装。AI部分は独立した実行ファイルであり、親プロセスと標準入出力を用いて通信し、動かしている。将来は通信規約を公開して、外部の開発者がAIを自由に追加できるようにするつもりである。

今後やること

・ ツモ切りの表示
・ 鳴き対象牌のハイライト表示
・ 途中流局実装

公開は、リソース関係のバグが無いか念入りにテストしてから行いたい。


2013年3月13日水曜日

麻雀AIの方針

開発中の麻雀AIの方針についてメモしておく。
既に7割方出来ているのだが、基本的には以下のような方針で開発する。


データと計算に基づく論理的な打牌
「流れ」などの俗に言うオカルト的な考えを排除し、計算による論理的な打牌を行うAIを目指す。厳密な計算が不可能な部分は、モンテカルロ・シミュレーションで補う。


出来る限り非ルールベース
もし○○の状況ならこうする、といったルールを並べてAIをつくる方法をルールベースというのだが、出来るだけこの方法は採用しない。作り手の実力以上の強さになりにくいし、新しい発見もなさそうだからだ。第一かっこよくない。
可能な限り単一の評価値に従って動くAIにしたい。


データは自己対局で取る
押し引きの判断などに、他家の平均和了素点などのデータを使用することを考えている。そのデータの源としてオンライン麻雀の天鳳が有力だがお金がかかるし解析にあまり時間を取られたくないというのが実情である。なので、AI同士の対局でデータを収集することにする。強い人の打ち方とAIの探索による打ち方にそこまで差がなさそうなので、データもそんなに変わらないだろうというのが理由である。


ゲーム本体のGUIについても後でメモしておこう。

2013年3月12日火曜日

ブログの目的

ただブログを開設しただけでは、3日坊主になること必至である。
従って更新意欲を出来る限り持続させるために、ブログを書く目的をここに書くことにする。

・ 自分の考えをメモすることで整理する
・ 閲覧者にフィードバックをもらって参考にする
・ 文章を書くことに慣れる
・ 暇をつぶす

書く内容は主に開発中の麻雀ゲームのことです。
それ以外にも、プログラミング関係のことや、日常的なものについても書いていくつもりです。