配列がわかりません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ミント

配列がわかりません

#1

投稿記事 by ミント » 10年前

#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を、代入したからだそうですが・・・

LL

Re: 配列がわかりません

#2

投稿記事 by LL » 10年前

とりあえず毎回どなたかが指摘していますが、フォーラムルールを読んで最低限コードをタグで囲んでください。

コード:


#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: 配列がわかりません

#3

投稿記事 by ミント » 10年前

フォーラムルールは読みました

コード:

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 配列がわかりません

#4

投稿記事 by softya(ソフト屋) » 10年前

> mark[draw_mark-1], digit[draw_digit-1]に -1を付ける理由がわかりません
配列は添字が0から始まるからです。
例えば
int a[13];と定義した場合
添字は0から12までの値です。
トランプは1から13までの値ですから13が添字範囲外になりますし、0番目の配列が未使用です。
で、この定義の配列を利用するためには-1して添字をずらす必要が出てくるわけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ミント

Re: 配列がわかりません

#5

投稿記事 by ミント » 10年前

配列の添え字が0から始まるなら、配列は-1を指すんじゃないんですか?
mark[draw_mark-1]は、値は4なんですけど、その理屈なら5にしないと・・・

box
記事: 2002
登録日時: 14年前

Re: 配列がわかりません

#6

投稿記事 by box » 10年前

そもそも、
ミント さんが書きました:

コード:

            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]);
ですみます。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 配列がわかりません

#7

投稿記事 by softya(ソフト屋) » 10年前

draw_markが0の値を取ることは有るのでしょうか? そこを探してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

box
記事: 2002
登録日時: 14年前

Re: 配列がわかりません

#8

投稿記事 by box » 10年前

それから、
ミント さんが書きました:

コード:

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

コード:

            do{
                    dealer += drawcard(0);
            }while(dealer <= 16);
+= するのはマズいです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

もしかして

Re: 配列がわかりません

#9

投稿記事 by もしかして » 10年前

コード:

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

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

ミント

Re: 配列がわかりません

#10

投稿記事 by ミント » 10年前

皆さん、ありがとうございます
ぼくが、バカでした

閉鎖

“C言語何でも質問掲示板” へ戻る