• 締切済み

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

#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はなぜですか?教えてください、おねがいします

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

うう~ん, total を char にする必然性はないなぁ. int でいいというか, int にする方が自然だと思う. ちなみに A は 1 と 11 の「有利な方」で計算するのが普通です. つまり, 一応 11 で計算しておいてバストするなら 1 として計算し直す. もしくは逆に「A は 1 で計算しておいて, 11以下になるときは 1枚を 11 で計算する」という手もあります. こっちの方が「A が 10枚ある」ような謎のハンドにも自然に対応できるのでいいかもしれません.

全文を見る
すると、全ての回答が全文表示されます。
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

char型は「1文字を表せるビット幅の整数」です。 「文字」や「バイナリーデータの1バイト」として使用することが多いですが、ただの整数として使っても問題ありません。 ただ、 ・ r = total[draw_digit-1]; 等と、実際の計算ではint型を使っている ・最近のPCでは、メモリが十分あるので、数十バイト程度節約しても意味がない。 ・CPUが32bitだと、1バイトアクセスと比べて、32bitまとめてアクセスする方が効率がよい(少なくとも悪くなることはない) ・charだと「文字」を連想させる 等から、intの方が適切かもしれません。 更に言えば、total[]を使わなくても、draw_digitから計算できますね。 if(y_n == 'y') { r = draw_digit + 10; } else if (y_n == 'n') { r = draw_digit; } } while(!(y_n == 'y' || y_n == 'n')); } else { if (draw_digit > 10 ) { r = 10 ;}else{r= draw_digit ; } } ところで。Aの1か11って、引いた時に決めるんでしたっけ? 最後にオープンした時に決めればいいような覚えがあるのですが。 過去にやったことのあるコンピュータゲームでは、Aをどう使うと効果的かは、自動で計算してくれてましたし。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

