頓珍漢なことをお聞きするようではずかしいのですが、
倒したモンスターの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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
3つに分かれたヘッダー・フッ...
-
100pcsとは
-
初期化した構造体データを再度...
-
エクセル まるめ
-
開発者向けオプションの 4x MAS...
-
パソコンにGPU自体が全くないこ...
-
PCSX2を遊んでます。時々重くな...
-
最近、VALORANTと言うゲームを...
-
ハイゼットのラジオのあわせ方
-
ノートPCでのモンハンアイスボ...
-
エミュのPCSX2で遊んでいるんで...
-
スカイリム重いです。
-
デスクトップのPCがほしいです...
-
PC版のDBDが起動できない
-
鉄拳8はスト6と比べて難しいで...
-
Steam版(PC)アーマードコア6の...
-
FIFA22がPS5、PS4で出てますが...
-
トルネコの大冒険2をプレイした...
-
PUBGがクラッシュします。 最初...
-
検討しているPCの構成を見てい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
3つに分かれたヘッダー・フッ...
-
今のpcってWindows7入れること...
-
ゲーミングpc
-
discordつないで、MH、apexを2...
-
100pcsとは
-
why would I everという曲探し...
-
予告編を見たあの映画のタイト...
-
ガレリアのpcからレベル♾️のpc...
-
カーペンターズをカバーしてい...
-
DOCOMO携帯で面白いゲームを教...
-
初期化した構造体データを再度...
-
DVDソフトの寿命
-
.htaccessの書き方-PCページと...
-
LaVie L LL770/CDのバッテリー...
-
激安PC
-
opera mailが文字化けします。
-
ALIEN WAREノートパソコンでニ...
-
東京中央区日本橋、三越前の再...
-
サブドメインの委譲(転送)
-
エクセルでSUMIF関数を使って管...
おすすめ情報