zzzです。

 ホームページを大幅更新。KOMARIさんが更新してくれた。TRASHのほうにKOMARIさんが作った困りアプリがあるので、ゆっくり困って逝ってね!

 ぷよぷよ熱が再来してやばい。しかも意外にそこそこ勝てるという……。積み方はすごく下手になったと思うけど、かわりに凝視とか状況判断考えるようになって勝てるようになった気がする。
 未だに鍵積みもどきしか積めないけど意外にいけるものです。……実は階段も組めない。折り返し部分が難しすぎて遅くなってしまう。

puyo

 画像は10連鎖。いやもうひどい積みなんだけど、平均この程度だと思う。調子良かったらもっといい積みしてるよ!……そもそも大連鎖打ってる場合が少ないんだけど。
2012.04.24 原因不明
 zzzです。

 どうもZバッファが有効にならなくてバグ原因を特定していたのですが、リリース版でコンパイルした場合、Zバッファが有効になった。

 ……茶番すぎる。寝よう。

square2
 DirectXが死ぬほど難しすぎてなきそうでしたが、だんだん慣れてきましたzzzです。

 むしろクラス構築方法のほうが難しい気がしてきました。あれこれ作ってはいるんですが、汎用性を高めようと思ったら難しくなったり、よく分かりません。

 とりあえずキューブを10個作ってランダムに回すというだけのプログラムを組んでみました。どうでもいいですねこれ。

square.png

 見た目はきれいですけど、ランダムの動き方がきもくて病み付きになります。スクリーンセーバーにしたいです。
 次はキューブを当たり判定で乱反射させてみるプログラムを頑張ってみるか、それとも板ポリゴンだけもうちょっと頑張るかします。
 zzzです。

 デバイスのロストについてどうやらもう1パターンあるようで、フルスクリーンプログラムを起動中に、ほかのアプリがフォーカスを持った場合にデバイスがロストしました。デバイスがロストする場面はそこそこあるようです。

 D3DPRESENT_PARAMETERSにBackBufferFormatの値を指定してデバイスのインターフェイスを取得するはずですが、この値にD3DFMT_UNKNOWNを指定すると自動でBackBufferFormatの値を適切な値にしてくれるということらしいです。(ただしフルスクリーン時には指定しないといけない)
 がよく意味が分からなかったのでちょっと実験してみました。

 まず自環境のディスプレイのフォーマットを取得してみます。IDirect3D9::GetAdapterDisplayMode関数で取得できます。そうして取得してみると当環境ではD3DFMT_X8R8G8B8がディスプレイのフォーマットであったようです。

 ここでD3DFMT_UNKNOWNが働くのはCreateDevice関数を呼んだときで、そのときにD3DPRESENT_PARAMETERSのBackBufferFormatの値がD3DFMT_X8R8G8B8に書き換わりました。どうやら同じ値にでも書き換えるのでしょうか?
 当環境ではD3DFMT_UNKNOWNではなくD3DFMT_R5G6B5に書き換えたらCreateDeviceに失敗しました。色をきちんと決めたいという理由のある方では無い限りD3DFMT_UNKNOWNから変更しなくてもよさそうです。

 またフルスクリーン時にD3DFMT_UNKNOWNを指定するときっちりCreateDeviceに失敗しました。横着はダメです。
 zzzです。

 DirectXを弄り始めました。とりあえず初期化に関するクラスを構築してひとまず今日は終わりにします。
 そのときによくわからなかったのがデバイスの消失についてでした。タイミングとかもよくわからなかったり、どういう状況で復元できるかも謎でした。

 ということで色々調べると、主に

