kr_ryo 徒然日誌 <2003年11月23日分>

三國志製作記40〜とりあえずのワナ〜

今年の気候はよくわかりませんね〜(*_*)金曜は夏物スーツでも平気だったのに、土曜は凍えそうになってます(*_*)今日も寒いですねえ〜って、いや、これが普通の気候ですかねえ?なんてったって11月も終わりですからねえ〜ああ、もう12月、2003年もおわりじゃないですか!( ̄□ ̄;)

それにしても三國志製作記も、はや40回ですねえ〜(^^;Aこれまで色々ありましたが、当初机上で検討して決めていったルールや内容なんですけど、とりあえずプログラム基盤を作っていく中で、それも微妙に変化してきました。その中でも多分可能で、一番大きいと思うのが、軍団数上限。

SWGでは艦隊数は5つまでと制限されていましたが、ただの移動のためのひとつかみとも言えなくはなかったです(^^;毎回編成を変えるのが邪魔くさい、というのはあるとも思いますが、別に艦隊になったから強くなるわけでもなく、ひとつかみにして移動できるだけ、という見方もできます(^^;;それでも第1艦隊は主力艦隊で、第3艦隊が機動艦隊、第5艦隊は辺境防衛、という意味付けをすればやっぱり楽しいですし、最後まで編成を変えなかった第2艦隊がred国を滅ぼし、提督は英雄となって凱旋、大総統となった、というようなプレイも面白いでしょう(^-^)ひとつかみにはひとつかみなりの楽しい想像が羽ばたきます(^o^)

ほとんど個性のない艦船に、単なる数字の艦隊番号にすら想像の余地があるのに、あの名作三國志をテーマにして、軍団が5つしか編成できないとすると、SWG以上に顰蹙もんでしょう(^^;;;え、5つ?!と抗議が殺到しそうです(☆_@;)☆\(`-´メ)o

いや、もちろん5つではありません(^^;;;三國志の部屋にあるような20でもありません。どうやら上限なしでできそうです\(^O^)/全武将が1つづつ軍団を持ってもいいですし、全武将が1つの軍団に参加してもかまいません。複数軍団が同時に戦闘に参加できるのかどうかがまだ詰めきれてませんが、プログラム上はどうやら上限なしでもできそうです。試しに20000軍団分変数を確保したところ、メモリが40メガぐらい必要になりますが、まあ、最近のパソコンでなくてもなんとかなりそうですし、どう考えても20000軍団も作るはずもないのできっと大丈夫です(^^;さすがデータベースも作れるDelphiですねえ〜データ処理はお手の物という感じです(^-^)

その軍団編成画面。軍団を新設して、再編成する画面ですが、武将を加入させることばかりを考えていて、再編成時に武将をはずすことを忘れていました(^^;さらによく考えれば、軍団を解散させるコマンドも必要です。さらに、各画面で取消ボタンを押した際、ちゃんとキャンセルができるか、という点も大事です。結局全部で、軍団関係の画面は、新設の際には総大将を選び、加入武将を選び、役職や兵などを渡す画面が、再編成の際には、まず再編成する軍団を選び、軍団からはずす武将を選び、新たに加入する武将を選び、さらに役職や兵数などを変更する画面が、解散の際には解散させる軍団を選択する画面が必要です。基本的には使い回しですが(^^;それぞれその先の行き先や、処理の内容を正しく作っておかないといけません。さらにそれぞれの画面で、不要な選択をなくす分岐や(全然武将がいないのに新たに加入させますか?というダイアログを出さない、など)取り消しの処理などを適切に配置しないといけません。文にするとあれやこれや多いですねえ〜(^^;これを書かずに頭の中であれもやってこれもやって、としていると、だんだん何をやらないといけなかったのか忘れてしまったりします(^^;

だいたい、最初は頭の中でこれで動くはず、というプログラムをちゃかちゃかうっていきます。これでたいていは動きますし、スペルミスなどはDelphiが教えてくれます。ところが、論理的に正しくても、うまくいかないことはあります(*_*)前回までのリストの挙動不審、なんと今回の再編成画面でまた現れました(T-T)とりあえず再編成関連で必要な事項について書いて、とりあえず動かしてみたところ、再編成のための軍団選択リスト→新たに軍団に加入させるための武将選択リスト(当時はまだ武将をはずす部分がなかった)→役職や兵数などを再設定する画面、という流れで正しく動きましたが、なぜかその後、→また軍団選択リスト、が現れます(*o*)どうしたことでしょう!

…というより、いつものあれです(^^;リストをクリックしたことで「クリックされた先」へ飛び、その処理が終わった際に、リストの帯が表示され、それでまたさらに「クリックされた先」に飛ぶ、という、もはやおなじみの内容です。それにしても、これは解せんのですよね〜(~_~;)なんでこういう設定になってるんでしょう?有料のDelphiプロ版なら、このリスト自体のプログラムの中身が見れるのでわかるんでしょうが、無料のパーソナル版にはついていません。とりあえずパーソナル版で間に合っており(^^;プロ版7万は…ここまでできるようになってるなら買ってもよさそうですが(^^;さすがにシェアへの誘惑も起きそうなのでとりあえずやめておきましょう(^^;A

さて、相変わらずのこのクリックしたことになるという繰り返し、今まではかなりの小細工を弄してなんとか回避させようとしていたんですが、それをとりやめた形での、別のリストを使うという処理ですらまた生じるとは…(~_~;いろいろ全体の流れをおってみたり、また小細工をしてみたりしたんですが、1回目の流れの際、1回流れましたという意味でフラグ(旗)用変数を立てて、2回目ならば回避する、という処理にしてみました。多分他にもうちょっとスマートなやり方はあるんでしょうが、もういい加減このバグ取りもあきてきたので、一番簡単で効果の高いやり方で回避です(^^;

そのバグ取りに奮闘している最中、何回かテストして動かしてみる間に、お、武将を入れるばかりでなくはずす必要もあるな、とか、あ、軍団解散がいる、とか、色々思いつきます。人間も同マ時ル並チ行タ処ス理クができたらステキ!とはいいうものの、こう色々思いつくと手に負えません(^^;とりあえずリストのバグ取りの試し(小細工)とともに、思いついた解散とか武将はずしのプログラムもとりあえず作って動かしてみます。色々エラーやスペルミスなどがあるものの、それなりにちゃんとどれも動きます。リストのバグ取りが完成するころ(フラグによる回避)には解散コマンドも軍団武将はずし処理も再編成も、それなりに動いています。おお!(^O^)

ところが。。まず、できたところを試しに色んな条件で色んな事をしてみてテストしてみました。それなりに動くんですがどうも挙動がおかしい(--;)総大将と参加武将が入れ代わったり、いつの間にか軍団が消えたり、一番厄介なのが、新設→再編成→解散となんどか繰り返していくうちに、なぜか資金が増えていく!( ̄□ ̄;)

錬金術でも裏技でもなく、どこかで変数の代入を間違ってるようです。新設だけならまだしも、新設も解散も再編成もとりあえずできてしまっているため、どこが間違いなのかすぐにはわからなくなってしまっています(‥;)たいてい、大きな流れひとつを作ってみたら、そこでテストしてみて、間違ってないことを確認して次の流れに進みます。ところが今回、とりあえずバグ取りとともに思いついた内容を作っていったため、とりあえずできたものの、内容のテストができてません。これでちゃんとできていればいいんですが、できていないときは…(*_*)

まず疑われるのは、代入部分です。ところがどうも違う。正しく式は書かれています。特に今回、とりあえず作った部分が怪しいながら、色んなエラーというか不具合がいろんな場面で生じています(*_*)別々の複合要因なのか、同じエラーの表現の違いなのか、よくわからない。そもそもどこで起きているのか、わからない。まるでミステリー(^^;;;

こういう時は、色んな部位で止めてみて、変数を確かめるんですが、なぜかうまくいくときと行かないときもあり、特定が難しい!ううむ、困った、とりあえずできてしまってるため、より一層原因追及が難しいな…

以前読んだ本(なぜバグだらけのプログラムを買わされるのか?というような書名だったような…(^^;)には、バグを起こしにくいプログラムを作るには、作っては試し、作っては試し、とするんでなく、最初にきちっと机上で論理的にくみ上げてから、プログラムを書くべし、という内容が書いてありました。まあ、たいていのプログラマーは作っては試し型が好き、とも書いてあり、私もどちらかというとかなりそっちなので(^^;なるたけ最初に論理的に作りきってから、という風にしようしようとしていました。ところが、前回までや今回までの、理屈としてはわかるけれども、クリック処理が2回行われるという聞いたことのない設定のために苦労した経験から、今週はすでにとりあえず作っては試し型に舞い戻っていました。結局見事にバグが出ましたね〜(^^;;;止まるならともかく、動くだけにたちが悪い(--;)

軍団が消えたり、総大将と参加武将が入れ代わるというエラーは、とりあえず作った軍団解散の処理の際、軍団に関するデータの初期化がいい加減だったことが判明しました(^^;じーっと挙動を観察していくうち、ここでおかしいと突き止めることができました。なんだか犯罪捜査みたいですが(^^;これもとりあえずのワナですね。もちろんちゃんと直すとちゃんと動きました(^^;

さらに、何度か軍団を作ったり解散させたりしていくうちに、資金や兵が増えていくという不具合。これもプログラムを眺めていくだけではこんがらがってわからなかったんですが、動かして挙動を見て、さらにもしかすると、城データの受け取りがおかしいのか?と城のデータを城ごとに変えてみたりしてようやくワナを見つけました!再編成の際の最後の武将の役職や兵数などを変更する画面にいく直前、本来なら軍団の番号と場所のデータを渡す部分に、軍団の番号と総大将の番号を渡していました(^^;;;

実はずいぶん前、軍団新設のプログラムを作っていた際、再編成のことも考えつつプログラムを組んでいました。何もないところから、まだ作ってもいない再編成のことを考えつつ、共通利用しようという思いで、これはこうかなと、それこそ同マ時ル並チ行タ処ス理クではないですが、一度に新設と再編成それぞれに対応できるよう頭の中で書いていました(^^;ところが例のバグのせいで、新設と再編成のそれぞれ作る間がずいぶん開いてしまいました(;_;)しかも新設の際は小細工にまみれていましたが(^^;再編成ではとりあえずでも動くほど簡単な内容ですみ、その結果、再編成の方がプログラム的にきれいなものになっていました。結局、新設の際に考えていたような再編成の処理は実際には取られず、新設再編成どちらにとっても無駄な情報渡し部分となっています(^^;

結局、再編成の部分がとりあえずのワナだったんですけども、なくても動くのに、それに依存していたため、動くけどおかしい、という結果になっていました。しかも、よくテストに使う劉備は、番号も3で、城の番号も3だったため、場所と総大将が同じであったため、このままでは間違いに気づきません(^^;もう一人別に、諸葛亮が番号が8だったため、8城のデータが渡されてようやくおかしいことに気づいた、これが真相です(^^;それも、当初はどの城もデータが同じだったため新設だけではやはり気づかず、なんどか解散と再編成を繰り返していくうちに、データに矛盾が生じてようやくわかりました。ああ危ない(^^;

というような感じで、ようやく、ほんとうにようやく、軍団設置ができました(^^;何度か試しましたがとりあえず矛盾はでていません。ああ疲れた(^^;;;この間色々プログラムを変えてしまったため、他の部分へもかなり影響がでてきてそうですが、まあ、一番ややこしい軍団ができたからまあいいでしょう(^^;…あ、武将を軍団役職からはずす処理がまだだ…(^^;;;

index

〔TopPage〕

このページへのリンクはフリーです。
このページについてのご意見、ご質問などは、kr_ryo_green@yahoo.co.jpまでお願いします。
Copyright 2003© kr_ryo All rights reserved.
訪問件数