2004.3.3
■ここは何の話をするサイトだったかというと
permalink:"200403.html#d03_t1"
- ロロ「
- 今日は“アルファベット”についてです」
- ロロ「
- “アルファベット”という言葉はもともとギリシャ文字の最初の二文字『アルファ・ベータ』から来ているそうです」
- ロロ「
- “いろは”や“ドレミ”といったものと同じですね。最初の二、三個が全体を表しているというわけです」
- ロロ「
- アルファベットというと英語のABC…がすぐ思い出されますが、他の文字でも使います。ギリシャ文字のアルファベットはΑΒΓ…、ロシア(キリル)文字のアルファベットはАБВ…といった具合です」
- ロロ「
- ところで、“エレメント”という言葉があります。元素や、要素といった意味の言葉です」
- ロロ「
- “エレメント(element)”はラテン文字の、後半最初の三文字、『LMN』から来ているそうです」
- ロロ「
- el, em, en で elemen というわけです」
- ロロ「
- ちなみにラテン文字は21文字しかないそうです」
- ロロ「
- 最初の数文字が“集合全体”を表すのに対し、真ん中の数文字が“集合の中の要素”を表しているというのは面白いですね」
おもしろいか?
ところで、プログラムとかそういうのを話すんじゃなかったかなあ。
2004.3.8
■ももんがあ〜
permalink:"200403.html#d08_t1"
なんでももんがあ〜なんだろ。
動物のモモンガとはどういう間柄なんだろう。教えて京極堂。
- ロロ「
- よくわかりませんでしたが、大人が子供を戯れにおどかす時に、こう、手に持った布をモモンガやムササビのように広げて、ももんがあ〜と言うそうです」
大王のポーズみたいにするのか。
掛け声がももんがあなのかな? そういうポーズそのものがももんがあなのかな?
■ニューヨークはスペイン語でヌェバヨール
permalink:"200403.html#d08_t2"
ラテン語ってアレだろ、昔のヨーロッパの言葉だろ。ラテンっつったらブラジルとか、南アメリカのことじゃないの。なんか関係あるのかなあ。
- ロロ「
- 『ラテンのリズム』のようなラテンとラテン語のラテンは同じ言葉なのですが、まったく関係なさそうに思えますね。これはスペイン・ポルトガル・フランスなどが中南米を『ラテンアメリカ』と呼び始めたことから来ているようです。アングロサクソン人が征服したから『アングロアメリカ』、ラテン人が征服したから『ラテンアメリカ』なんですね」
- ロロ「
- ここでいうラテン人とは古代ローマ人の末裔のことです。地中海沿岸の国、イタリア、フランス、スペイン、ポルトガルなどに広がっていきました。ロマン人ともいいます。世界中に広まっている、ごく普通のABCD…というアルファベットのことを、ラテン文字といいます」
おお、そういえばブラウザの“エンコード”とか“言語”ってとこに、ちょい前までは『ラテン』って書いてあった気がするぞ。今見たら、『西ヨーロッパ言語』って書いてあるけど。
- ロロ「
- ただし、日本ではラテン人やラテン民族というと、普通は中南米の人たちのことを指しますね」
世界史の授業ってなんであんなつまんなかったんだろうなー。つまんないって言うか、わけがわかんない。ロシアの王様はいつもピョートルだし。何人いるねん。
- ロロ「
- 単に全員ピョートル大帝(ピョートル一世)なのではなかったでしょうか。高校の授業ではロシア史がほとんどなくて、たまに名前が出てくるだけなので余計混乱したのでは」
ルイN世も何回も出てくるし、女の人はみんなマリーとかマリアだし、あと誰だっけ。名前のレパートリーが少なくて、それでいて親戚関係とかは何も出てこないんだよな。最初のうちはカエサルとシーザーどっちも覚えとけ!とか同一人物の二つの読み方覚えろとか言うくせに、同じ名前の人が何人も出てきてもほったらかしだし。ありがちなアレだが弊害が暗記偏重で受験教育ってやつですか。
http://ziro.no-ip.org/archive/2ch/0000076129.html
色んな読み方を勉強できたほうが、多面から歴史を学べるような気がする。多すぎて暗記はとてもできないんだけど、そういう授業だったら、もうちょっと世界史が好きになったのではあるまいかと。
2004.3.9
■[game]ジルオール
permalink:"200403.html#d09_t1"
『アランドラ』と『ジルオール』を勘違いしてたことに気づいたので『ジルオール』も買ってきた。確かに面白い。世界の運命の流れを、たかだか一人の人間が食いとめることはできないという意味でストーリーは一本道らしいが、一人の人生を千差万別にロールプレイングできる。TRPGで上手なゲームマスターに乗せられているという感じ。
末弥さんの顔グラも萌える。美男子多過ぎだなって気もするが。
女主人公のポリゴンがかわいい。現在、局所的には青の戦士という通り名で呼ばれるまでに有名になったものの金欠中。なんかヘンな女ばっかり仲間になると言った所。
最初ボク女だとわからず美少年だと思ったエステルたんに頼まれた砂漠でも行くか。
すでに色々情報を覗いてしまったが、ここからは攻略情報を遮断して一度プレイしてみることにする。
■あとのせサクサク
permalink:"200403.html#d09_t2"
設定パクっといてアンチテーゼとかぬかす作者も作者だが、(まあヒゲメガネは全員そういう人種というか、そういうところがヒゲメガネのヒゲメガネたるる所以だが)、俺の記憶が確かなら、本丸は第三話(連載第一話?)くらいでいきなり明るい性格にキャラチェンジされていた。要するに最初のせーかくではノヴィ某とカブり過ぎ&前に出なさすぎなのでテコ入れがあったのだろう。もちろん成長とかそんなんではない。だが作者のウマいところはこういう『なかったことにされてた』過去を、クライマックスの戦闘シーン中に回想の形で入れやがったのね。パパとママの涙とかも交えて。そしたら『(ウソの過去で)ガキ大将に殴られて泣いてたあの本丸が… 今までのエロい話とかエロい話とか戦闘シーンとかエロい話の試練をくぐり抜けて、本丸はこんなにも成長いたしました!』とかになって超盛り上がりで大興奮。このリサイクル能力&後乗せ能力は俺もすごいと思ったよ。不覚にもちょっと感動したもん。他にも、1)突然主人公が嫌な性格を見せる、2)それを乗り越える、あるいは懲りる、3)数話後で嫌な性格が解消されたことを示し、伏線消化する ってのをかなりマメにやってて凄いなと思った。これも良く見たら、1の伏線がほとんど無いことから後付けだってわかるんだけど。だけど、だけどなあ。こんなんで『成長するからノヴィ某より素晴らしい』とか言ってる奴見ると、『こういう事申し上げるのは心苦しいのですけれど…ファンの方ってお脳がお留守でらっしゃるのかしら?』ってお声をかけたくなる。
- ロロ「
- 今頃なんの話をしてるのですか」
要するに、この刹那的な時代、後付けしたものが勝ちになってきてるんじゃないかなと。
朝三暮四、という言葉がある。猿回しが朝三個、晩に四個エサをやるとサルに言ったら怒りだし、朝に四個晩に三個やると言ったらサルは喜んだという故事だ。(多分サルに朝言ったんだろう)
だが、人間はサルとは違う!
いまどき、人間は朝三暮三でOK!
朝三つやった後、暮には「朝四つだったので暮は三つしかない」と何食わぬ顔でのたまえばいいのだ。誰も覚えてない。
過去はいくらでも改変してOK! 人を殺しまくっても悲惨な過去を後付けしたらOK! あるいは過去の忌まわしい記憶、とか言って殺した事自体を悲惨な過去にしてしまえばOK!
もちろんフィクションの上でのお話ですヨ(←後付け)
誤解されないように言っておくと私はこの作者の方大好きですヨ(←後付け)
- ロロ「
- なにか嫌なことがあったのですね」
2004.3.12
●[書きかけ]演繹だけで迷路を作ろう
permalink:"200403.html#d12_t1"
論理展開のシミュレーション。
単純な、文字キャラが主人公な迷路ゲームを考えよう。キャラクターの回り3x3だけが、見えている。
見えるのは壁と通路だけ。どこかにある出口を探してさまよっているものとしよう。キャラクターが動けば、
それにつれて迷路も明らかになっていく…
ごくごく単純なゲームだ。しかし、普通は迷路を先に作成しておくんだが、キャラクターの動きにつれ作成していくように
すると…どうすればいいか。
●普通に迷路を作る
permalink:"200403.html#d12_t2"
だいたいこんな感じだと思う。
- 全体を壁にする
- 入り口(出口)を一つ決める
- 入り口からランダム方向に穴を掘る。
- 入り口、あるいはすでに掘った場所からランダムで選び、ランダム方向に穴を掘る
- 掘れる壁がなくなったら終了
さらに『ある程度続けて掘るようにする』とか、『掘れる壁をツリーで管理して、次の候補を選ぶ方法を色々変える』
などのルールを追加することで迷路の性質(袋小路が多いとか、通路が長いとか)を変えることができる。
- ロロ「
- 『棒倒し法』という別のアルゴリズムがあるそうです。さっきのは『穴掘り法』というアルゴリズムです」
ほほう。
- 四方の壁を残して、全体を空間にする
- 柱を立てる。柱とは壁と壁が交わった部分のこと。ウィザードリィのように壁に厚みのない迷路が作りたい場合は、柱は点になる。壁が1キャラ分ある場合は、柱は1キャラになる。
- 迷路のある一辺に、一番近い柱一列から処理を開始する。柱1本につき任意の方向に一枚壁を作る。
- その隣の柱の列も同様にするが、このとき三方向にだけ壁を作る。左端から始めたのであれば、上・右・下だけに壁を作れ、左に作ってはいけない。
- 全部の柱について処理したら迷路完成。
ええー。こんなんしたら繋がってない空間とかできないのかなあ。
- ロロ「
- うまく考えてありますね。柱一本につき一枚なのがポイントのようです。」
●さあ、どうするんだ
permalink:"200403.html#d12_t3"
普通の迷路作りと違うのは、自分で壁の割合をやらなきゃならないってことだ。普通の迷路では、最初に壁で塗りつぶすという作業はあったものの、通路を用意しているだけで『残ったのが壁』って簡単に判断できてしまう。この辺がキモだ。ここをクリアできなきゃ、迷路どころか大目的にも届かない。
●問題作成問題
permalink:"200403.html#d12_t4"
『どこに壁を配置するか』
- 壁を作らなければ、ゲームにならない
- 壁を作りすぎると、一本道になりこれもゲームにならない
- 壁を適当に作るだけでは、いいゲームにはならない
●リソース使いきり判定
permalink:"200403.html#d12_t5"
大風呂敷を広げていくだけではきっと感心してもらえない。誇大妄想的セリフがランダムに出るゲームという評価がせいぜいだろう。ときには小さなリソースを美しく使いきる場面がなくてはならない。
迷路で言えば、すべての床を通路とくっつける処理がある。
これには色々なアルゴリズムが考え出されているが…あとあと使えるようなアルゴリズムはないじゃろか。
分断した壁自身が、壁の向こうのリソースを管理してくれるというのはどうじゃろか。
というか既知の柱同士がくっついちゃダメなんじゃよ。それだけ管理すりゃ何とかなるんじゃなかろか。
三叉路の確率・十字路の確率・曲がり角の確率・直線の確率・袋小路の確率などのパラメータを持っておいて、
適当に壁を作る。但し奔放に作るだけだと目的を見失うので、
- 壁を作った時、その壁は既知の柱と接続されてはいけない。
#########
#・ ・ ・ ・#
# 口 口 口 #
#・ ・ ・ ・#
### 口 口 #
#@・・ ・ ・#
#########
スタート。@はキャラクターの位置、#は既知の壁、・は既知の床、その他はすべて不明。
#########
#・ ・ ・ ・#
# 口 口 口 #
#・ ・ ・ ・#
##### 口 #
#・@・ ・ ・#
#########
一歩右に進んだ時点で、上壁の判定を行なった。ここでは1/2の確率で壁を出現させてる。ここに壁があることがわかった時点で、右壁の判定で壁が出現しないようにしなければならない。
判定をどうするかだが、ここでは壁自体に属性を持たせることにした。上壁は外壁に接続されているので、『外壁』属性を持っている。この属性は壁が連結している先に全部伝染するものとする。すでに外壁属性のある壁は、外壁に接続できない。
#########
#・ ・ ・ ・#
# 口 口 口 #
#・ ・ ・ ・#
#####・口 #
#・・・・@・・#
#########
上壁判定。今度は床になった。右壁を判定する。床になった。
#########
#・ ・ ・ ・#
# 口 口 口 #
#・ ・・@口・#
#####・口 #
#・・・・・・・#
#########
上に来た。右が壁。この時点で選択肢の数は3。
#########
#・ ・#@#・#
# 口 #・# #
#・ ・・・#・#
#####・# #
#・・・・・・・#
#########
選択肢2.
#########
#・ ・#・#・#
# ###・# #
#・?@・・#・#
#####・#?#
#・・・・・・・#
#########
選択肢は2だけど孤立点ができないようにするには、もうこれ以上壁を作ってはいけない。
それをどうやって判断するのか。上はすでに『外壁』属性の壁、下も『外壁』属性の壁である。
壁は未連結の柱以外と連結できないというルールを作っておけば事足りるだろう。
■[book]読了本 アカギ15巻 レイチェル・ウォレスを捜せ
permalink:"200403.html#d12_t8"
- アカギ 第15巻
- サブタイトルは『捻転の闘牌』そろそろいい単語もネタも無くなってきたね
- レイチェル・ウォレスを捜せ
- スペンサーのハードボイルドっぷりが依頼人に嫌われる話。
2004.3.16
■桜田春菜
permalink:"200403.html#d16_t1"
春ですね。
最近気づいたんだが、冬は頭も身体も動かない&動かす気にならないみたいだ。ものすご久しぶりに、仕事以外でプログラミングしたくなった。まあヒマになったからというのもあるんだけど。
あーでも、さらにもうすこし季節が過ぎると、花粉が脳に達して何も考えられなくなるだろうなあ。
- ロロ「
- そのまえに勉強、勉強です」
■[win32]rm.exe
permalink:"200403.html#d16_t2"
make clean したかったのだが、Windows98のcommandのDELは、ファイルを一つしか受け付けない。ダッセー。
普段はWindows2000を使ってたので気づかなかった。仕方がないので、UNIX互換の rm コマンドを探す。
rm.exe だけ欲しいんだけど、あんまり変な rm.exe を取ってくるのも何なので、ある程度スタンダードな UNIX コマンドが欲しい。しかも、DOS環境を劇的に変えたりされるのは困る。
- ロロ「
- 色々検討させていただきましたが、」
コマンドラインツールのまとめを見て、
- ロロ「
- いただくことにしました。ありがとうございます」
■[win32]うらがめんクラス
permalink:"200403.html#d16_t3"
アレだ。うらがめんクラスを作ろうと思う。
- ロロ「
- バックサーフィスを利用する手順は…」
- CreateCompatibleDC(NULL)で今の画面と同じ設定のDCを作る
- CreateCompatibleBitmapで同じ設定のビットマップを作る
- SelectObjectでDCとBitmapを関連付けする。
- DCを引数にしてGDI関数でガリガリ描画する。
- 表画面のDCにBitBlt。
- 終わったらDeleteDC, DeleteObjectする。
- ロロ「
- このような感じでしょうか」
はるか昔に、CreateCompatibleBitmapで作成したビットマップが画面そのものだ、という実験をやったような気がする。
- ロロ「
- あの気まぐれにやった実験が、ついに何かの役に立つ時が来ましたね」
うむうむ。
- ロロ「
- 逆にいうと、このサイトに書いてあることは全体的に、役に立たなさ過ぎだと思います」
いやいや、役に立つサイトは既にいっぱいあるんだから、このサイトはいつまでもこうして悩んでいていいのではないでしょうか。
- ロロ「
- ……」
まずやらなきゃいけないことを列挙しましょう。
- Flip() 裏画面から表画面にBitBltするメソッド。裏画面だけでなく表画面も知ってないとだめ?
- 裏画面のDCを取得するメソッド
- 表画面のDCは…GetしていちいちReleaseするのが本式みたいなので、ウィンドウハンドルの方を保存しておく。
- 画面サイズも保存しておく必要がある
こんなかんじで作ってみよう。
class BackSurface
{
private:
HDC _hmemdc; //メモリDC
HBITMAP _hbit; //メモリDCのビットマップ
public:
//コンストラクタ
BackSurface(HWND hwnd, int w, int h) {
_hmemdc = CreateCompatibleDC(NULL);
_hbit = CreateCompatibleBitmap(_hmemdc, w, h);
HBITMAP hbitOld = (HBITMAP)SelectObject(_hmemdc, _hbit);
DeleteObject(hbitOld);
}
//デストラクタ
~BackSurface() {
if(!_hbit) DeleteObject(_hbit);
if(!_hmemdc) DeleteDC(_hmemdc);
}
};
未だにクラス定義の最後のセミコロンを付け忘れるな。
- ロロ「
- まずは以下の4つについて実装しています」
- CreateCompatibleDC(NULL)で今の画面と同じ設定のDCを作る
- CreateCompatibleBitmapで同じ設定のビットマップを作る
- SelectObjectでDCとBitmapを関連付けする。
- 終わったらDeleteDC, DeleteObjectする。
- ロロ「
- CreateCompatibleDC には 現在のDC を渡す必要があるのですが、NULL を渡すと現時点の画面と同じ設定のDCが作成されるようです。とりあえず問題が出なければこれでいきます」
ここで作ったばっかりのDCを与えていいのかな? まあ、ものは試し。
HDC GetMemDC() { return _hmemdc; }
void Clear() {
//初期化
BitBlt(_hmemdc, 0, 0, _w, _h, NULL, 0, 0, BLACKNESS);
}
void Flip() {
HDC hdcFront = ::GetDC(_hwnd);
//転送
BitBlt(hdcFront, 0, 0, _w, _h, _hmemdc, 0, 0, SRCCOPY);
ReleaseDC(_hwnd, hdcFront);
}
転送と、忘れてた初期化も設定してやる。
実際に転送するプログラムも作ってやる。
//-------------------------------------------------------------------
// メインルーチン
//-------------------------------------------------------------------
void Idle(BackSurface* bs)
{
//クリア
bs->Clear();
//書く
BitBlt(bs->GetMemDC(), 100, 100, 16, 16, TheRes.GetPacDC(), 0, 0, SRCCOPY);
//転送してみる
bs->Flip();
}
ここで、結局出てこない! やっぱりCreateCompatibleBitmapで作ったDCを使うのは具合が悪いみたいだ。
コンストラクタを書き換えた。
private:
HWND _hwnd;
int _w, _h;
HDC _hmemdc;
HBITMAP _hbit;
public:
//真コンストラクタ
BackSurface(HWND hwnd, const int w, const int h) {
_hwnd = hwnd;
_w = w;
_h = h;
HDC hdcFront = ::GetDC(_hwnd);
_hmemdc = CreateCompatibleDC(hdcFront);
_hbit = CreateCompatibleBitmap(hdcFront, w, h);
ReleaseDC(_hwnd, hdcFront);
HBITMAP hbitOld = (HBITMAP)SelectObject(_hmemdc, _hbit);
DeleteObject(hbitOld);
Clear();
}
これでいいみたい。
CreateCompatibleBitmap の引数 DC には、ちゃんとしたビットマップが設定されたDCを指定すること!
ふいー。解像度すらコピーしてくれないとは。コンパチブルとか言いながら全然コンパチブルじゃないのがめんどくさいね。
■[win32]参照したURLのほんの一部
permalink:"200403.html#d16_t4"
- [2ch]初心者専用スレ「パックマン」風ゲーム作らない?
- http://pc2.2ch.net/test/read.cgi/gamedev/1014326802/
- Make と Makefile の説明
- http://www.unixuser.org/~euske/doc/makefile/
■[book]読了本 マイノリティーリポート エマ3巻
permalink:"200403.html#d16_t5"
- マイノリティーリポート
- フィリップ・K・ディック短編集。映画化された表題作ほか。うーん同じく映画化された『追憶売ります』もそうだけど、ディックの作品にしては見通しがスッキリした話なので、その分破綻も見えやすくてイマイチ。見通しがいいから映画化しやすいのかな。
- エマ 3巻
- あらすじは、メイッ酔ッおねッ栗鼠ッ猿ッ! という感じ。ようやく読み方がわかってきた。エマ萌えのみならず、英国ヴィクトリア朝のヒダヒダ全部全萌えで往くのがよいみたい。