>この「char total[13] = { 11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10 };」の部分がなぜchar型なのかとなぜ、必要なのか ブラックジャックはあまりやったことがないのですが これはカードごとの点数でしょう。 http://www.bj-10jqka.com/rules/procedure.html つまりchar型じゃなくてもできるはずです。どうせ1バイトで収まる点しかないのだから、char型でいいってことでしょう。 >while (card[draw_mark-1][draw_digit-1]);のー1はなぜですか? 事前に+1しているからです ↓ draw_mark = rand() % 4 + 1; draw_digit = rand() % 13 + 1; draw_mark = rand() % 4; ならば、%4は4で割った時のあまりをしめす(つまり0~3の数字)ので マークの文字列配列の添え字になりますし draw_digit = rand() % 13; ならば、0~12の数字になり数字の文字列配列の添え字になります おそらく、この数字をカードの数字に一致させるために draw_digit = rand() % 13 + 1; としているのですが、見る限りこの必要はないと思います。 どの道+1したかわりに、配列にアクセスするときに-1しているからです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語のソースコードについて教えてください。

    以下のソースコードを学習用C言語開発環境で行ったのですが、 『ファイル「C:/Users/ユーザー名/AppData/Local/EasyIDEC/project/タイトル/main.c」の 「41行目」で記述エラーを発見しました。 「,」を付け忘れています。』 という、コンパイルエラーが表示されました。 何度も見直したのですが、よくわかりません。 #include <stdio.h> int main(int argc, char *argv[]) { char answer ; answer = 'n' ; while(answer =='n') { int input ; input = 0 ; int add ; add = 1 ; int sum ; sum = 0 ; printf("数値を入力して下さい。:") ; scanf("%d", &input ) ; int i ; i = 0 ; while(i < input) { sum =sum + add ; printf("\n%d",sum) ; i++ ; add++ ; } printf("\n1から%dまでの総和は、%dです。" , input , sum) ; while(1) { printf("\n終了しますか? y/n:") ; scanf(" %c , &answer) ; if( (answer != 'y') && (answer != 'n') ) { printf( "y or nを入れてください。") ; } else { break ; } } } return 0 ; }

  • 変わらない・・・。

    ↓のプログラムについて (1)break文をexit(0)とreturn(0)にするとどうなるか? (2)13行目と14行目にif(i>=n){break;}を入れるとどうなるか? *プログラムは書き換えてよい。 という問題なんですが私にはさっぱりです・・・。 #include<stdio.h> int main() { int i,n,total; while(1){ printf("整数n?");   scanf("%d",&n);     if(i>=n){break;} total=1; for(i=n;1<=i;i++){ printf("i=%d ",i); total*=i; } printf("total=%d\n",total); } printf("Thanks\n"); return(0) } できたら理由も教えてください。 よろしくおねがいします。

  • C言語の終了処理について教えてください。

    以下のようにコードを入力すると、yとn、そしてそれ以外の文字でも1文字だけであれば、普通に処理ができるんですが、複数の文字を入力してしまうと、バグが出てしまいます。 たとえば、4文字ランダムに入力したとすると y or nを入力して下さい。 終了しますか? y/n:y or nを入力して下さい。 終了しますか? y/n:y or nを入力して下さい。 終了しますか? y/n:y or nを入力して下さい。 終了しますか? y/n: というようになってしまいます。 どのようにすれば、複数の文字を入力したとしても、 「y or nを入力して下さい。 終了しますか? y/n:」 というように、1行のみ正常に表示されるのでしょうか? int main( int argc, char *argv[]) { answer = 'n' ; while ( answer == 'n') { ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・/* 処理の実行 */ while(1) { printf("\n") ; printf("終了しますか? y/n:"); scanf(" %c" , &answer); if( (answer != 'y') && (answer != 'n')) { printf("y or nを入力して下さい。"); } else { break ; } } } return 0 ; }

  • このソースがコンパイルエラーになってしまいます

    このソースのどこがわるいのかわかりません エラー時にこのようなエラーメッセージが出ます In function `writedata': 52: error: syntax error before string constant 65: error: syntax error before string constant 89:2: warning: no newline at end of file ソースはこれです #include <stdio.h> #include <string.h> #include <time.h> typedef struct { int day; double dist; char comment[32]; } diary; void writedata(char datafile[]); void viewdata(char datafile[]); char datadir[] = "dat/"; int year,month,day; int main(int argc,char *argv[]) { char datafile[11]; struct tm *date; time_t now; now = time(NULL); date = localtime(&now); year = date->tm_year + 1900; month = date->tm_mon + 1; day = date->tm_mday; sprintf(datafile,"walk%04d%02d",year,month); if((argc > 1) && (strcmp(argv[1],"-view")==0)) { viewdata(datafile); } else { writedata(datafile); } return 0; } void writedata(char datafile[]) { diary today_data; FILE *outfp; char y_n = 'n'; char filename[15]; char input_str[12]; printf("%d/%d/%dの記録をしますか?(y/n) > ",year,month,day); scanf("%c", &y_n); while(getchar() != '\n') { } if(y_n != 'y') { printf("記録する日付は?(例:%d %d %d) > ",year,month,day); year = 0; month = 0; day = 0; gets(input_str); sscanf(input_str"%d %d %d",&year,&month,&day); if((year > 9999) || (month > 12) || (month < 1) || (day > 31)|| (day < 1)) { printf("日付が正しくありません\n"); return; } sprintf(datafile,"walk%04d%02d",year,month); } today_data.day = day; printf("距離は? >"); scanf("%lf", &today_data.dist); while(getchar() != '\n') { } printf"コメントは?(30文字以内) >"); fgets(today_data.comment, 32, stdin); if((strlen(today_data.comment) == 31) && (today_data.comment[30] != '\n')) { while (getchar() != '\n') { } } sprintf(filename, "%s%s",datadir,datafile); if((outfp = fopen(filename,"a+")) == NULL) { printf("ファイルオープンエラー\n"); return; } fprintf(outfp , "%d %.2lf", today_data.day,today_data.dist); if((strlen(today_data.comment) == 31) && (today_data.comment[30] != '\n')) { today_data.comment[30] = '\n'; today_data.comment[31] = '\0'; } fprintf(outfp,"%s",today_data.comment); fclose(outfp); printf("記録しました"); } void viewdata(char datafile[]) { } なぜ、エラーになったか教えてくださいお願いします

  • Cプログラムで15パズルを作ってみたのですがうまく動作しません。何処が

    Cプログラムで15パズルを作ってみたのですがうまく動作しません。何処が間違っているのかずっと考えているのですがいまだに解決策が見つかりません。ヒントでもいいのでお願します。 #include <stdio.h> int init(void); void show(void); int chk_cmp(void); char input(void); int move(char cmd); #define N 4 int panel[N][N] = { { 1, 2, 3, 4}, { 5, 6, 7, 8}, { 9, 10, 11, 0}, {13, 14, 15, 12} }; int x, y; int main(void) { printf("これは15パズルです。\n" "左上から右に向かって「1」から「15」が並ぶよう,\n" "「0」を動かしてください。\n" "操作はテンキーで行います。( 8(上),4(左),6(右),2(下) )\n"); if( !init() ) { printf("パネルの初期化に失敗しました。「0」のパネルがありません。\n"); return 1; } while(1) { show(); if( chk_cmp() ) { printf("完成です!\n"); break; } while(1) { if( move(input()) ) { break; } else { printf("そっちには動かせません。\n"); } } } return 0; } int init(void) { int i,j; for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ if(panel[i][j]==0){ x=j; y=i; return 1; } } } return 0; } void show(void) { int i,j; printf("---------------\n"); for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ printf("%3d",panel[i][j]); } printf("\n"); } printf("---------------\n\n"); } int chk_cmp(void) { int i,j; for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ if(i==N-1&&j==N-1){ if(panel[i][j]!=0){ return 0; } }else{ if(panel[i][j]!=N*i+j+1){ return 0; } } } } return 1; } char input(void) { int comand; while(1){ scanf("%d",&comand); if(comand==8||comand==4||comand==6||comand==2){ break; } printf("8(上),4(左),6(右),2(下)を入力してください。"); } return comand; } int move(char cmd) { int dx=0, dy=0; if(cmd==8){dy=-1;}//上 if(cmd==4){dx=-1;}//左 if(cmd==6){dx=1;}//右 if(cmd==2){dy=1;}//下 if(x+dx>=0&&x+dx<=N-1&&y+dy>=0&&y+dy<=N-1){ panel[y][x]==panel[y+dy][x+dx]; panel[y+dy][x+dx]==0; y+=dy; x+=dx; return 1; } else{return 0;} }

  • C言語【おみくじプログラム】

    お正月前にならったばかりのC言語を用いて おみくじプログラムを作りました。 最近それをまた改良して 強制的にくじを引かせるものにしようと考えました。 しかしどうしてもwhileのループから抜け出せないので ここで質問させていただきます。 どうか間違っている部分を教えてください。 #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 7 int main(){ int k,y,n; printf("ようこそ。\n"); printf("ここではおみくじを販売して折ります。\n"); printf("よろしければ運試しをしていって下さい。\n\n"); printf("おみくじを引きますか?\n"); printf("※引く場合はy,引かない場合はnを入力してください\n"); scanf("%s,&k"); if(k!=y){ while(k=y){ printf("そんなこと言わずに引いてみてくださいよ。\n\n"); printf("おみくじを引きますか?\n"); printf("※引く場合はy,引かない場合はnを入力してください\n"); scanf("%s,&k"); } } char *kuji[N] = {"大吉", "中吉", "小吉","末吉", "吉", "凶","大凶"}; srand((unsigned)time(NULL)); printf("おみくじ: %s\n\n\n", kuji[rand() % N]); printf("結果はどうでしたか?\n"); printf("またのお越しをお待ちしております。\n"); return 0; }

  • C++言語について。構文エラー

    ジャンケンゲームを作ってたんですが サイトを参考にしながらやってたんですが、どこかでミスったみたいで。 コピーしてやるのはイヤなので、自分で打ちたいんです。   どうか間違いを指摘してもらえないでしょうか?            #include <stdio.h> #include <stdlib.h> int main() { int n; int p;//player int c;//computer srand(0);//乱数の初期化 do { //プレイヤーの手 printf("あなたの手を入力してください\n(グー:1、チョキ:2、パー:3\n"); scanf("%d", &p); //コンピュータの手 c = rand() % 3 + 1; //勝ち負け判定 if(p == c){ printf("draw\n"); }else if(p == 1 && c == 2){ printf("WIN!!\n"); }else if(p == 2 && c == 3){ printf("WIN!!\n"); }else if(p == 3 && c == 2){ printf("WIN!!\n"); }else{ printf("lose...\n"); } //続けるかどうかの判定 printf("try agin?\nNO(0を入力)---"); scanf("%d", &n); //nが0以外だったら続ける }while(n != 0); return 0; }        で、エラーが構文エラー : ';' が 'return' の前にありません。 というものでした。   よろしくおねがいします。

  • ブラックジャック

    朝からブラックジャックに似たゲームでプログラムを作っています。 朝もこのページの方々にお世話になりました。 ありがとうございます。 そして終盤のにちかづき、〔プレーヤー〕が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); }

  • C言語 じゃんけんゲーム 急いでいます

    じゃんけんゲームを作成しましたが 以下のプログラムに ・コンピュータ(CP)の手を記録し一つ前と同じ手を出さずにランダムで手を出す (例:前回CPがパーなら、今回CPはチョキかグーをだす) ・あいこの場合次のじゃんけんで同じ手を再び出す (例:今回CPもプレイヤーもグーの場合は次のじゃんけんでCPはグーを出す) という2つを追加したいのですが恐縮ですが 私ならこう、という模範解答をお願いします… #include <stdio.h> int main() { int i,n; int player; int computer; //勝敗数変数 int p_kati, p_make,p_draw; int q_kati=0, q_make=0,q_draw=0; //繰り返し条件 do { //変数の初期化 p_kati=0; p_make=0; p_draw = 0; //タイトル printf("あなたが出した手は・・・\n"); //乱数の初期化 srand(time(NULL)); //最低5回繰り返す for(i=1; i<=5; i++){ //コンピュータの手 computer = rand() %3; //プレイヤーの手を表記 printf("(グー: 0 チョキ: 1 パー: 2)→ "); do{ scanf("%d", &player); //プレイヤーの手 if(player<0 || 2<player){ //0、1、2以外を入力すると printf("もう一度入力してください");//これを表示 } }while(player<0 || 2<player);//0、1、2を入力で下記を実行 //勝ち負けの判定 if(player==0 && computer==0){ printf("playerも私もグーでした…引き分けです\n"); p_draw++; } else if(player==0 && computer==1){ printf("playerはグーで、私はチョキです…あなたの勝利です\n"); p_kati++; } else if(player==0 && computer==2){ printf("playerはグーで、私はパーです…あなたの負けです\n"); p_make++; } else if(player==1 && computer==0){ printf("playerはチョキで、私はグーです…あなたの負けです\n"); p_make++; (全パターン長いので省略) else if(player==2 && computer==2){ printf("playerも私もパーでした…引き分けです\n"); p_draw++; } } //結果表示 printf("%d 勝 %d 敗 %d 引き分けでした。\n",p_kati,p_make,p_draw); printf("このまま続けますか?続ける場合は何か数字を入力し、続けない場合は -1 を入力してください > "); scanf("%d", &n); //トータル点数を計算 q_kati += p_kati; q_make += p_make; q_draw += p_draw; //n(入力された数字)が-1以外なら続ける }while(n != -1); printf("トータルで %d 勝 %d 敗 %d 引き分けでした。\n",q_kati,q_make,q_draw); return 0; }

  • じゃんけんゲームについてお願いします。

    #include <stdio.h> #include <stdlib.h> int main() { int n; int player; // プレイヤーの手の保存 int computer; // コンピュータの手を保存 srand(0); // 乱数列を初期化 do { printf("あなたの手を入力してください(グー:1 チョキ:2 パー:3) > "); scanf("%d", &player); computer = rand() % 3 + 1; if(computer == player){ printf("あいこです\n"); }else if(player == 1 && computer == 2){ printf("プレイヤーの勝ちです\n"); }else if(player == 2 && computer == 3){ printf("プレイヤーの勝ちです\n"); }else if(player == 3 && computer == 1){ printf("プレイヤーの勝ちです\n"); }else{ printf("コンピュータの勝ちです\n"); } printf("このまま続けますか?続けない場合は 0 を入力してください > "); scanf("%d", &n); // n が 0 以外だったら続ける }while(n != 0); return 0; } このじゃんけんプログラムで一番最初に何回勝負するか指定出来るようにしたいのですが。 指定しただけ勝負して、最後に勝ち、負け、引き分けの結果を。 お願いいたします。

このQ&Aのポイント
  • ucam-dlk130tはDELL製品であり、WIN10にインストールすることができません。この問題が解決する方法を知りたいです。
  • エレコム株式会社の製品であるucam-dlk130tが、WIN10にインストールできない問題が発生しています。解決策を教えてください。
  • DELLのucam-dlk130tを使用しているのですが、WIN10にインストールすることができません。どのようにすれば解決できるでしょうか?
回答を見る

専門家に質問してみよう