パーティ編成

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
yk61
記事: 2
登録日時: 9年前

パーティ編成

#1

投稿記事 by yk61 » 9年前

C言語で構造体ポインタ、ポインタ関数、ポインタ配列を用いて5人の中から4人のキャラクターを選びそして何度でも隊列変更ができるプログラムを作っているのですがなかなか上手くできません誰か教えてもらえないでしょうか。一応自分で作ったソースも載せておきます。間違っているところを指摘して頂くと幸いです。

コード:

#include<stdio.h>
#include<string.h>
#define MAX 4

typedef struct characterparameter
//////////////構造体の定義////////////////
{
	char job[13];				//職業
	short hp;					//体力
	unsigned char mp;			//魔力
	unsigned char atk;			//攻撃力
	unsigned char def;			//防御力
}Character;

///////プロトタイプ宣言///////

void Inpot(Character*,Character*);
void Status(Character*);
void Init(Character*);
void koukan(Character*);

//////////////////////////////
Character character[5];

int main(void)
{
	printf("よく来たね\n");

	Init(character);

	Character character_select[4];

	Character *party;
	Character *select;

	party=character;
	select=character_select;

	
	
	Inpot(party,select);
	Status(select);
	printf("また来てね");


	rewind(stdin);
	getchar();
	return 0;

}
void Inpot(Character* party,Character* select)
{
	int job,wk,i;
	int restat=1;

	while(restat==0)
	{
		for(int i=0;i<MAX;i++)
		{
			printf("では仲間を4人選んでね\n");
			printf("1:騎士 2:剣士 3:武士 4:戦士 5:ドラゴン(半角数字で入力して下さい) \n>");
			rewind(stdin);
			scanf("%d",&job);
			select[i]=party[job-1];
		}
		printf("これでいいの?\n 0:構わない 1:もう一度やり直す\n>");
		scanf("%d",&restat);
	}
}
void Status(Character* select)
{
	
	for(int j=0;j<MAX;j++)
	{
		//ステータスの出力処理
		printf("職業:%s\n",select->job);		//職業の出力
		printf("HP:%d\n",select->hp);			//体力の出力
		printf("MP:%d\n",select->mp);			//魔力の出力
		printf("ATK:%d\n",select->atk);			//攻撃力の出力
		printf("DEF:%d\n",select->def);			//防御力の出力

		select++;
	}
}
void Init(Character* character)
{
	for(int i=0;i<5;i++)
	{
		Character character[5]=
		{{"騎士",80,60,50,40},
		{"剣士",30,10,50,30},
		{"武士",100,10,100,30},
		{"戦士",50,50,50,50},
		{"ドラゴン",500,0,255,255}};
	}
}
void Koukan(Character* select)
{
	int restat=1;
	while(restat==0)
	{
		int a,b,wk,i;
		printf("何番と何番を入れ替えますか\n>");
		scanf("%d",&a);
		scanf("%d",&b);
		while(1)
		{
			wk=select[a];
			select[a]=select[b];
			select[b]=wk;
		}
		printf("これでよろしいですか\n 0:構わない 1:もう一度やり直す\n>");
		scanf("%d",&restat);
		if(restat==0)
		{
			i=1;
		}else if(restat==1)
		{
			i=0;
		}


}
最後に編集したユーザー yk61 on 2014年11月19日(水) 20:49 [ 編集 2 回目 ]

アバター
Hiragi(GKUTH)
記事: 167
登録日時: 13年前
住所: 大阪府
連絡を取る:

Re: パーティ編成

#2

投稿記事 by Hiragi(GKUTH) » 9年前

とりあえず上に「フォーラムルールはこちら」というボタンがあるかと思いますので、そちらを一通り目を通してください。
なお、この掲示板は丸投げNGですので、現状できている部分の提示や、どこから理解していてどこから理解していないのかを提示してください。
加えて
http://detail.chiebukuro.yahoo.co.jp/qa ... 0138412570
のページでも同様の質問をされていますか? マルチポストの場合その旨を書くことになっていますのでよろしくお願いします。

で、質問についてですが、
「構造体へのポインタ」と「関数へのポインタ」と「配列へのポインタ」を使用し、5人の中から4人を選び出すことができ、その後に隊列変更を回数制限なく行うことが
できるプログラムをC言語で作ることが目的でいいでしょうか?

ちょっと表現が抽象的過ぎて回答が難しいかもしれません。
構造体が持つべき情報は何なのでしょう? 配列は何のために使用するのでしょう? どのような機能を関数化するのでしょう?隊列変更?キャラクターの選出?

その質問がもし学校などで与えられた課題なのであれば(急ぎ?)その旨も書いたほうが回答されやすいかもしれません。
だいがくせい!

yk61
記事: 2
登録日時: 9年前

Re: パーティ編成

#3

投稿記事 by yk61 » 9年前

わかりました、出来ている範囲のソースを載せておきます。

アバター
Hiragi(GKUTH)
記事: 167
登録日時: 13年前
住所: 大阪府
連絡を取る:

Re: パーティ編成

#4

投稿記事 by Hiragi(GKUTH) » 9年前

えっと、フォーラムルールを見ましたか?
http://dixq.net/board/board.html

回答者が困る質問をほぼ網羅してしまっています。
http://dixq.net/board/board.html#trouble

#パッと見た感じですが、初期化すらされていないような...
そんなことはなかったようです、が...
だいがくせい!

アバター
Hiragi(GKUTH)
記事: 167
登録日時: 13年前
住所: 大阪府
連絡を取る:

Re: パーティ編成

#5

投稿記事 by Hiragi(GKUTH) » 9年前

1.23行目でグローバル変数にしているのはなぜでしょう?
2.Koukan関数がプロトタイプ宣言と実際の記述で大文字、小文字が違っています。
3.初期化がされていません、渡された値に対して代入を行う必要がありそうです。for文も意味を成していません。
4.Inpot関数においてそもそもループを通過しません。
5.Koukan関数においてそもそもループを通過しません。また、構造体の内容を無理やりintに入れようとしています。Character型の変数を用意するべきです。
6.Koukan関数においてint iは使用されていません。
7.Koukan関数においてaとbの要素指定が一つ分多いです。

また、Koukan関数が呼ばれていないので、無効化しました。
これらを修正して、とりあえずコンパイルに通るようにしました。

また、キャラクター選択において、1-5以外の数値が入力された場合の動作が不定です。(直してません)

ここまで来ましたが、何がわからなくて、何をしたいのですか?
現段階では、関数へのポインタを使用していませんが、問題がありますか?

コード:

#include<stdio.h>
#include<string.h>
#define MAX 4

typedef struct characterparameter
//////////////構造体の定義////////////////
{
	char job[13];               //職業
	short hp;                   //体力
	unsigned char mp;           //魔力
	unsigned char atk;          //攻撃力
	unsigned char def;          //防御力
}Character;

///////プロトタイプ宣言///////

void Inpot(Character*, Character*);
void Status(Character*);
void Init(Character*);
void koukan(Character*);

//////////////////////////////

int main(void)
{
	Character character[5];
	Character character_select[4];
	Character *party;
	Character *select;


	printf("よく来たね\n");

	Init(character);

	party = character;
	select = character_select;

	Inpot(party, select);
	Status(select);

	printf("また来てね");


	rewind(stdin);
	getchar();
	return 0;

}
void Inpot(Character* party, Character* select)
{
	int job, wk, i;
	int restat = 0;

	while (restat == 0)
	{
		for (int i = 0; i<MAX; i++)
		{
			printf("では仲間を4人選んでね\n");
			printf("1:騎士 2:剣士 3:武士 4:戦士 5:ドラゴン(半角数字で入力して下さい) \n>");
			rewind(stdin);
			scanf("%d", &job);
			select[i] = party[job - 1];
		}
		printf("これでいいの?\n 1:構わない 0:もう一度やり直す\n>");
		scanf("%d", &restat);
	}
}
void Status(Character* select)
{

	for (int j = 0; j<MAX; j++)
	{
		//ステータスの出力処理
		printf("職業:%s\n", select->job);      //職業の出力
		printf("HP:%d\n", select->hp);           //体力の出力
		printf("MP:%d\n", select->mp);           //魔力の出力
		printf("ATK:%d\n", select->atk);         //攻撃力の出力
		printf("DEF:%d\n", select->def);         //防御力の出力

		select++;
	}
}
void Init(Character* character)
{

	character[0] = { "騎士", 80, 60, 50, 40 };
	character[1] = { "剣士", 30, 10, 50, 30 };
	character[2] = { "武士", 100, 10, 100, 30 };
	character[3] = { "戦士", 50, 50, 50, 50 };
	character[4] = { "ドラゴン", 500, 0, 255, 255 };

}
/*
void Koukan(Character* select)
{
	int restat = 1;
	while (restat == 0)
	{
		int a, b;
		Character temp;
		printf("何番と何番を入れ替えますか\n>");
		scanf("%d", &a);
		scanf("%d", &b);
		while (1)
		{
			temp = select[a];
			select[a] = select[b];
			select[b] = temp;
		}
		printf("これでよろしいですか\n 0:構わない 1:もう一度やり直す\n>");
		scanf("%d", &restat);
		if (restat == 0)
		{
			i = 1;
		}
		else if (restat == 1)
		{
			i = 0;
		}


	}
}*/
だいがくせい!

閉鎖

“C言語何でも質問掲示板” へ戻る