ゲームの結果をファイルに結果の数だけ書き込む

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

ゲームの結果をファイルに結果の数だけ書き込む

#1

投稿記事 by あーす » 8年前

C言語初心者です。どうかご教授いただきますようお願い申し上げます。


#include<time.h>
#include<stdlib.h>

int main()
{
int i;
typedef enum { GU,CHOKI,PA,END }TE;
TE pc,player;/* PCとあなたの手*/
const char *te[] = { "グー", "チョキ", "パー", "終了"};
typedef enum { LOOSE, EVEN, WIN} JUDGE;
const JUDGE result[3][3] = {
{EVEN, WIN, LOOSE},
{LOOSE, EVEN, WIN},
{WIN, LOOSE, EVEN}
}; /* プレイヤーの勝ち負けはresult[player][pc]で得られる */
const char *message[] = { "あなたの負けです", "あいこです", "あなたの勝ちです" };

srand((unsigned)time(NULL));

puts("じゃんけんをします");
for (i = 0; i < sizeof(te) / sizeof(te[0]); i++) {
printf("%dが%sで", i, te);
}
puts("す");

do {
puts("じゃんけん");
scanf("%d",&player); /* 手抜き */
puts("ぽん!");
if (player < 0 || player > END) {
puts("やり直してください");
} else if (player == END)
continue;

pc = (int)(rand() / (RAND_MAX + 1.0) * 3);

printf("あなたは:%s\n", te[player]);
printf("私は:%s\n", te[pc]);
puts(message[result[player][pc]]);
} while (player != END);
main(){
FILE *じゃんけん結果;
fopen("じゃんけん結果.text","w");
fputs(char *[result[player]],FILE *じゃんけん結果);
fclose(file);
return 0;
}
じゃんけんゲームなのですが、此方の結果を自動的にファイルに結果の数だけ書き込ませるためには
どのようにしてプログラムを組んだらよろしいのでしょうか?

どうかこの初心者に、ヒントだけでもご教授ください
宜しくお願い致します。

box
記事: 2002
登録日時: 14年前

Re: ゲームの結果をファイルに結果の数だけ書き込む

#2

投稿記事 by box » 8年前

ザッとこんな流れでしょうか。

コード:

書き込み用のファイルをオープンする。
以下を対戦の数だけ繰り返す。
 ・ジャンケンをする
 ・結果を判定する(勝ちor負けorあいこ)
 ・結果をファイルに書き込む
書き込み用のファイルをクローズする。
ご提示のコードではmain関数が複数見受けられます。それはまずいでしょうね。
また、FILE *型の変数に日本語を使われていますが、あまりおすすめできません。
処理系によっては日本語の変数名が使えるかもしれませんが、一般には使えないものと
思っておく方がいいと思います。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

あーす

Re: ゲームの結果をファイルに結果の数だけ書き込む

#3

投稿記事 by あーす » 8年前

boxさん、返信ありがとうございます。
やはり、main関数を複数使うのはダメですね
コンパイルでもエラーはでていたのですが、それ以外の書き方が分からずそのままコピーしてしまいました。
申しわけありません。

ですが、ずっと考えているのですが、どうしても結果をファイルに書き込むという行為の構文の書き方がわかりません。
ファイルテキストがresult.txtとして

FILE *fp;
fp=fopen("result.txt","w");

これでファイルテキストを開き

じゃんけんをする構文があって
その結果が判定される構文があって

その後に、その結果をファイルに書き込ませる構文を書いて

そのファイルをクローズして
fclose(fp);

return 0;
}
まずこの流れで合ってるのでしょうか。
それともじゃんけんとその結果が判定される構文とはまた別に
ファイルに書き込ませるようとしてもう一度書かなければならないのでしょうか。

そして最後に、その結果をファイルに書き込ませるプログラムの書き方がまったく思い浮かびません。
これを使ってみてはどうか、とか
ここをこうすればできるよ、とかなんでもいいのでご教授ください。よろしくお願いします。

思い浮かんでいるもの
fprintf()←文字列をファイルに書き込むものだからできない?
FPUTS(char*[result[player]],FILE*fp);←identifierを付け忘れていると言われる

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

Re: ゲームの結果をファイルに結果の数だけ書き込む

#4

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

ソースコードを提示する際は、BBCodeを有効にした(無効にしない)状態でBBCodeのcodeタグで囲んでいただけると、見やすくてありがたいです。
あーす さんが書きました:fprintf()←文字列をファイルに書き込むものだからできない?
ファイルに書き込みたいのに「ファイルに書き込むものだからできない」というのはおかしいでしょう。
結果はバイナリで書き込みたいということですか?具体的にどのようなフォーマットで書き込みたいですか?
あーす さんが書きました:FILE *fp;
fp=fopen("result.txt","w");

これでファイルテキストを開き

(中略)

まずこの流れで合ってるのでしょうか。
もしもバイナリファイルを書き込みたいので貼れば、モードは"w"ではなく"wb"を使うべきです。
あーす さんが書きました:FPUTS(char*[result[player]],FILE*fp);←identifierを付け忘れていると言われる
  • C言語の標準ライブラリにfputs関数はありますが、FPUTS関数(大文字で、しかも全角!)はありません。
  • 関数呼び出しの実引数に型名を付けてはいけません。
  • resutlt[player]のまわりに余計な[]があります。
  • FPUTS関数の仕様はわかりませんが、標準ライブラリのfputs関数の第一引数は文字列(へのポインタ)でなければいけないので、これにresult[player]を渡すのは間違っています。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

