#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//カードの点数
char total[13] = {11, 2, 3, 4, 5, 6, 7, 8, 9, 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 argc,char *argv[]){
int dealer;
int player;
char y_n;
srand(time(NULL));
printf("[ブラックジャック] \n");
//プレイヤー
printf("プレイヤー一枚目:");
player = drawcard(1);
printf("プレイヤー二枚目:");
player += drawcard(1);
//ディーラーが引く
do{
dealer += drawcard(0);
}while(dealer <= 16);
//プレイヤーが引く
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);
return 0;
}
int drawcard(int h){
int draw_mark, draw_digit; //引いたマークと数
int r; //引いたカードの点数
draw_mark = rand() % 4 + 1; //マークを決定する
draw_digit = rand() %13 + 1; //数字を決定する
if(h){
printf("%sの%s\n", mark[draw_mark-1], digit[draw_digit-1]); //ここがわかりません
}
r = total[draw_digit-1];
return r;
}
mark[draw_mark-1], digit[draw_digit-1]に -1を付ける理由がわかりません
他のところで聞いたんですが、draw_mark = rand() % 4 + 1を、代入したからだそうですが・・・
配列がわかりません
Re: 配列がわかりません
とりあえず毎回どなたかが指摘していますが、フォーラムルールを読んで最低限コードをタグで囲んでください。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//カードの点数
char total[13] = {11, 2, 3, 4, 5, 6, 7, 8, 9, 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 argc,char *argv[]){
int dealer;
int player;
char y_n;
srand(time(NULL));
printf("[ブラックジャック] \n");
//プレイヤー
printf("プレイヤー一枚目:");
player = drawcard(1);
printf("プレイヤー二枚目:");
player += drawcard(1);
//ディーラーが引く
do{
dealer += drawcard(0);
}while(dealer <= 16);
//プレイヤーが引く
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);
return 0;
}
int drawcard(int h){
int draw_mark, draw_digit; //引いたマークと数
int r; //引いたカードの点数
draw_mark = rand() % 4 + 1; //マークを決定する
draw_digit = rand() %13 + 1; //数字を決定する
if(h){
printf("%sの%s\n", mark[draw_mark-1], digit[draw_digit-1]); //ここがわかりません
}
r = total[draw_digit-1];
return r;
}
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 配列がわかりません
> mark[draw_mark-1], digit[draw_digit-1]に -1を付ける理由がわかりません
配列は添字が0から始まるからです。
例えば
int a[13];と定義した場合
添字は0から12までの値です。
トランプは1から13までの値ですから13が添字範囲外になりますし、0番目の配列が未使用です。
で、この定義の配列を利用するためには-1して添字をずらす必要が出てくるわけです。
配列は添字が0から始まるからです。
例えば
int a[13];と定義した場合
添字は0から12までの値です。
トランプは1から13までの値ですから13が添字範囲外になりますし、0番目の配列が未使用です。
で、この定義の配列を利用するためには-1して添字をずらす必要が出てくるわけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 配列がわかりません
配列の添え字が0から始まるなら、配列は-1を指すんじゃないんですか?
mark[draw_mark-1]は、値は4なんですけど、その理屈なら5にしないと・・・
mark[draw_mark-1]は、値は4なんですけど、その理屈なら5にしないと・・・
Re: 配列がわかりません
そもそも、
と書いて、
draw_markは配列の添字範囲内である0~3、
draw_digitも配列の添字範囲内である0~12、
にしておけば、
ですみます。
ここで1を足して、
ここで1を引いているのが、ムダとまではいいませんが、ややこしくしている原因だと思います。
と書いて、
draw_markは配列の添字範囲内である0~3、
draw_digitも配列の添字範囲内である0~12、
にしておけば、
ですみます。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 配列がわかりません
draw_markが0の値を取ることは有るのでしょうか? そこを探してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。