コンパイルしてみるとわかりますが、あちこちがおかしくなっています。
・ インクルードガード
"set.h"は合っていますが、"extern.h"や "character.h"は記述がインクルードガードの間違っているので
中身が全て無効になってしまっています。
・ プロトタイプ宣言
"extern.h"のプロトタイプ宣言ですが、各行の最後に ";"がないのでエラーになります。
>set.cppに移して、Extern.hでexternの
>宣言をするように変えてみましたが、こういう解釈でよかったでしょうか?
それでいいと思いますが、";"がないのでエラーになっていますし、
set.hはもう使わないのであれば消しておいた方がいいと思います。
>細かいところも注意していただけないでしょうか
・ extern.hの役割
なんか見ていると全てを extern.hに集めようとしているように見えます。
まだこれくらいの小規模ならそういうやりかたも選択肢として無くはないとは思いますが、
できれば各 .cppに対応した .hを用意してそれぞれの独立性を高くしておいた方が
後々の為にもいいかと思います。
battle.cppに対応した battle.hを用意して、Battle_Set()のプロトタイプ宣言を書きます。
同時に battle.hを battle.cppの先頭でインクルードします。
で、main.cppは battle.hをインクルードすれば main.cppで Battle_Set()が呼び出せます。
この方法の利点は修正時のミスが減ったり、別のプロジェクトでの使い回しも楽になるところです。
・ void main()
mainの戻り値は基本的に intです。
・ グローバル変数 Cと E
そもそもグローバル変数を使う必要があるのかどうかという疑問もありますが、
これは定義と extern宣言が別々になっていますね。
管理する上で、別々になっているとミスが発生しやすいです。
http://www.pro.or.jp/~fuji/mybooks/cdiag/index.html
の第5章で触れられているようなマクロを使って、extern宣言と実体の定義を1行で
やってみてはどうでしょうか。
・ character.hの ifdef MAIN_の中
main.cppからだけ使えるようにしていますが、ここにそれを書くくらいなら
main.cppに static関数として入れてしまった方がいいのではないでしょうか。
・ scanf
戻り値を必ずチェックして下さい。
又、必要なら入力ストリームをクリアして下さい。
それを行わないと、ユーザーが不正文字(数字入力のところでアルファベットを入力するとか)を
力した段階で異常動作が発生します。
・ C+set_chara
ポインタと整数値の演算が多数ありますが、少々読みにくいと感じます。
好みの問題かもしれませんが、(C+set_chara)->Lvと書くくらいなら C[set_chara]->Lvとした方が
判りやすくないでしょうか?
或いは例えば
[color=#d0d0ff" face="monospace]
static void Battle_Avoid(int set_chara, int set_enemy)
{
STATUS *ts = C+set_chara;
int set = ts->AV;
ts->AV = ts->AV*2;
Battle_Attack(E, set_enemy, C, set_chara);
ts->AV = set;
}[/color]
のように一時変数にポインタ値を計算しておいてから使うとか。
・ Battle_Commandのコマンド値
数値によって if文で分岐していますが、ここで数値を直接直値と比較しています。
複数の箇所で使いそうな直値は defineか enumで名前を付けておいた方がいいかと思います。
今後増えたり、値を変更したくなったときに数値を "名前"にしておくと
楽です。
[color=#d0d0ff" face="monospace]#define BTL_CMD_ATTACK 1
#define BTL_CMD_DEFENCE 2
#define BTL_CMD_AVOID 3
if(set == BTL_CMD_ATTACK){
Battle_Attack(C, set_chara, E, set_enemy);
}else if(set == BTL_CMD_DEFENCE){
Battle_Defence(set_chara, set_enemy);
}else if(set == BTL_CMD_AVOID){
Battle_Avoid(set_chara, set_enemy);
}[/color]
とか。