・Alt + Tab キーを押したとき
・電源管理の結果
・他プログラムがフルスクリーンとなったとき

 の三種類が原因だそうです。上2つに関しては当環境では再現できなかったのですが、一番下は確実にデバイスが消失してくれました。これでデバイス消失のときのデバッグが出来ます。

 とりあえず適当にテストしてみましたが、デバイスの復元は最低でもフルスクリーンプログラムが起動しているまでは出来無いと思ったほうがよさそうです。他プログラムがフルスクリーンで起動している間は復元にかなり失敗していました。

 ということは他プログラムがフルスクリーンで起動している間は、ゆっくりループを回して復元できるのを待ちながら、内部処理はさせないというのが理想のようです。

 zzzです。さっくりいくと思ってましたが全然ダメでした。初の正規表現だったので一時間くらいかかってしまいました……発想力が無いです。はい。

 とりあえずsplitやjoinみたいなパターンを受け取るサブルーチンをつくりたかったんだけど、まず受け取ったものがパターンかどうかを判定するサブルーチンを組んだ。下がソースコード。

sub IsPatternMatch
{
    my ($match) = @_;
    return $match =~ /[^\/]+/ ? $& : 0;  
}

sub TestSenyou
{
    if(my $cha =  IsPatternMatch($_[0]))  
    {
        print $cha, "\n";
        print "パターンにマッチしたのを確認したぜ\n";
        print "ここから自作用マッチ関数みたいなのを作ればいいよ!\n";
    }
    else
    {
        print "おいおい。ちゃんとperlにのっとった形でかいてくれよ\n";
    }
}

$str = '/aaaa/';
TestSenyou($str);   #これはOK
TestSenyou('/wwww');    #これもOK
TestSenyou("tttt/");   #これもOK
TestSenyou("hhhh"); ##これもOK



 IsPatternMatchがやりたかったこと。これだけでだいぶ苦労させられたorz[^\/]+が思いつかなかったんですよお……。意外に難しいなこれ。
2012.04.13 敗退
 証明問題が解けなかった……。方程式はすでに立ってて数学的には解けば終わりなんだけど、方程式の依存関係が頭おかしすぎて厳しい。プログラムでさっと解けると思ってたけど一日では無理だった。境界条件が難解すぎる……。

 厳しい。厳しい。

 Perlの魔力がやばい。C++の100倍楽だ。なんだこの言語。いやC++が難解すぎるだけなのかもしれんが……。
 文字列操作とかデフォルト挙動とかもう凄まじいとしか言えん。まあデフォルト挙動の裏ではメモリ管理とかやってる感じだろうから、C++のほうがやっぱり速いよね、って思わないとやっていけない。
 C++も組んでいるんだけど、ソースコードが長すぎて公開できないパターンが多いしなあ。その点Perlは前日上げたような形で出来るしやはり魔力がやばい。

 zzzです。

 Perlで配列からテーブルの作成に挑みました。が配列の配列が難しいPerlでは少し苦戦しました……。以下ソースです。

print "Content-type: text/html\n\n";

$debug = 1;

sub TableStr
{
    my (@tablestr) = @_;
    my $str = "<table border>\n";
    my $count = 1;
    my $sep = $tablestr[0];
    my @save;
    while($count < scalar(@tablestr))
    {
        if($count == $sep + 1)
        {
            $sep += $tablestr[$count] + 1;
            $count++;
            next;
        }
        push(@save,"$tablestr[$count]\n");  
        if($count == $sep)
        {
            my $savestr = join("</td>\n<td>\n", @save);
            $savestr = "<tr>\n<td>\n" . $savestr . "</td>\n</tr>\n";
            $str = $str . $savestr;
            splice(@save);   
        }
        $count++;
    }
    $str = $str . "</table>\n";
    return $str;
}
my @a = ("1","2");
my @b = ("3","4");

my $test = TableStr(scalar(@a),@a,scalar(@b),@b);
print <<"EOF";
<html>
<head>
<title>
test
</title>
</head>
<body>
Hello World!<br>
My name is zzz!<br>
$test
</body>
</html>
EOF

 わりと苦戦しました……。がそこそこ使えるものが出来たのではないでしょうか。ちなみにhtml上からはこんな感じに見えます。

