頓珍漢なことをお聞きするようではずかしいのですが、
倒したモンスターのHPが0のまま、画面から消えても動き回っているのですが、
構造体のデーターを初期化してモンスターを画面に再び出させるにはどうすればいいでしょうか?
いろいろネットで調べてみたのですが、初期化する関数の作り方がいまいちよくわかりません。
構造体の初期化データを別でよういしたらいいらしいのは、なんとなくわかるのですが、
データだけをgame_end関数にもっていっても、
error C2082: 仮パラメーター 'pc' が再定義されました と出て、コンパイルがうまくいきません。
よろしくお願いします。
//まだ、モンスター一匹だけです。
typedef struct character
{
int y; //座標
int x;
char name[16];
int room; //dungeon[room][y][x];
int lv;
int hp;//ヒットポイント
int atk;
int lack;
int gold;//所持金
}PC;
//初期化データ
PC pc[2]=
{
{0,2,"Player",0,0,50,5,3,10},
{4,5,"Slime",0,0,7,3,1,30}
};
int main(void)
{
srand((unsigned)time(NULL));
while ((ch = _getch()) != 27) /* 27 = Esc key で強制終了*/
{
keyinput();
monster();//乱数で、4方向移動
system("cls");
status(); //pc[0]{0,2,"Player",0,0,50,5,3,10},の内容をprintf()で表示するだけです。
dungeon();//10x10でダンジョンとキャラの表示
game_end(pc);
}
}
void dungeon(void)
{
for(int y=0;y<10;y++){
for(int x=0;x<11;x++){
/*ここら辺が怪しいのかなとは思うのですが、倒した後、姿を消したいのでこうしました。*/
if((y==pc[0].y&&x==pc[0].x)&&(pc[0].hp>0)){//HPが0以下なら表示しない
printf("@");
}else if((y==pc[1].y&&x==pc[1].x)&&(pc[1].hp>0)){//HPが0以下なら表示しない
printf("巣");
else if(dungeon[room][y][x]==1){
printf("■");//壁
}else{
printf(" ");//移動できる場所(全角スペース)
}
}
}
略
game_end(PC pc[]){
略
if(pc[0].hp<0||pc[0].hp==0){ //hpが0以下になったらhpに0を入れる
pc[0].hp=0;
printf("モンスターに敗れた・・・\nGAME OVER\n");
/*
error C2082: 仮パラメーター 'pc' が再定義されましたと出るので、コメントアウトさせてます。
PC pc[2]=
{
{0,2,"Player",0,0,50,5,3,10},
{4,5,"Slime",0,0,7,3,1,30}
};
*/
}else if(pc[1].hp<0||pc[1].hp==0){//hpが0以下になったらhpに0を入れる
pc[1].hp=0;
printf("モンスターを倒した!\nGAME CLEAR\n");
/*
error C2082: 仮パラメーター 'pc' が再定義されましたと出るので、コメントアウトさせてます。
PC pc[2]=
{
{0,2,"Player",0,0,50,5,3,10},
{4,5,"Slime",0,0,7,3,1,30}
};
*/
}
exit(0);
//この後の処理がわからず、exit(0)を入れて終わらせて立ち上げなおしてます。
}
No.1ベストアンサー
- 回答日時:
こんにちは
> error C2082: 仮パラメーター 'pc' が再定義されました
これは、pc[0],pc[1]が(関数の?)仮引数として既に存在し使用している場所で、またpc[1],pc[2]を宣言しているのでエラーになります。
https://msdn.microsoft.com/ja-jp/library/k4h61sx …
> PC pc[2]={……}
この記述は、構造体変数の宣言(生成)と初期化になります。
既に存在するPC型構造体の初期化には、それ用の関数を定義して各メンバ変数を初期化する様にしましょう。
----------------------------
#include <string.h> /* strncpy( )で必要 */
#define NAMESIZE 16 /* 名前の最大文字数 + 1 */
void initPC(PC *pc, int y, int x, const char *name, int room, int lv, int hp, int atk, int lack,int gold)
{
pc->y = y;
pc->x = x;
strncpy(pc->name, name, NAMESIZE);
pc->name[NAMESIZE - 1] = '\0';
pc->room = room;
pc->lv = lv;
pc->hp = hp;
pc->atk = atk;
pc->lack = lack;
pc->gold = gold;
return ;
}
----------------------------
定義した初期化用関数を初期化したい場所で呼び出します。
引数の最初が初期化するPC型構造体(のアドレス)です。
initPC(&pc[0],10,2,"Goblin",0,0,50,5,3,10);
initPC(&pc[1],10,2,"Dragon",0,0,1000,5,3,10);
No.2
- 回答日時:
#include <string.h>
#include <ctype.h>
typedef struct character
{
int y; //座標
int x;
char name[16];
int room; //dungeon[room][y][x];
int lv;
int hp;//ヒットポイント
int atk;
int lack;
int gold;//所持金
} PC;
//初期化データ
PC pc[2];
pc[0].room = 0;
pc[1].room = 0;
int main(void)
{
Init_Room_PC(0);
srand((unsigned)time(NULL));
printf("[Esc]=Game End , [Hit Any Key]=Game Start\n");
while ((ch = _getch()) != 27) /* 27 = Esc key で強制終了*/
{
if(toupper(ch) != 'C') {
Init_Room_PC(pc[0].room);
} else {
Init_Room_PC(0);
}
keyinput();
monster();//乱数で、4方向移動
system("cls");
status(); //pc[0]{0,2,"Player",0,0,50,5,3,10},の内容をprintf()で表示するだけです。
dungeon();//10x10でダンジョンとキャラの表示
game_end(pc);
}
}
void dungeon(void)
{
for(int y=0;y<10;y++){
for(int x=0;x<11;x++){
/*ここら辺が怪しいのかなとは思うのですが、倒した後、姿を消したいのでこうしました。*/
if((y==pc[0].y&&x==pc[0].x)&&(pc[0].hp>0)){//HPが0以下なら表示しない
printf("@");
}else if((y==pc[1].y&&x==pc[1].x)&&(pc[1].hp>0)){//HPが0以下なら表示しない
printf("巣");
else if(dungeon[room][y][x]==1){
printf("■");//壁
}else{
printf(" ");//移動できる場所(全角スペース)
}
}
}
略
game_end(PC pc[]){
略
if(pc[0].hp <= 0){ //hpが0以下になったらhpに0を入れる
pc[0].hp=0;
dungeon();
printf("モンスターに敗れた・・・\nGAME OVER\n");
printf("[Esc]=Game End , [C]=Continue\n");
}else if(pc[1].hp <= 0){//hpが0以下になったらhpに0を入れる
pc[1].hp=0;
dungeon();
printf("モンスターを倒した!\nGAME CLEAR\n");
pc[0].room += 1;
pc[1].room += 1;
printf("[Esc]=Game End , [C]=Continue\n");
}
}
// 部屋番号でPC構造体を初期化する
int Init_Room_PC(int aroom) {
if(aroom == 1) {
ClearPC(&pc[0], 8, 1, "Player", aroom, 0, 50, 5, 3, 10);
ClearPC(&pc[1], 1, 8, "Slime", aroom, 0, 7, 3, 1, 30);
} else {
ClearPC(&pc[0], 1, 2, "Player", aroom, 0, 50, 5, 3, 10);
ClearPC(&pc[1], 4, 5, "Slime", aroom, 0, 7, 3, 1, 30);
}
}
// PC構造体の初期化
int ClearPC(PC * apc, int ay, int ax, char *aname, int aroom, int alv, int ahp, int aatk, int alack, int agold)
{
apc->y = ay;
apc->x = ax;
strcpy(apc->name, aname);
apc->room = aroom;
apc->lv = alv;
apc->hp = ahp;
apc->atk = aatk;
apc->lack = alack;
apc->gold = agold;
}
ありがとうございました。
無事に、ダンジョンに潜ることでも、初期化して動いてくれるようになりました。
本当は、お二人につけたいところなのですが、今回は、先に回答していただいた方へベストアンサーとさせいただきました。申し訳ないです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
3つに分かれたヘッダー・フッ...
-
DOCOMO携帯で面白いゲームを教...
-
パソコンで絵文字を使いたい
-
100pcsとは
-
カーペンターズをカバーしてい...
-
PCSX2を遊んでます。時々重くな...
-
開発者向けオプションの 4x MAS...
-
最近、VALORANTと言うゲームを...
-
ハイゼットのラジオのあわせ方
-
パソコンの質問です。pc初心者...
-
PUBGがロード画面から進まない
-
今さらですが幻想水滸伝(1)...
-
エミュのPCSX2で遊んでいるんで...
-
鉄拳8はスト6と比べて難しいで...
-
4万円以内のノートパソコンでラ...
-
PC版スカイリムのプレイ画面の...
-
PCにGPUが搭載されているかの確...
-
電子書籍は紙の本と同じ金額を...
-
スト6 Steam版。何かもっさり...
-
パソコンにGPU自体が全くないこ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
3つに分かれたヘッダー・フッ...
-
今のpcってWindows7入れること...
-
100pcsとは
-
discordつないで、MH、apexを2...
-
カーペンターズをカバーしてい...
-
ラズベリーパイ Windows
-
中古のpcでも、買ってすぐの新...
-
激安PC
-
GTA5の動作環境について 僕はpc...
-
CD,MD,DVD,DATの標本化周波数に...
-
ゲーミングpc
-
新たにノートパソコンを買いた...
-
https://www.amazon.co.jp/dp/B...
-
スペック(仕様)に関する各項...
-
コラ画像を作るには、pcとiPad...
-
パソコンで絵文字を使いたい
-
エクセル まるめ
-
ディラック方程式の平面波解の...
-
表示されません
-
初期化した構造体データを再度...
おすすめ情報