乱数発生、表示

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
MK-22

乱数発生、表示

#1

投稿記事 by MK-22 » 9年前

fread,fwriteで読み書きしたデータを配列的?に乱数発生、格納させたのを表示させるにはどのようにすれば良いのでしょうか
構造体と同じようにteki[]と変更しても
二項演算子 '[' : 'TEKI' は、この演算子または定義済の演算子に適切な型への変換の定義を行いません
と表示されてしまいます。
表示は戦闘画面部分にあります



コード:

#define _CRT_SECURE_NO_WARNINGS
#include  <windows.h>
#include  <stdio.h>
#include  <stdlib.h>
#include  <conio.h>
#include  <time.h>

typedef struct{
	char name[10];
	int life;
	int MP;
	int att;
	int defe;
}TEKI;

typedef struct{
	char *iname;
	short X;
	short Y;
}ITEM;

typedef struct{
	char *mp;
	short x;
	short y;
}MAP;

int main(void)
{

	TEKI date[20]={
		{"ソリッド    ",100,100, 90, 80},
		{"リキッド    ",100,100, 70, 80},
		{"ソリダス    ",100,100, 80, 80},
		{"レイヴン    ", 80,100,100, 30},
		{"ミラー      ",100,100, 50, 50},
		{"メリル      ", 70, 40, 60, 60},
		{"オセロット    ",100,100, 50, 50},
		{"ジョニー    ", 80, 30, 60, 30},
		{"ピューパ   ", 80,  0, 80, 70},
		{"ヴァンプ   ", 80,  0, 80, 40},
		{"オタコン     ", 85,100, 45, 80},
		{"ゼロ      ",100,100, 80, 40},
		{"シギント    ",100,100, 30, 80},
		{"パラメディック",100,100, 60, 60},
		{"ソロー      ",100,100, 70, 70},
		{"ペイン     ",100,100, 70, 60},
		{"フィアー     ",100,100, 70, 80},
		{"オクトパス   ",100,  0, 50, 90},
		{"マンティス    ",100, 80, 70, 70},
		{"ビッグ.ボス",100,100, 90, 90},
	},*OFF,*DEF,MC[2],teki;

	ITEM	item[]={
		{"名前   ",16,5},
		{"LIFE   ",16,7},
		{"MP     ",16,9},
		{"攻撃力",16,11},
		{"防御力",16,13},
	};

	MAP	map[4]={
		{"+―――――――――――――――――――――――+",14,4},
		{"|                                             |",14,5},
		{"+―――――――――――――――――――――――+",14,14},
	};

	HANDLE  hStdout;
    COORD   pos;

	FILE	*fp_txt,*fp_bin;
	int i,n,damage,rnd,wk,sen,kou,rand_hai[20];
	int no,btl;
	int ban=1;
	int flg=0;

	srand((unsigned)time(NULL));
	hStdout = GetStdHandle(STD_OUTPUT_HANDLE);

	/*-------書き込み-------*/

	//テキスト
	fp_txt=fopen("monster.txt","w");
	if(fp_txt==NULL){return -1;}

	for(i=0;i<20;i++){ fprintf(fp_txt,"%s %3d %3d %3d %3d\n",date[i].name,date[i].life,date[i].MP,date[i].att,date[i].defe); }

	//バイナリ
	fp_bin=fopen("monster.bin","wb");
	if(fp_bin==NULL){return -1;}

	fwrite(&date,sizeof(date),1,fp_bin);

	fclose(fp_txt);
	fclose(fp_bin);
	/*----------------------*/

	fp_bin=fopen("monster.bin","rb");
	if(fp_bin==NULL){ return -1; }

	fread(&teki,sizeof(TEKI),1,fp_bin);

	/*--------乱数発生------*/
	for(i=0;i<20;i++)	rand_hai[i]=i;
	for(i=20;i>1;i--){
		rnd=rand()%i;
		wk=rand_hai[i-1];
		rand_hai[i-1]=rand_hai[rnd];
		rand_hai[rnd]=wk;
	}
	sen=rand_hai[0];
	kou=rand_hai[1];

	MC[0]=date[sen];
	MC[1]=date[kou];
	/*----------------------*/


	do{
		system("cls");

		/*-------戦闘画面-------*/	
		SetConsoleTextAttribute(hStdout,BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE);
		pos.X=14;
		pos.Y=3;
		SetConsoleCursorPosition(hStdout, pos);
		printf("戦闘データ");

		SetConsoleTextAttribute(hStdout,FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE); 

		pos.X=map[0].x;
		pos.Y=map[0].y;
		SetConsoleCursorPosition(hStdout, pos);
		printf("%s",map[0].mp);

		pos.Y=map[1].y;
		for(i=0;i<9;i++){
			SetConsoleCursorPosition(hStdout, pos);
			printf("%s",map[1].mp);
			pos.Y++;
		}

		pos.Y=map[2].y;
		SetConsoleCursorPosition(hStdout, pos);
		printf("%s",map[2].mp);
		/*----------------------*/

		ban^=0x00000001;
		OFF=&MC[ban];
		DEF=&MC[ban^0x00000001];


		pos.X=50;
		pos.Y=5;
		SetConsoleCursorPosition(hStdout, pos);
		printf("[%s]",teki.name);

		pos.X=16;
		pos.Y=13;
		SetConsoleCursorPosition(hStdout, pos);
		printf("[%s]",teki.name);

		if(flg==1 || flg==2)	break;

		//コマンド
		pos.X=16;
		pos.Y=15;
		SetConsoleCursorPosition(hStdout, pos);
		printf("1:戦闘体制   2:敵前逃亡");

		pos.Y=16;
		SetConsoleCursorPosition(hStdout, pos);
		printf("(1,2)番号入力=>");
		scanf("%d",&no);

		//戦う
		if(no==1){
			pos.Y=15;
			SetConsoleCursorPosition(hStdout, pos);
			printf("1:体当たり   2:自爆   3:奥義・石破天驚拳");
			pos.Y=16;
			SetConsoleCursorPosition(hStdout, pos);
			printf("(1,2,3)番号入力=>");
			scanf("%d",&btl);

			SetConsoleTextAttribute(hStdout,FOREGROUND_RED|FOREGROUND_GREEN); 
			if(btl==1){	
				pos.Y=17;
				SetConsoleCursorPosition(hStdout, pos);
				damage=rand()%(OFF->att+10);
				DEF->life -= damage;
				if(damage==0)	printf("ノーダメージ\n");
				printf("【%sに%dのダメージ!!!】\n",DEF->name,damage);
			}
			
			//自爆
			if(btl==2){
				pos.Y=17;
				SetConsoleCursorPosition(hStdout, pos);
				DEF->life = 0;
				OFF->life = 0;
				printf("自爆した\n");
				flg=2;
			}

			//奥義
			if(btl==3){
					i=rand()%2;
					if(i==0){
						pos.Y=17;
						SetConsoleCursorPosition(hStdout, pos);
						OFF->life= OFF->life/2;	printf("自分のLIFEが半分になってしまった\n");
					}
					if(i==1){
						pos.Y=17;
						SetConsoleCursorPosition(hStdout, pos);
						DEF->life= DEF->life/2;	printf("%sのLIFEが半分になった\n",DEF->name);
					}
			}
		}

		//敵前逃亡
		if(no==2){
			pos.Y=17;
			SetConsoleCursorPosition(hStdout, pos);
			printf("【%sは敵前逃亡した】\n",OFF->name);	flg=1;	break;
		}
		if(DEF->life < 0){	DEF->life=0;	flg=1;}

		_getch();
	}while(DEF->life >= 0);

	pos.Y=17;
	SetConsoleCursorPosition(hStdout, pos);
	SetConsoleTextAttribute(hStdout,BACKGROUND_RED|BACKGROUND_BLUE);
	if(flg==0)	printf("【     %sの勝利     】\n",OFF->name);
	else	if(flg==1)	printf("【     %sの勝利     】\n",DEF->name);
	else	if(flg==2)	printf("【  両者戦闘不能  】\n");


	SetConsoleTextAttribute(hStdout,FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);  // 文字色を復帰
	pos.X=0;
	pos.Y=24;
    SetConsoleCursorPosition(hStdout, pos);
	fclose(fp_txt);
	fclose(fp_bin);

	return 0;

}

non
記事: 1097
登録日時: 9年前

Re: 乱数発生、表示

#2

投稿記事 by non » 9年前

何を質問されているのかわかりません。もう少し、具体的に説明してもらえると助かります。
non

アバター
みけCAT
記事: 6247
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: 乱数発生、表示

#3

投稿記事 by みけCAT » 9年前

やりたいことがよくわかりません。
提示していただいたコードはコンパイルが通りました。
提示していただいたエラーが出るソースを貼っていただけますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

紅葉

Re: 乱数発生、表示

#4

投稿記事 by 紅葉 » 9年前

配列にデータを読み込んだものをランダムで表示したいということでしょうか?
質問の意味が解らないので上であっている場合shuffleという関数があったはず

閉鎖

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