• ベストアンサー

ブラックジャック

朝からブラックジャックに似たゲームでプログラムを作っています。 朝もこのページの方々にお世話になりました。 ありがとうございます。 そして終盤のにちかづき、〔プレーヤー〕が1と0以外の数字を 入力したときに、〔もう一度入力してください。〕と表示し、また 入力画面が表示されるようにしましたが、コンパイルのときに エラーがでます。 こちらがソースです。 本当に困っています。助けてください。 お願いします!! #include <stdio.h> #include <stdlib.h> int dice(void); int dice2(void); int dice3(void); int dice4(void); int dice5(void); main() { do{ int x=0,y=0,z=0,v=0,point=0,nyuryoku1,w=0,point2=0,point3=0,nyuryoku2=0; printf("ゲームを開始します。\n"); printf("\n"); printf("カードを配ります。\n"); /*関数代入*/ srand(time(NULL)); x=dice(); y=dice2(); z=dice3(); w=dice4(); srand(time(NULL)); v=dice5(); point=y+z; printf("デイーラー>カードは%d と??です。\n",x); printf("プレーヤー>カードは%d と%d です。ポイントは%dです。\n",y, z,point); printf("\n"); printf("プレーヤーの番です。\n"); /*プレーヤー*/ while(point<=21){ srand(time(NULL)); printf("ヒットorスタンド??[ヒット=1;スタンド=0]\n"); scanf("%d",&nyuryoku1); v=dice5(); point=point+v; if(nyuryoku1==1){printf("カードは%d ポイントは%d\n",v,point);} if(nyuryoku1==0){break;} else{ while(nyuryoku1!=90){ printf("入力が正しくありません。もう一度入力してください。\n"); printf("ヒットorスタンド??[ヒット=1;スタンド=0]\n"); scanf("%d",&nyuryoku1); v=dice5(); point=point+v; if(nyuryoku1==1){printf("カードは%d ポイントは%d\n",v,point); break;} if(nyuryoku1==0)break; }} if(point>21){ printf("プレーヤーのポイントは%d\n",point); printf("プレーヤーの負けです。\n"); printf("終了します。\n"); } /*デイーラー*/ printf("デイーラーの番です。\n"); point2=x+w; printf("デイーラー> カードは%d と%d です。ポイントは%dです。\n",x, w,point2); while(point2<17){ point2=point2+v; printf("デイーラー>カードは%d ポイントは%d\n",v,point2); } printf("プレーヤーのポイントは%d、デイーラーのポイントは%d。\n", point,point2); /*結果判定*/ if(point>point2){ printf("プレーヤーの勝ちです。\n"); } if(point<point2){ printf("デイーラーの勝ちです。\n"); } if(point==point2){ printf("引き分けです。\n"); } /*ゲームを続けるか?*/ printf("ゲームを続けますか?[続行=1:終了=0]\n"); scanf("%d",&nyuryoku2); if(nyuryoku2==0){printf("ゲームを終了しました。\n"); break;} }while(nyuryoku2==1); return 0; } /*関数定義*/ int dice(void){ return 1+(rand() % 10); } int dice2(void){ return 1+(rand() % 10); } int dice3(void){ return 1+(rand() % 10); } int dice4(void){ return 1+(rand() % 10); } int dice5(void){ return 1+(rand() % 10); }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.6

しつこくてすまん。修正したコードは考えてないが、 if(point>21){ printf("プレーヤーのポイントは%d\n",point); printf("プレーヤーの負けです。\n"); printf("終了します。\n");  /* 普通に負けた場合には選択し出てくるのに勝手に終了メッセージ出さないでくれ 。続けるか聞いてくれ 終了するためのコードわからないから入れてないんで終了しないけど。 */ }

その他の回答 (5)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.5

訂正 }while(nyuryoku2==1);の前に } が1個足りません は間違い }が足りないのは if(point>21){ の前ですね もう1つアドバイス srand(time(NULL)); もdo ループの前にした方が良いです。 1秒以内でゲームが繰り返されると同じカードが配られます。

回答No.4

return 1+(rand() % 10); } */ /* 厳密にはエースは11にもなるけどね*/