あーす

Re: ゲームの結果をファイルに結果の数だけ書き込む

#5

投稿記事 by あーす » 8年前

みけCATさん返信ありがとうございます。

テキストファイルやバイナリファイルへの書き込みや読み込みなども通して一旦やり直してみます

あーす

Re: ゲームの結果をファイルに結果の数だけ書き込む

#6

投稿記事 by あーす » 8年前

コード:

int main()
{
	FILE *fp; /*ファイルポインタ宣言*/
	char s[256];
	char c;
	/*(2)ファイルのオープン*/
	/* ここで、ファイルポインタを取得*/
	if((fp = fopen("test.txt","w")) == NULL) {
		printf("file open error!!\n");
		exit(EXIT_FAILURE); /*(3)エラーの場合は通常、異常終了する*/
	}
	while (fgets(s, 256, fp) != NULL) {
		printf("出力されると思う文字%s");
	typedef enum { GU,CHOKI,PA,END }TE;
	TE pc,player;/* PCとあなたの手*/
	const char *te[] = {"グー", "チョキ", "パー", "終了"};
	typedef enum { LOOSE, EVEN, WIN } JUDGE;
	const JUDGE result[3][3] = {
		{EVEN, WIN, LOOSE},
		{LOOSE, EVEN, WIN}, 
		{WIN, LOOSE, EVEN}
		}; /* プレイヤーの勝ち負けはresult[player][pc]で得られる */
		
	const char *message[] = { "あなたの負けです", "あいこです", "あなたの勝ちです" };
	
	srand((unsigned)time(NULL));
	puts("じゃんけんをします");
	for (i = 0; i < sizeof(te) / sizeof(te[0]); i++) {
		printf("%dが%sで", i, te[i]);
		}
		puts("す");
		
	do {
		puts("じゃんけん");
		scanf("%d",&player); 
		puts("ぽん!");
		if (player < 0 || player > END) {
			puts("やり直してください");
			continue;
			} else if (player == END)
		break;
		pc = (int)(rand() / (RAND_MAX + 1.0) * 3);
		printf("あなたは:%s\n", te[player]);
		printf("私は:%s\n", te[pc]);
		puts(message[result[player][pc]]);
	} while (player != END);
	 
	 printf( "\n" );
	 printf( "じゃんけんゲームの結果発表\n" );
	 printf("トータルで[%d]勝[%d]敗[%d]引き分けでした。\n",WIN,LOOSE,EVEN);
	return 0;
}
結果をファイルに保存するよりも前に、結果を集計させなければと思い立ちましてやってるのですが
考えていてもいまいち集計の仕方が分かりません。
上記の50番のようにWIN,LOOSE,EVEN,);とすると、必ず2勝0敗1分けのようになってしまいます。
一体なぜでしょうか、というよりかは、どのようにすればきちんと結果が集計されるようになりますでしょうか?

ご教授の程、宜しくお願いします。

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

Re: ゲームの結果をファイルに結果の数だけ書き込む

#7

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

あーす さんが書きました:上記の50番のようにWIN,LOOSE,EVEN,);とすると、必ず2勝0敗1分けのようになってしまいます。
一体なぜでしょうか
enumによってLOOSEが0、EVENが1、WINが2と定義されているのを、そのまま出力しているからですね。
あーす さんが書きました:どのようにすればきちんと結果が集計されるようになりますでしょうか?
きちんと結果が集計されるようなコードを書いてコンパイルすればいいでしょう。
具体的には、
  • 集計結果を保存する変数を用意し、初期化する
  • じゃんけんの結果が出たら、それにあわせて集計結果を更新する
  • 定数ではなく、保存した集計結果を出力する
といった処理が必要になるでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: ゲームの結果をファイルに結果の数だけ書き込む

#8

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

あーす さんが書きました:上記の50番のようにWIN,LOOSE,EVEN,);とすると、必ず2勝0敗1分けのようになってしまいます。
No: 6のコードには、必要なヘッダがincludeされていない以外に、以下の問題があります。
  • 12行目で、なぜか書き込みモードで開いたファイルから読み込もうとしている
  • 13行目で、printfの書式指定文字列に対し引数が足りないので、実行されれば未定義動作になる
  • 28行目で使用されているiが宣言されていない (コンパイルエラー)
  • 35行目で、scanfの%dに対応する引数はint*を渡さないといけないのに、enum TE*を渡しているので、実行されれば未定義動作になる
  • 12行目の{ (または2行目の{) に対応する}が無い (コンパイルエラー)
どうしてコンパイルが通り、実際に「必ず2勝0敗1分けのようになってしまいます。」という結果が得られるコードを提示しないのですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

あーす

Re: ゲームの結果をファイルに結果の数だけ書き込む

#9

投稿記事 by あーす » 8年前

>みけCATさん
返信ありがとうございます。
どうやらコピーが上手くいっていなかったらしく、修正する前のソースコードが貼られていました。
ご迷惑おかけしました。

あーす

Re: ゲームの結果をファイルに結果の数だけ書き込む

#10

投稿記事 by あーす » 8年前

無事にファイルに結果をかき込むところまで終了しました。
アドバイスをくれた方、本当にありがとうございました。

まだまだこれから質問することもあると思いますが、その時も何卒ご指導ご鞭撻いただけたらと思います。
有難うございました。

閉鎖

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