ページ 11

配列がわかりません

Posted: 2014年11月11日(火) 14:42
by ミント
#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: 配列がわかりません

Posted: 2014年11月11日(火) 14:51
by LL
とりあえず毎回どなたかが指摘していますが、フォーラムルールを読んで最低限コードをタグで囲んでください。

コード:


#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;
}

Re: 配列がわかりません

Posted: 2014年11月11日(火) 15:16
by ミント
フォーラムルールは読みました

コード:

で囲ってみても、プレビューでは変わらなかったので
そのまま投稿しました。すいません・・・

Re: 配列がわかりません

Posted: 2014年11月11日(火) 15:51
by softya(ソフト屋)
> mark[draw_mark-1], digit[draw_digit-1]に -1を付ける理由がわかりません
配列は添字が0から始まるからです。
例えば
int a[13];と定義した場合
添字は0から12までの値です。
トランプは1から13までの値ですから13が添字範囲外になりますし、0番目の配列が未使用です。
で、この定義の配列を利用するためには-1して添字をずらす必要が出てくるわけです。

Re: 配列がわかりません

Posted: 2014年11月11日(火) 17:55
by ミント
配列の添え字が0から始まるなら、配列は-1を指すんじゃないんですか?
mark[draw_mark-1]は、値は4なんですけど、その理屈なら5にしないと・・・

Re: 配列がわかりません

Posted: 2014年11月11日(火) 18:38
by box
そもそも、
ミント さんが書きました:

コード:

            draw_mark = rand() % 4 + 1; //マークを決定する
            draw_digit = rand() %13 + 1; //数字を決定する
ここで1を足して、
ミント さんが書きました:

コード:

                    printf("%sの%s\n", mark[draw_mark-1], digit[draw_digit-1]); //ここがわかりません
ここで1を引いているのが、ムダとまではいいませんが、ややこしくしている原因だと思います。

コード:

            draw_mark = rand() % 4; //マークを決定する
            draw_digit = rand() %13; //数字を決定する
と書いて、
draw_markは配列の添字範囲内である0~3、
draw_digitも配列の添字範囲内である0~12、
にしておけば、

コード:

                    printf("%sの%s\n", mark[draw_mark], digit[draw_digit]);
ですみます。

Re: 配列がわかりません

Posted: 2014年11月11日(火) 18:40
by softya(ソフト屋)
draw_markが0の値を取ることは有るのでしょうか? そこを探してみてください。

Re: 配列がわかりません

Posted: 2014年11月11日(火) 18:47
by box
それから、
ミント さんが書きました:

コード:

            int dealer;
初期化していないのに
ミント さんが書きました:

コード:

            do{
                    dealer += drawcard(0);
            }while(dealer <= 16);
+= するのはマズいです。

Re: 配列がわかりません

Posted: 2014年11月11日(火) 19:20
by もしかして

コード:

draw_mark = ( rand() % 4 ) + 1;//rand() % 4 + 1と同じこと
draw_digit = ( rand() % 13 ) + 1;//rand() % 13 + 1と同じこと

こうしておかないと勘違いする人がいるかもしれませんよね

Re: 配列がわかりません

Posted: 2014年11月11日(火) 21:35
by ミント
皆さん、ありがとうございます
ぼくが、バカでした