「多面子」開発日記 (抜粋)


2001/06/09 (土)

3nopageVectorの作者ホームページにはthecounter.comのカウンターを使っている。海外のサイトなのだが、無料でアクセス解析も付いたすぐれものだ。で、アクセス解析でリンク元をみていたら知らないアドレスがあった。それは「オンラインソフトの決定版」。ここではVectorなどで公開されているソフトからおすすめを紹介するサイトのようです。そこで、ありがたいことに「多面子」が紹介されました。うれしいですね。


2001/04/24 (火)

『ウィンドウズ・パワー』から「多面子」の収録を見送るというメールが来た。市販のゲームに酷似していて著作権抵触の問題となるかもしれないからだそうだ。市販のゲームって何なんだろう。編集部では実際にプレイしてみたのだろうか。プレイすればこのゲームのオリジナリティが分かると思うのだが。それともわたくしが知らないだけで、まったく同じルールのゲームが世の中に存在するのだろうか。


2001/04/06 (金)

先日パソコン雑誌『Win Do!』の編集者の方から「多面子」を収録させて欲しいっていうメールが来たので快く了承したのだが、今日は『ウィンドウズ パワー』に載せてもいいですかというメールが来た。もちろん快諾。仕事しながら片手間で作ったあんなショボいプログラムでも載せてくれるなんて、よっぽどネタが無いんだろうなと思う反面、うれしい気持ちもある。大作ゲームは作れないけど、細かいアイデアはいっぱいある。どんどん具現化していきたい。


2001/03/20 (火)

Vectorからメールが来ていて、「多面子」がトータルで164回ダウンロードされたそうだ。これが多いのか少ないのか分からないけど(いや、少ないのであろう)、見ず知らずの人がわたくしのプログラムを動かしたというのがちょっとうれしいような恥ずかしいような感じですな。


2001/03/17 (土)

Vectorで麻雀牌落ちゲー「多面子」が公開された。ひっそりと。まぁ、大したプログラムではないので地味なデビューでも別にいいんだけど...


2001/03/10 (土)

今日は麻雀落ちゲー「多面子」をVectorに登録。

まず、寄付の振込み用のシェアレジ作品登録。作品名や値段をフォームに入力してレジ作品番号を取得。次はライブラリ作品登録。登録したいアーカイブファイルをVectorのFTPサイトにアップロードして、定型フォームに作品名や説明、動作環境などを書き込んで、Vector宛にメールを送る。

これで登録作業は終了。審査に1週間ほどかかり、問題がなければVectorのサイトで公開される。


2001/03/09 (金)

出来上がった麻雀牌落ち物ゲーム「多面子」を載せてもらおうと思いVectorに問い合わせ。フリーソフトとして登録したいのだけど、もし寄付してくれる人がいたらVectorのシェアレジを使って振り込んでもらいたい。そんなことは可能か、ということをお尋ねしたのだ。

わたくし、オンラインソフトをダウンロードするとき、シェアウェアって書かれていると落とすのにかなり躊躇します。別にお金を払う必要がないのがわかっていても、なんとなく使いつづけるのも気がひけます(と言いつつWINZIPなんかは登録せずに使ってますが)。それに比べて、フリーソフトと書いてあると遠慮なく使えるし、よっ太っ腹! という気持ちになります。

そんなわけで、わたくしのソフトを多くの人に試して欲しいのでフリーソフトとしたいのだけど、せっかく物を作っておいて何の見返りもないのは悲しいし、資本主義にも反するし、せこいと言われようとも小金が欲しいのです。ソフトを気に入ってくれて、HPを見て「そうか、よしラボは会社を辞めたいのか。よし、応援しよう」なんて言ってくれる人が現れないとも限らないので寄付を受け付けようと考えついたわけです。


2001/02/15 (木)

