ここから本文です

C言語のプログラミングについての質問です(丁半ゲーム)作成

niz********さん

2009/4/2920:10:43

C言語のプログラミングについての質問です(丁半ゲーム)作成

まず、所持金設定を行い、掛け金を入力。
サイコロを2つ用意し、ランダムに1から6の目をだす。
2つのサイコロの目の和が偶数なら「丁」、奇数なら「半」。
「丁か半か」を入力し、どちらになるか当てます。サイコロの目を表示して、正解・不正解を判断します。
当たれば掛け金を所持金に加え、不正解なら所持金より差し引いていく。

丁を選ぶ場合は0と入力 半を選ぶ場合は1と入力

ゲームを続ける場合0と入力、終了する場合1と入力


使える関数は#include<stdio.h>,#include<time.h>,#include<string.h>,#include<stdlib.h>

↓のパターンのプログラムにする場合の答えもできればお願いします。
追加1
丁か半かを選ぶとき「0」「1」以外の値を入力した時、入力をやりなおさせる。
追加2
ゲームを続けるか、終わるかの入力時「0」「1」以外の
値を入力した場合、入力のやり直しをさせる。


↑の条件に当てはまるように丁半ゲームをつくっていただけないでしょうか??
お願い致しますm(__)m

初心者なので自力ではできませんでした;

補足#include<time.h>

#include<string.h>

#include<stdlib.h>

void main(void)
{
int kakekin,motokin,tyou,han;

int cho_han,me1,me2,kekka,cont;

char kekka_str[8];

printf("あなたの所持金は?⇒");
scanf("%d",&motokin);

ここまでしかできていません;

閲覧数:
3,039
回答数:
3
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

inb********さん

編集あり2009/5/519:22:09

補足しておきます。scanf関数は、バッファオーバーフローを起こす可能性があるので使用しないほうが賢明です。
以下のソースは、
所持金が0になるとゲーム終了となります。
所持金・掛け金が0かマイナス、もしくは数値以外を指定した場合は再び入力を促します。
scanf関数の代わりにfgets関数とatol関数、rewind関数を使用しております。
0か1を指定するところではfgets関数を使い、
fgets関数の戻り値である「文字コード」から数値に変換するため0x30マイナスしてあります。
fgetsを2回続けて使っているのは、1回目のfgetsで改行コードが読み込まれてしまっているため、
2回目のfgets関数で読み捨てているためです。

単体テストも私としてはしっかり行っているので大丈夫だと思います。

=====↓以下がソースです =====
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
long syozikin;
int kakekin;
int chou_han;
int syuuryou_hantei;

char c_syozikin[10];
char c_kakekin[10];

int result;
char err_flug;

int saikoro_1;
int saikoro_2;


/* 所持金の入力 */
printf("あなたの所持金は?⇒");
memset(c_syozikin, 0x00, sizeof(c_syozikin));
rewind(stdin);
fgets(c_syozikin, sizeof(c_syozikin), stdin);
syozikin = atol(c_syozikin);
/* 所持金が1未満の場合、異常終了 */
if(syozikin < 1){
printf("所持金の入力が不正です\n");
exit(1);
}

/* ゲームを続ける場合はここから繰り返す */
do{
/* 掛け金の入力 */
do{
err_flug = 0;

printf("掛け金を入力してください⇒");
memset(c_kakekin, 0x00, sizeof(c_kakekin));
fgets(c_kakekin, sizeof(c_kakekin), stdin);
kakekin = atol(c_kakekin);
rewind(stdin);

/* 掛け金が1未満の場合、異常終了 */
if(kakekin < 1){
printf("掛け金の入力が不正です\n\n");
err_flug = 1;
}

printf("現在の所持金: %ld 掛け金: %ld\n\n", syozikin, kakekin);

/* 所持金より掛け金の方が多い場合、異常終了 */
if(syozikin - kakekin < 0){
printf("エラー: 掛け金が所持金をオーバーしています。\n");
printf("現在の所持金: %ld\n\n", syozikin);
err_flug = 1;
}
}while(err_flug);

do{
err_flug = 0;
/* 「丁か半か」を入力 */
printf("丁か半を入力してください(丁…0、半…1)⇒");
rewind(stdin);
chou_han = fgetc(stdin) - 0x30;
fgetc(stdin);

/* 丁か半以外(0か1以外)を入力している場合、ループ */

if(chou_han != 0 && chou_han != 1){
/* 標準入力を読み捨てする */
printf("エラー: 丁か半(0か1)を入力してください。\n\n");
err_flug = 1;
}
}while(err_flug);

printf("あなたの入力値: %d(%s)\n\n", chou_han, chou_han? "半": "丁");

/* サイコロ1 */
srand(time(NULL));
saikoro_1 = rand() % 6 + 1;
/* サイコロ2 */
saikoro_2 = rand() % 6 + 1;

/* 丁か半かを格納 */
result = (saikoro_1 + saikoro_2) % 2;

printf("サイコロの目: %d と %d 結果は ", saikoro_1, saikoro_2);
if(result) printf("半\n\n");
else printf("丁\n\n");

/* 正解・不正解を判定 */
if(result == chou_han) syozikin += kakekin;
else syozikin -= kakekin;


printf("現在の所持金: %ld\n\n", syozikin);

/* 所持金が1未満の場合、ゲーム終了 */
if(syozikin < 1){
printf("所持金が%ldとなりましたので終了します\n", syozikin);
break;
}

/* ゲームを続けるか? 終了するか? */
do{
err_flug = 0;
printf("ゲームを続けますか?(続ける…0、終了する…1) ⇒");
rewind(stdin);
syuuryou_hantei = fgetc(stdin) - 0x30;
fgetc(stdin);

if(syuuryou_hantei != 0 && syuuryou_hantei != 1){
printf("\n続ける…0、終了する…1のどちらかを入力してください\n\n");
err_flug = 1;
}
else if(syuuryou_hantei == 0){
printf("現在の所持金: %ld\n\n", syozikin);
}

}while(err_flug);
}while(!syuuryou_hantei);


return 0;
}
===== ↑ここで終了 =====

ここで一つ提案です。所持金は最初に指定するのではなく、ファイルに金額が書かれてあって
そのファイルから金額を読み込み、1ゲームが終わったときにすぐさま金額をそのファイルに書き込む
といった処理の方が自然だと思います。
初心者ということですので、もう少し勉強が進んだら一度試して見ると勉強になると思います。

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

gaz********さん

2009/4/3020:01:43

丁か半か求めるとこだけ。
main(void){
int xi1,xi2;
int yosou;
int kekka;
srand((unsigned)time(NULL));
while(1){
scanf("%d",&yosou);
if(yosou==0 || yosou==1)break;
else printf("入力値不正\n");
}
xi1=rand()%6+1;
printf("1個目%d\n",xi1);
xi2=rand()%6+1;
printf("2個目%d\n",xi2);
kekka=(xi1 + xi2)%2;
if(kekka==0)printf("丁\n");
else printf("半\n");
if(yosou==kekka)printf("アタリ");
else printf("ハズレ");}

nog********さん

2009/4/2920:31:33

自力でどこまでやったか書いてあればまだしもなんだけどねえ。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる