なんぞ最近プログラムを考えてる。仲間内でアドベンチャーゲーム(ADV)を作る話が出てるからだが…その練習にタロット占いプログラムを組もうとしている。それもBCC(ボーランドCコンパイラ)とテキストエディターでがんばろうとしている。…単なる阿呆だろうなぁ、これ。
もともとVB(ビジュアルベーシック)で何回かのプログラム経験があるから、ロジックとかはある程度分かるし、命令も一部似通ってるからそんなに違和感があるわけではないのだが…やっぱ違うわ、VBとは…。
まずは練習用でタロット占いのプログラムなんぞを考えてみた。
さて、ウィンドウの表示なんて言うのは一気にすっ飛ばして(いいのかすっ飛ばして)一番重要なカード選択ルーチンを考えてみよう。
void tarot(){
int cnum[45];//カードナンバーを納めてある
int ccard[3];//何枚選ぶんだっけかな?
int i = 0;
int alcard = 44;//カードは全部で44枚だよぉ
srand(rmize)
while (i < 45){ //カードの格納
cnum[i] = i;
i++;
}
i = 0;
while (i < 3){ // カードを選びましょう
ccard[i] = rand() % alcard;
cnum[alcard] = ccard[i];
for (int so = ccard[i];so < alcard + 1;so++)
cnum[so] = cnum[so + 1]; //リソート!!!(リゾートにあらず)
ccard[i] = ccard[i] - 22; //カードのナンバーは?
alcard--; //次の準備
i++; //同上
}
//この後にカードを描画する所を書く
まず最初だが、voidである意味はない。一応成功したかをお知らせした方がいいのでBOOLでもいいと思う。
その後にカードを選ぶルーチンが来る。
ただしこのままではバグを含んでいる。…けっこういい方法だと思ったんだけどなぁ
ツー訳で作り直しなんだけど、まだなおしてない。
さて変数宣言の部分に”srand(rmize)”という関数が来ている。srandという物はrand関数を初期化する物だ。そして引数に自作関数rmizeをおいている。
この理由だが、一般的にはrandという物はtime関数を用いて初期化する。だが、そのtime関数という物、秒単位で値を返してくるのだ。そうなってしまうと同じ人が二回やった場合一回目と二回目では全く違う結果がでてくる。
せめて一日単位で変えたい。かといって単純に秒単位で帰ってくる数字を60*60*24で割った値でrandを初期化した場合、その一日の間は誰がやっても同じ結果がでるというこれも意味がない結果になる。
一応僕的な構想としては占い開始時に占う人の星座&血液型を選択してもらうことにしようと思う。これは別に生年月日や、名前の入力でもいいのだが、星座&血液型の方が何となく気に入ったのでこの仕様にしている。
だが…まだこの仕様のrmize関数は実装していない。
かわりにtimeで初期化している。…をい。
以下がrmize関数のリストだ。
unsigned int rmize(){
long mize = time(0);
return mize;
};
さてrmizeは符号無し(unsigned)整数を返す関数である。ついでに中の変数の型と返し値の型が合っていないことに気づくと思う。これはsrandが引数としてunsigned intしか認めてくれないからだ。だからどうにかして型を変換しなければならない。ついでにこれだとエラーが起きると思う。(未実験)
ちなみにtime(0)の部分が返す値はlongの値である。
僕としての問題点はこのような変換時にintの方はどんな値が入るんだよぉということである。
time()という関数の戻り値は1970年1月1日からの経過時間を秒単位で返す(のだと思った)(MSDNライブラリより)
…unsigned intのとれる値は0〜65535。返し値はunsigned intの値を軽くオーバーする。
そこで、ウィンドウの決まり事を覚えるためにも、とそこのとこの実験プログラムを作った。
あるページを参考…ほぼコピー…に作っている。
それを読みたい場合ここ(01/02/12追記:問題解決により削除。つれづれ第八回に修正版あり(のはず))から適当に落としてほしい。
作ったことは作った、オラ〜、って感じでバッチファイル作ってコンパイル開始。…数秒後。エラーが二つ、注意が一つ。まあ注意は無視してかまわないと踏んだからエラーをどうにかしなければ…。
エラー:int型はHBRUSH型に変換できません
エラー:void ShowTextがねぇよ!
(元々は英文。意訳してます)
後者はすぐ解決した。プロトタイプ宣言してなかっただけ。
前者は詰まったぞ。MSDNライブラリにもあまり詳しいこと書いてないし。
で、僕が持ってる唯一のWinでC++を書いてる本(ゲームプログラムの本なのだが、ウィンドウを作るところなど、自作のクラスライブラリを使用している)のサンプルリストを見て、一応解決。
今度は〜っと、エー!? リンカでエラーっすか???
しかもmainがねぇよだと???
ちょっと待て、それはおかしくないか???
だって、Winプログラムではmain関数のかわりにWinMainを使うんじゃなかったのか???
ツー訳で、現在EREYがフリーズ中。