回答No.3

/* 残り。なんであんな中途半端なところで回答が終わっているんだろう */ /*結果判定*/ if(point>point2){ printf("プレーヤーの勝ちです。\n"); } if(point<point2){ printf("デイーラーの勝ちです。\n"); /*ディーラーが21を超えたときの判定は? */ } if(point==point2){ printf("引き分けです。\n"); } /*ゲームを続けるか?*/ printf("ゲームを続けますか?[続行=1:終了=0]\n"); scanf("%d",&nyuryoku2); if(nyuryoku2==0){ printf("ゲームを終了しました。\n"); break; } }while(1); /* breakしているので別に条件は必要ない */ return 0; } /*関数定義*/ /* 一個で十分 */ int dice(void){ return 1+(rand() % 10); } /* int dice2(void){ return 1+(rand() % 10); } int dice3(void){ return 1+(rand() % 10); } int dice4(void){ return 1+(rand() % 10); } int dice5(void){ return 1+(rand() % 10);

回答No.2

#include <stdio.h> #include <stdlib.h> int dice(void); int main() { do{ /*たくさんあった変数を整理*/ /* x = ディーラーの1枚目 y = プレイヤーの1枚目 z = プレイヤーの2枚目 v = プレイヤーおよびディーラーのひいたカード w = ディーラーの2枚目 point = プレイヤーの合計ポイント point2 = ディーラーの合計ポイント nyuryoku1 = ヒットかスタンドか nyuryoku2 = ゲームを終了するか? 乱数の初期化についてはあんまりしらべてないです */ /* whileの条件で使う変数は外で宣言するものみたい */ int x,y,z,v,w,nyuryoku1,point,point2,nyuryoku2; printf("ゲームを開始します。\n"); printf("\n"); printf("カードを配ります。\n"); /*関数代入*/ srand(time(NULL)); x=dice(); y=dice(); z=dice(); srand(time(NULL)); /* 使われてない  v=dice(); */ point=y+z; printf("デイーラー>カードは%d と??です。\n",x); printf("プレーヤー>カードは%d と%d です。ポイントは%dです。\n",y,z,point); printf("\n"); printf("プレーヤーの番です。\n"); /*プレーヤー*/ while(point<=21){ srand(time(NULL)); printf("ヒットorスタンド??[ヒット=1;スタンド=0]\n"); scanf("%d",&nyuryoku1); /* ここで足してはいけない */ if(nyuryoku1==1){ v=dice(); point=point+v; printf("カードは%d ポイントは%d\n",v,point); } else if(nyuryoku1==0){break;} else{ printf("入力が正しくありません。もう一度入力してください。\n"); /* 条件は必要ない while(nyuryoku1!=90){ printf("ヒットorスタンド??[ヒット=1;スタンド=0]\n"); scanf("%d",&nyuryoku1); v=dice(); point=point+v; if(nyuryoku1==1){printf("カードは%d ポイントは%d\n",v,point); break;} if(nyuryoku1==0){break;} } */ } } if(point>21){ printf("プレーヤーのポイントは%d\n",point); printf("プレーヤーの負けです。\n"); printf("終了します。\n"); } /*デイーラー*/ printf("デイーラーの番です。\n"); w = dice(); point2=x+w; printf("デイーラー> カードは%d と%d です。ポイントは%dです。\n",x,w,point2); while(point2<17){ v = dice(); point2=point2+v; printf("デイーラー>カードは%d ポイントは%d\n",v,point2); } printf("プレーヤーのポイントは%d、デイーラーのポイントは%d。\n",point,point2); /* こういうこと? */

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

変数の宣言はdoループの前にしましょう。 }while(nyuryoku2==1);の前に } が1個足りません これでエラーはなくなると思います。警告は出ますが。 あと dice( )-dice5( )はすべて同じなのでdice( )のみで大丈夫です。 srand(time(NULL));は1個だけでよさそうですが