さて、今作っている麻雀牌の落ちゲーにつかっている牌の絵は、とりあえず銀玉親方の「雀荘たぬ」のHPのものを拝借している。実際にゲームを公開するようになったらどこかからフリーの素材を探してきて入れ替えようと思っていた。「たぬ」のHPを見ると著作権について書いてあって、HP上のすべてのファイルを他人が使うことを一切禁止しているのだ。

そこで麻雀牌のGIFファイルなどのフリー素材探しをした。あるにはあるんだけど「個人での使用」とか「営利目的禁止」とかばっかり。もし作ったゲームをシェアウェアとする場合、そのような素材は使えない。検索しまくって、ようやく自由に使っていい素材を公開しているサイトを2件見つけた。そのうちの一方のサイトにあった牌画に妙に親近感を感じた。なぜなら、それは「たぬ」のHPで使っているものとまったく同じだからだ。つまり、今使っているビットマップをそのまま使ってよいということで一件落着です。


2001/02/12 (月)

試行錯誤の末、ようやく面子判定プログラムの最適化で満足のいく結果となった。

やりたいことは「最後に落とした牌が上下左右で隣接している同種の牌で2面子以上作れるかどうかを調べ、そのもっとも面子数の多いものをリストアップする」ことである。牌と牌の間に面子を構成していない牌があればそれはダメとする。簡単に説明するために牌が横一列に並んだとすると以下のような規則である。

  • 「123456」は「123」と「456」という2面子なのでOK。
  • 「121134」は「111」と「234」という面子が成立するのでOK。
  • 「1283456」は「123」「456」という面子が存在するが、「8」で面子を構成する牌の連結が切れてしまっているのでNG。
最初はパソコンもずいぶん速くなったし簡単なプログラムでいいだろうと思い、大まかに言うと以下のような手順であった。
  1. 落とした牌とくっついているすべての同種牌を取得(6〜N個の牌の集合)
  2. 1で取得した牌の集合から、重複を除いた全ての6〜N個の牌の組み合わせを走査して、2面子以上成立しているものを取得(2〜12の面子の集合)
  3. 2で取得した面子の集合に含まれているすべての牌が「落とした牌」と隣接しているかどうか調べる
でもこの方法は1で取得した牌の数が多くなれば多くなるほど指数関数的(たぶん)にチェックしなければならない組み合わせが増えてしまうのだ。Nが20を超えると何分もかかってしまうのだ。

そこで改良したロジックは以下の通り。「牌の組み合わせ」ではなくて「数の組み合わせ」に注目した。同じ数字の牌が最大4個含まれるので、それらを個別に扱うのは無駄だからである。
  1. 落とした牌とくっついているすべての同種牌を取得(6〜N個の牌の集合)
  2. 牌の数字ごと(1〜9)に何個の牌があるのかを調べる
  3. 1で取得した牌の集合を数字でソート
  4. 2の数字の集合から重複を除いた6〜N個の数の組み合わせを走査して、2面子以上成立しているものを取得
  5. 4の数の組み合わせについて、それと一致する牌の組み合わせすべてをリストアップ (その際、2のデータも考慮に入れる)
  6. 5の牌の組み合わせについて、その組み合わせに含まれているすべての牌が「落とした牌」と隣接しているかどうか調べる

文章で書くとわかりにくいが、プログラムを書いてみると後者は前者よりもかなりソースが大きくなる。それでも計算はものすごく速く終わる。100秒近くかかっていたものも1秒以下になったのであるからおどろき。それにしても妥協しなくて良かった。前のままではとてもじゃないけど「ゲーム」として遊べないもの。


2001/02/09 (金)

麻雀ゲームの面子判定のロジックの最適化方法をうんうんうなりながら考えていた。


2001/02/07 (水)

会社の後輩が「『落雀』って知ってますか?」と言う。Yahooで検索してみる。なんと今作っているものと似たゲームが既に存在していたらしい。ちょっとショック。そこに載ってた写真を見たところ牌が落ちてきて役を作るというところは同じだけど、落雀は牌が同時に2個くっついて落ちてくるらしい。ぷよぷよみたいなのかな。わたくしが作っているのは牌は1個ずつ落ちてくるし、きっと牌を消す条件も違うと思うので気にしないことにする。

上下左右にくっついている同じ種類の牌のなかから面子(の組み合わせ)を見つけるロジックを最適化しなければならないのだけどなかなか速くならない。


2001/02/02 (金)

麻雀落ちモノゲーは牌が落ちきったときに縦横にくっついている同じ種類の牌で2面子以上が成立すれば牌が消え、4面子で擬似的なあがりとして役をつけて得点とする、というルールに決定。いろいろ試した結果これに落ち着いた。

まだ必要な関数をすべて用意できていないけどとりあえずプロトタイプとして2面子以上で牌が消えるようにした動くものはある。遊んでみると、適度に頭を使う(「待ち」を考えなければならない場面もあるので)し、2〜3回の連鎖も起きるし、いい感じ。まだロジックが良くないので、同じ種類の牌が20個以上くっついちゃうと処理が終わるまでかなり時間がかかる。まずはこの辺の改善が必要かと。


2001/02/01 (木)

麻雀ゲームはまだどうしたら落ち物特有の連鎖や微妙な難しさが出るかを模索中...


2001/01/31 (水)

ふと思いついてゲームを作り始めた。英単語タイピングのゲームが完成してないのにどうかとも思ったが、そっちのゲームは素材つくりが面倒でいつまでも先に進まないから他のプログラムを並行して作っていってもいいだろう、と自分に言い聞かせてやってみることにした。家では英単語タイピングを、会社では新しいゲームを作っていこうと思う。

で、そのいついたゲームとは「麻雀牌の落ち物ゲーム」である。この前、役判定プログラムを作ったのがきっかけで思いついたのだ。とりあえず動くものを作ってみたけど、はじめに考えていたルールではなかなかうまく遊べず、ルールを簡単にするとゲーム自身が面白くなくなってしまう。バランスが難しい。


2001/01/24 (水)

今日はやる事が無かったので、昨日話題になった麻雀の役判定プログラムの作成をトライした。

まずは特殊な形のチートイと国士無双を判定するロジックを作る。その次に基本的な3-3-3-3-2の形、14個の牌が面子4個と頭の形になっているかどうかを判定するロジックを作成。意外と簡単に作ることができた。

ここまで来たらあとはそれぞれの役が成り立っているかどうかを判定するだけ。本格的に麻雀プログラムを作っているわけではないので、ポンとかチーとかは考えてないし、上がり牌がどの牌なのかもデータ化していないので平和とか四暗刻とかは判定できないけど、ホンイツ、チンイツ、チャンタ、ジュンチャン、タンヤオ、ツーイーソー、ホンロウ、チンロウ、イーペーコー、リャンペーコーを複合役でも判定できるところまでできた。

ここまでを割と簡単に作れちゃったことで既に満足してしまって、このプログラムをこれ以上発展させることは無さそう。

実は麻雀は非常に弱い(でも好き)。強くなるために、どの牌を捨てるべきか、なんていうヒントを常に欲しています。今相手がどの牌を欲しがっているかを捨て牌から予想したり、自分の手の効率的な進め方とかを教えてくれる麻雀ゲームなんか欲しいかも。仮に自分で作るとした場合、役判定よりも待ち牌の判定の方が難しそう。作らないけど。


2001/01/23 (火)

会社の先輩と麻雀ゲームの役や待ちはどうやって判定しているんだろうね、っていう話になった。もし自分で役判定プログラムを作ったとしてもスマートに作れる自信が無い。きっと汚くておっきいプログラムになってしまうと思う。世の中麻雀ゲームは一杯あるけど、みんな自分で作っているのだろうか? ライブラリとして売り出せば結構欲しがる人もいるんじゃないかなぁ。


戻る