- 締切済み
freadを使用した構造体に乱数を発生させ
タイトルの通りなのですが 一度.binファイルに構造体(date)を読み書きさせ、その構造体で乱数を発生させランダムにキャラを指定の部分に表示させるプログラムなのですが、どうしても配列として扱えないのか乱数部分に(teki)を入れてもエラーになったりしてしまいます。 このプログラムで乱数→配列に代入→配列の[0][1]の取り出し→表示 は可能でしょうか。 すべて書けなかったので一部抜いています typedef struct{ char name[10]; int life; int MP; int att; int defe; }TEKI; TEKI date[20]={ {"ソリッド ",100,100, 90, 80}, {"リキッド ",100,100, 70, 80}, (略) {"マンティス ",100, 80, 70, 70}, {"ビッグ.ボス",100,100, 90, 90}, },*OFF,*DEF,MC[2],teki; srand((unsigned)time(NULL)); /*-------書き込み-------*/ //テキスト 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),21,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]; /*----------------------*/ 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); _getch(); fclose(fp_txt); fclose(fp_bin);
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- yama5140
- ベストアンサー率54% (136/250)
ゲームは作ったことありません。 トンチンカンな回答となるかも・・。 ++++++++++++++++++++++++++++++++++++ 仮定 ・このプログラムは、まだまだ、「設計」もあやふやな(?失礼)ポンチ絵?的なものである。 ・冒頭で、バイナリファイルに出力しているが、本来は終了時に行うものである。 ・バイナリファイルを用いるのは、ゲーム再開のための保存データを不可視化するためである。 回答 >このプログラムで乱数→配列に代入→配列の[0][1]の取り出し→表示 >は可能でしょうか。 「このプログラムで」は、teki は配列ではないし、OFF DEF は使われていないし・・。 OFF DEF MC[] 構造体でのやりとりは、まどろっこしいような・・。 sen kou を使えば MC[], OFF, DEF は不要では?・・◆。 でも、ゲームプログラムの世界では常道というか、なんか?あるのだろうか?。 ban の「初期値」に関係あるのだろうか?。 char name[ 16 ]; // +++++"ビッグ.ボス" 11文字 +++++ ・ TEKI teki[ 20 ]; // +++++ 配列に +++++++ ・ ・ fread( &teki, sizeof( teki ), 1, fp_bin ); // +++++ 配列に読み込み +++++ ・ ・ pos.X = 50; pos.Y = 5; SetConsoleCursorPosition( hStdout, pos ); printf( "[%s]", teki[ sen ].name ); // +++++++◆+++++++ pos.X = 16; pos.Y = 13; SetConsoleCursorPosition( hStdout, pos ); printf( "[%s]", teki[ kou ].name ); // +++++++◆+++++++ (COORD pos; HANDLE hStdout; 等を加え「エラーにはならない」ことを確認)
- osamuy
- ベストアンサー率42% (1231/2878)
他の回答者さんから問題点の指摘を受けてるみたいなので、とりあえず適当に書き直してみたり: http://ideone.com/WEXOv コードの説明は略。まあ雰囲気をつかんでいただくための参考程度ということで。 実行結果は添付画像(見にくいでしょうが)。ideoneでファイル作成は無理だったので。 一応、以下で確認。 Microsoft(R) C/C++ Optimizing Compiler Version 15.00.30729.01 for x64 gcc version 4.3.2 (Debian 4.3.2-1.1)
- asuncion
- ベストアンサー率33% (2127/6289)
>どうしても配列として扱えないのか乱数部分に(teki)を入れてもエラーになったりしてしまいます。 どんなエラーが出るのですか? そこらへんを教えてもらわないと、的確な回答はできません。 > fread(&teki,sizeof(TEKI),21,fp_bin); 21の意味は何ですか?
- Tacosan
- ベストアンサー率23% (3656/15482)
えぇと.... teki の型は? あと, date はちょっとはずかしいかも & fp_bin の fopen/fclose が対応してないような感じもする.