関連するQ&A

  • プログラミング☆

    1から10の乱数を 2つ同時に表示しようとしてるのですが、 実行すると2つとも同じ数字になってしまいます。 また、あとでその乱数の合計(=point) をだしたいのでx、yに乱数を代入したいのですがどのように したらいいのでしょうか?? 心やさしい方、お願いします。 #include <stdio.h> #include <stdlib.h> int dice(void); int dice2(void); main() { int x=0,y=0,point; printf("start this game\n"); printf("here is your card\n"); x=dice(); y=dice2(); point=x+y; printf("your card is %d and %d point is %d\n",x,y,point); return 0; } /*ka-do1*/ int dice(void){ srand(time(NULL)); return 1+(rand() % 10); } /*ka-do2*/ int dice2(void){ srand(time(NULL)); return 1+(rand() % 10); }

  • バグが直りません

    山手線すごろくのプログラムをC言語で作ろうと思い、以下のように作りました。 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<conio.h> char st[][80]={"東京", "神田", "秋葉原", "御徒町", "上野", "鶯谷", "日暮里", "西日暮里", "田端", "駒込", "巣鴨", "大塚", "池袋", "目白", "高田馬場", "新大久保", "新宿", "代々木", "原宿", "渋谷", "恵比寿", "目黒", "五反田", "大崎", "品川", "田町", "浜松町", "新橋", "有楽町", "東京"}; int now=0; int dicenum=1; int pt=30; int stlength=30; int dice(void){ int dc; srand(time(NULL)); dc=rand()%6+1; return dc; } int event(void){ int eve; srand(time(NULL)); eve=rand()%9+1; return eve; } void step(void){ now++; } int turn(void){ int i, d, ev; for(i=1;i<=dicenum;i++){ d+=dice(); } printf("ダイス目は%dです。\n", d); for(i=1;i<=d;i++){ now++; printf("%s\n", st[now]); if(now==stlength){ return 1; } } ev=event(); switch(ev){ case 1: printf("プラス10pt\n"); pt+=10; break; case 2: printf("プラス20pt\n"); pt+=20; break; case 3: printf("プラス50pt\n"); pt+=50; break; case 4: printf("マイナス10pt\n"); pt-=10; break; case 5: printf("マイナス20pt\n"); pt-=20; break; case 6: printf("マイナス50pt\n"); pt-=50; break; case 7: printf("急行\n"); dicenum=2; break; case 8: printf("特急\n"); dicenum=3; break; case 9: printf("新幹線\n"); dicenum=4; break; } if(pt<=0){ return 2; }else{ return 0; } } int main(){ srand(time(NULL)); int status=0; char a; printf("鉄道すごろく(JR山手線)\n"); printf("エンターキーでスタート\n"); scanf("%c", &a); while(1){ while(getch()!='\r'){ ; } if(status==0){ printf("現在地:%s\n%dポイント\n", st[now], pt); status=turn(); }else if(status==1){ printf("ゴール!おめでとう!\n"); break; }else if(status==2){ printf("残念!ポイントがなくなりました。ゲームオーバー。\n"); break; } } return 0; } コンパイルは通ったのですが実行すると"ダイス目は1873695976です。"などとダイス目がものすごく大きな値になってしまいます。原因が全く分からないのでどなたかよろしくお願いします。

  • ifについて

    C言語を最近学び始めました。 以下をコンパイルし、実行しても予期せぬ結果になってしまい、困っています。 #include <stdio.h> #include <time.h> #include <stdlib.h> void retry(int); int main(void); int main(void) { int x,y,yn; srand(time(NULL)); x = rand()%6 +1; //Player y = rand()%6 +1; //CPU printf("Player:%d\n",x); printf("CPU:%d\n",y); if(y<<x){printf("Player > CPU\n");} else if(x<<y){printf("Player < CPU\n");} else {printf("Player = CPU\n");} retry(yn); return 0; } void retry(int yn) { printf("\nRetry ?(Yes=1/No=0)>"); scanf("%d",&yn); if (yn==1){printf("\n\n");getchar();main ();} else if(yn==0){printf("\n\nend");exit(0);} else {retry(yn);}; } サイコロを2人が振り、目が大きいほうが勝ちというものなのですが、 「Player:3 CPU:6 Plyaer>CPU」 といった具合にx,yの値に関わらず「Plyaer>CPU」と表示されます。 何が原因なのでしょうか。 よろしくお願いします。

  • 質問項目をランダムで選択する方法(C++)

    現在C++でアンケートのようなプログラムを作成しています。いまのところ… #include<stdio.h> #include<stdlib.h> #include<time.h> int main(void) { int mondai, q_number; int answer01, answer02, answer03; int point; point = 0; srand( (unsigned int)time(0) ); mondai = 0; for (mondai<2;) { q_number = (rand() % 3)+1; switch(q_number) { case 1: if(mondai<2) { printf("質問1 今何をしたいですか?\n"); printf("1:食べる\n"); printf("2:寝る\n"); printf("3:遊ぶ\n"); printf("4:勉強する\n"); scanf("%d",&answer01); if(answer01==1) {point=point+2;}else if(answer01==2){point=point+4;}else if(answer01==3){point=point+6;}else{point=point+8;} mondai++; } { printf("問題1を選択しましたが、すでに行ったのでパスします\n"); } break; のように作っています。10項目のなかからランダムに5つほど選択し、4択の質問の中にはそれぞれポイントが課されています。5つの質問に答えた跡にポイントを表示したいのですが、なかなかうまくいきません。 どなたかご教授願えないでしょうか?よろしくお願いいたします。

  • サブ関数、メイン関数

    C言語の質問です! ランダムに九九の計算を出題して、キーボードから答えを入力し、正解かどうかを判定するプログラムをつくりたいです。出題の部分をサブ関数、判定の部分をメイン関数として作成する場合、どのようなプログラムの書き方になるのか、教えてください! #include<stdio.h> #include<stdlib.h> #include<process.h> void kakezan(void); void answer(void); void hanrei(void); int a,b,c; int main() { printf("やめるときは、100と入力してください。\n");   while(1){ kakezan(); answer(); hantei(); } return 0; } void kakezan(void) { a=rand() %10; b=rand() %10; printf("%d×%d=",a,b); } void answer(void) { scanf("%d",&c); if(c==100) exit(0); } void hantei(void) { if(c==a*b) printf(">>正解\n"); else printf(">>不正解\n"); printf("\n"); return; } 一応考えてみたのですが、 ちゃんと、判定→メイン  出題→サブ関数になっているのかなとおもって・・・   このプログラムであっているのでしょうか??

  • このプログラムを関数で小分けしたいんですが・・・

    #include <stdio.h> #include <stdlib.h> int main(void) { int n; int player; // プレイヤーの手 int enemy; // 相手の手 srand(0); // 乱数列を初期化 do { puts("じゃん けん (グー:1 チョキ:2 パー:3) "); scanf("%d", &player); //相手の手を計算 enemy = rand() % 3 + 1; // 勝ち負けを判定 if(enemy == player) { printf("あいこ~\n"); } else if(player == 1 && enemy == 2) { printf("Win!\n"); } else if(player == 2 && enemy == 3) { printf("Win!\n"); } else if(player == 3 && enemy == 1) { printf("Win!\n"); } else { printf("Lose・・・\n"); } printf("0を押したら終了。続けるなら適当な数字"); scanf("%d", &n); // n が 0 以外だったら続ける }while(n != 0); return 0; } このように、じゃんけんをするプログラムを作ったのですが メインだけでは出来たのですが、相手の手の判定や勝ち負けの判定などを 上手く関数でコンパクトにまとめたいんですが、 関数を殆ど使った事が無いので良く分かりません。 このプログラムを上手くコンパクトに関数に分けてくれませんか?

  • c言語のフローチャートについての質問です

    #include <stdio.h> int main (void) { int n; for (n=1900; n<2000; n++) { if (n%4==0 && n%100!=10) printf ("%d",n); else if(n%400==0) printf ("%d",n); } printf("\n"); return 0; } をどなたかフローチャートに直してください JIS規格のものでお願いします

  • ヌメロンの対戦相手

    前http://okwave.jp/qa/q7834519.html で質問してとりあえず1人でやるのはできたんですが 1人だとおもしろくないのでコンピュータの対戦相手 をつくりたいと思いました。 でもプログラムがさっぱりわかりません。 どんなプログラムにすればいいでしょうか? もうひとつは一応答えをつくるところはかぶる数字がでる 確立はかなり低いと思うんですが確率が0%ではないので0%にする方法も 教えていただければ幸いです #include <time.h> #include <stdlib.h> #include <windows.h> #include<stdio.h> int kotae,kotae1,kotae2,kotae3;//答え、答え1桁目、答え2桁目、答え3桁目 int yosou,yosou1,yosou2,yosou3;//予想、予想1桁目、予想2桁目、予想3桁目 int Ekaunnta;//イートカウンタ int Bkaunnta;//バイトカウンタ int i=0; int z=0; int kota(void); int guess(void); int yoso(void); int main(){ printf("==========================================================\n"); printf("    ヌメロン \n"); printf("     コンピュータの数字を当ててください   \n"); printf("==========================================================-\n"); kota(); while(i==0){ yoso(); guess(); if(yosou==kotae){ i=1; printf("正解!!"); } } rewind(stdin); getchar(); } int kota(void){//答えを作る関数 srand((unsigned)time(NULL)); kotae1=rand() %9+1; kotae2=rand() %9+1; kotae3=rand() %9+1; while(z<1000){ if(kotae1==kotae2){ kotae1=rand() %9+1; } if(kotae1==kotae3){ kotae1=rand() %9+1; } if(kotae2==kotae3){ kotae2=rand() %9+1; } z++; } kotae=kotae1+kotae2*10+kotae3*100; return 0; } int guess(void){//イート バイトを判定する関数 //----------イート判定--------- if(yosou1==kotae1){ Ekaunnta=Ekaunnta+1; } if(yosou2==kotae2){ Ekaunnta=Ekaunnta+1; } if(yosou3==kotae3){ Ekaunnta=Ekaunnta+1; } //--------------ここまで------- //--------------バイト判定------ if(yosou1==kotae2){ Bkaunnta=Bkaunnta+1; } if(yosou1==kotae3){ Bkaunnta=Bkaunnta+1; } if(yosou2==kotae1){ Bkaunnta=Bkaunnta+1; } if(yosou2==kotae3){ Bkaunnta=Bkaunnta+1; } if(yosou3==kotae1){ Bkaunnta=Bkaunnta+1; } if(yosou3==kotae2){ Bkaunnta=Bkaunnta+1; } //------------ここまで--------- printf("%dE ",Ekaunnta); printf("%dB\n",Bkaunnta); Ekaunnta=0; Bkaunnta=0; return 0; } int yoso(void){//予想を入力 printf("あなたの予想3桁目:"); scanf("%d",&yosou3); printf("あなたの予想2桁目:"); scanf("%d",&yosou2); printf("あなたの予想1桁目:"); scanf("%d",&yosou1); yosou=yosou1+yosou2*10+yosou3*100; printf("あなたの予想:%d\n",yosou); return 0; } とりあえずプログラムはこんな感じです。 かなりわかりにくいとは思いますが回答よろしくお願いします。

  • このソースがわかりません

    #include <stdio.h> #include <time.h> #include <stdlib.h> int card[4][13]; char total[13] = { 11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10 }; char *digit[13] = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" }; char *mark[4] = { "ハート", "ダイヤ", "スペード", "クローバー" }; int drawCard(int h); int main() { int dealer; //ディーラーの引いたカードの合計 int player; //プレイヤーの引いたカードの合計 int draw_digit; //引いたカードの数 int draw_mark; //引いたカードのマーク char y_n; //カードを引くか引かないかの答え srand(time(NULL)); printf("【ブラックジャック】\n"); //ディーラーが引く draw_mark = rand() % 4 + 1; draw_digit = rand() % 13 + 1; card[draw_mark-1][draw_digit-1] = 1; dealer = total[draw_digit-1]; printf("ディーラー一枚目:%sの%s\n", mark[draw_mark-1], digit[draw_digit-1]); printf("他は伏せる\n\n"); //プレイヤーが引く printf("プレイヤー一枚目:"); player = drawCard(1); printf("プレイヤー二枚目:"); player += drawCard(1); //ディーラー2枚目以降 do{ dealer += drawCard(0); } while(dealer <= 16); //プレイヤー3枚目以降 while(player < 21) { printf("もう1枚引きますか?(y/n) > "); scanf("%c" , &y_n); while (getchar() != '\n') { } if(y_n == 'y') { player += drawCard(1); } else if (y_n == 'n') { break; } } printf("\nディーラー:%d点 プレイヤー:%d点\n", dealer, player); //勝敗の判定 if ((dealer <= 21 && player > 21) || (dealer <= 21 && dealer > player)) { printf("ディーラーの勝ち!\n"); } else if ((player <= 21 && dealer > 21) || (player <= 21 && player > dealer)) { printf("プレイヤーの勝ち!\n"); } else { printf("引き分け\n"); } return 0; } /*カードを引く関数 引数 h:カード内容表示フラグ プレイヤーターンの時は1、ディーラーターンの時は0 戻り値 r:引いたカードの点数 */ int drawCard(int h) { int draw_mark, draw_digit; //引いたカードのマークと数 int r; //引いたカードの点数 char y_n; //カードを11として計算するかどうかの答え do { draw_mark = rand() % 4 + 1; draw_digit = rand() % 13 + 1; } while (card[draw_mark-1][draw_digit-1]); card[draw_mark-1][draw_digit-1] = 1; if(h) { printf("%sの%s\n", mark[draw_mark-1], digit[draw_digit-1]); } if(h && draw_digit == 1) { //プレイヤーターンで引いた数が1のとき do { printf("11として計算しますか?(y/n) > "); scanf("%c" , &y_n); while (getchar() != '\n') { } if(y_n == 'y') { r = total[draw_digit-1]; } else if (y_n == 'n') { r = 1; } } while(!(y_n == 'y' || y_n == 'n')); } else { r = total[draw_digit-1]; } return r; } この「char total[13] = { 11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10 };」の部分がなぜchar型なのかとなぜ、必要なのかです 後もう一つ} while (card[draw_mark-1][draw_digit-1]);のー1はなぜですか?教えてください、おねがいします

  • プログラムの添削

    以下のような数当てゲームを作りました.なるべくうまいプログラムを書けるようになりたいのですが,どのような改善点がありますか?よろしくお願いします. /*数当てゲームを作りなさい.*/ #include<stdio.h> void maegaki(void); /*このように関数を定義しまくることに意味はあるのか?main関数はすっきりするけど.*/ void in_check_out(int i); int main(void) { int i; int j; maegaki(); for(j=0;j<10;j++) { scanf("%d",&i); in_check_out(i); if(!(i-1)) return 0; printf("残り%d回です.\n",9-j); } return 0; } void maegaki(void) { printf("数当てゲームをはじめます.\nぼくの好きな整数を当ててください.\nチャンスは10回です.\nヒントはボゾン\n"); } void in_check_out(int i) { if(!(i-1)) { printf("正解!答えは1です.\n"); } else { printf("残念!\n"); if(i>1) printf("%dより小さいです.\n",i); else printf("%dより大きいです.\n",i); } }