perl_table 
 見た目はあまりよくありませんがとりあえず満足はしています。しかしまだ先は長そうです。

 zzzです。

 ようやく描画メソッドが固まった気がする。気だけなきもする。がこれ以上良案が思いつかないのでこれでいいや。それにあまりに基礎部分すぎて何をやりたいのか見失いかけるから怖いオブジェクト指向怖い。とりあえずWINAPIでさくっと描画テストしたからもういいよ!

 次は描画とフレームワークの差し替え用クラス、またの名をシーン管理クラスの作成ですかね……。先は長い。
2012.04.09 はじめてのPerl
 諸事情でcgiを作りたいのでPerlを勉強します。まあせっかくですし楽しんでやります。はい。
 というか目的に即してない気がするんですけどね。スタイルシートごりごりやるだけでもいいような気もします。まあそもそも旨味がまだよくわかってないから別にいい気もするんですが。

 しかしPerlの実装自体が面倒ですね。C++とかほぼVC++入れればいいだけでしたから。
 とりあえずActive Perlをインストールして、ez_htmlを導入してローカルサーバーの導入までは行ってテストプログラムは動きました。ということでここからが本番ですね。

 動かしたプログラムはこちら。

print "Content-type: text/html\n\n";

print "<html>\n";
print "<head>\n";
print "<title>\n";
print "test\n";
print "</title>\n";
print "</head>\n";
print "<body>\n";
#ここからボディ
print "Hello World!<br>\n";
print "</body>\n";
print "</html>\n";

 はい。馬鹿みたいにどうでもいいです。ここからが始まりですが今日はとりあえずこの辺で。
 zzzです。

 CPUの挙動にバグがあったのでver1.021に更新しておきました。
 全て私が原因のバグなんですけどね……。ついでにhardさんを解雇しました。あまりに面白みがないようなので。
 ついでにzzz easyが強すぎると言われましたので、弱くしました。これでカモがネギを背負った状態です。
 zzzです。

 17ポーカーをバージョンアップしました。さすが掘木さんが組んだプログラムだけあって目立ったバグもなかったのです。
 がCPUの調整や選択アルゴリズムに欠陥があったためそこを改善しました。

 あとノーマルモードとハードモードで配色が異なるようになり、さらにback.bmpとback2.bmpを差し替えることによって背景を変更することが可能になりました。
 
 また新CPUということでGel'fond様の案によりSABERが追加されました。脅しに屈しない強CPUでハードモードに居ます。変わりにLANCERがノーマルモードに左遷されました。

 主なところはこのようなところです。多分内部挙動も相当改善されて軽くなってそうですが。掘木さんのことですし。
 zzzです。

 17ポーカーの動画をアップしてみました。(KOMARIさんが)
 紹介動画兼プレイ動画のような形です。よければみてやってください。


2012.04.03 死屍累々
 zzzです。

 特定の戦法でハードモードに圧勝できることが判明しました……。どうにかします。え、どうにかしてほしい人がいるかって?いやいや、我々3人はどうしてもプレイヤーに圧勝したいのでどうにかしますよ。ええ。ダウンロードしてくれた素晴らしい方々に対してこれくらいの返礼は行わないと祟られますよね?はい。祟られます。

 あと掘木さんがハードモードのときの配色を変えてくれました。こちらです。

17poker_hard

 恐ろしい感じになりました。実際に恐ろしいです。が現状では少し弱いので何とか頑張ります。
 完璧な人間はいない。完璧は完璧であるからゆえに矛盾するのである。




 はい。中二病のzzzです。
 17pokerのpoorの挙動がバグってました。ちゃんとしたつもりが、結局適当にカードを選んで交換していたという……。これじゃ勝てるものも勝てませんな。
 というかこれだけやらかしておいて、ハードモードがあの強さとは……。ほかが強すぎる。

 ちなみに100戦やった結果を目安としているんですけど、大概というかもう我々すうがくかメンバーでも負け越してます。もう本当にhardはおかしいです。このおかしさを体感してもらいたい一心で作りました。掘木さんが。ああ、他人任せは素晴らしいです。だって何もしなくていいですから。