アプリ版:「スタンプのみでお礼する」機能のリリースについて

頓珍漢なことをお聞きするようではずかしいのですが、
倒したモンスターの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)を入れて終わらせて立ち上げなおしてます。
}

A 回答 (2件)

こんにちは



> 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);
    • good
    • 0
この回答へのお礼

ありがとうございます。無事に動かせるようになりました。
追伸
ドラゴンつよーいw

お礼日時:2015/12/17 13:51

#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;
}
    • good
    • 0
この回答へのお礼

ありがとうございました。
無事に、ダンジョンに潜ることでも、初期化して動いてくれるようになりました。
本当は、お二人につけたいところなのですが、今回は、先に回答していただいた方へベストアンサーとさせいただきました。申し訳ないです。

お礼日時:2015/12/17 13:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!