チケットを切っておきます

書籍情報 | MF文庫J オフィシャルウェブサイト
amazon:彼女と二人で「C」体験!
物語としては普通に読めます。最近読んだラノベの中ではかなり良かった方*1です。


ただ……モノが「誤って使うと自分の首を刎ねる銃」として定評のある C 言語なので突っ込みを入れておきます。軽い気持ちで C に手を出さないように配慮願います(ぉ
今、入門的にいいのは HTML5 が来る事を見越して javascript ではないでしょうか。画面とか作って動かして面白いですしね。……まあ、これはこれで「誤って使うと自分の指を折る銃」だったりするわけですがw

これは C++ です

C 言語じゃなくて C++ で書かれています。拡張子もちゃんと cpp になっているのがいいですね。C / C++ 混在で開発する場合、必ず分けておきましょう。
C++ の拡張子は C(大文字)でもいいといえばいいので、C プログラムだ! と主張できなくもないですがw

「しー」に「えっち」は必須ではありません

本文では言及されていますが、帯で煽ってるので念のためw もちろん、h の無いプログラムなんかコミットしてきたら、速攻で差し戻しますけどね!


そんなわけで #include プリプロセッサ指令の働きを調べて理解しておきましょう。
clown on Twitter: "C++ と言うか C で今までで一番「ああその発想はなかった」てのは,int hoge[] = { #include "hoge.csv" };"
これとか見て、「あぁ!」と思えるレベルが目安です(ぇ

継承関係がおかしいです

親クラスと子クラスが逆に宣言されてます。「メモに書かれていた」という事なので単なるお姉ちゃんのミスでしょう。眠たい頭で書いたメモだとしばしばそんな事故があります。
そんなわけで、この本の宣言を参考にクラスの宣言を書いてはいけません。

ポインタのサイズ

ポインタのサイズは処理系依存です。つまり、Nintendo 64 のような 64bit マシンとぴゅう太のような 16bit マシンではサイズが異なるのです。ポインタのメモリサイズを気にするようなプログラムを書いていいのは闇プログラマーだけです。

定数

#define はただのプリプロセッサ指令です。C++ では定数は #define ではなく const を使いましょう。


後、0 で始まる数値は 8 進数として解釈されるので 8 は使えません。定数そのものが数値として扱われている場合にはコンパイルエラーになっているはずで、トラップとして使われているのが例外処理なあたり、文字列から数値への変換で例外を発生させるというタイプのものである気もします。
が、という事はソースの中では文字列として扱っているわけで、定数宣言も文字列であるはずです。こういう分かりにくい処理&定数宣言はアウトです。

例外処理

例外処理の最中にファイルの削除とかそこで二重に事故が起きそうな(実行中の exe は消せないはずですし、読み込まれているリソースの処理も怪しいですよね?w)処理はやってはいけません。そんなプログラムは……全没にしますよ!

ライブラリは分けて欲しかった

インポートライブラリと実行時ライブラリが分かれていないようです。empirex.lib が本体って事なので、間違いなく静的ライブラリです。そんな make ファイルも不具合です。
empirex.lib はその他リソースをあわせても GB も無いそうですが、数百 MB ある静的リンクライブラリなんて使いたくありません。ほぼほぼ全部リソースだと信じたいところです。


ところでこのシステム、おそらく能力値はアルゴリズムから算定されるのだと思いますが、最強ユニットの評価値を低くするのはいいアイデアですね。
素直に考えて、索敵や攻撃のアルゴリズムは評価値から決定するでしょう。するとリアクションで格段に能力が上昇するユニットを設計すると相手の戦略を崩壊させ得るわけです。
……つまり、「弱ユニットが重要ポイントに配置されている」と判定されれば、当然相手はそこを狙うわけで、その弱ユニットが実は「アタックに対するリアクションでブーストがかかる」ユニットであれば、相手の戦略が瓦解するわけです。これは面白いフェイクです。

*1:ただし、地雷原は踏み抜いてから評価するのがマイ・ジャスティス! な人です