ページ 11

ブラックジャックのプログラム

Posted: 2008年1月30日(水) 20:30
by YYY
書いたプログラムはこんな感じです。
#include <stdio.h>
#include <stdlib.h>
int a[53];
int b[55];
int z=0,s=1,player=0,computer=0,x,y,w,v,u,p=0,t,han,te=15;
void syoubu(void);
void mouichi(void);
void syuuryou(void);
void rannsuu_player(void);
void rannsuu_computer(void);
void mouii(void);
int main()
{
    for(y=1;y<=52;y=y+1)
    {
        x=y % 13;
        a[y]=x;
        if(a[y]==0)
        {
            a[y]=10;
        }
        for(w=11;w<=50;w=w+13)
        {
            a[w]=10;
            a[w+1]=10;
        }
        for(u=1;u<=52;u=u+1)
        {
            b[[/url]=0;
        }


    }
    syoubu();
}

void syoubu(void)
{
    printf("あなたの得点 %d 点 \n",player);
    printf("もう1枚取りますか?(1)はい(2)いいえ \n");
    scanf("%d",&han);
    if(han==1)
    {
        mouichi();
    }
    else if(han==2)
    {
        mouii();
    }
}

void mouichi(void)
{
    rannsuu_player();
    player=player+b[[/url];
    if(player>21)
    {
        mouii();
    }
    syoubu();
}

void mouii(void)
{
    if(p<1)
    {
      if(computer>te)
        {
            syuuryou();
        }
        if(computer<=te)
        {
            rannsuu_computer();
        }
        computer=computer+b[t];
        mouii();
    }
}

void syuuryou(void)
{
    if(player>21)
    {
        player=0;
    }
    if(computer>21)
    {
        computer=0;
    }
    printf("あなたの点 %d \n",player);
    printf("親の点 %d \n",computer);
    if (player>computer)
    {
        printf("子の勝ち");
        p++;
    }
    else if(player<computer)
    {
        printf("親の勝ち");
        p++;
    }
    else if(player==computer)
    {
        printf("引き分け");
        p++;
    }
}

void rannsuu_player(void)
{
    u=(int)(52*(rand()/32767.1)+1);
    if(b[[/url]!=0)
    {
        rannsuu_player();
    }
    b[[/url]=a[[/url];
}

void rannsuu_computer(void)
{
    t=(int)(52*(rand()/32767.1)+1);
    if(b[t]!=0)
    {
        rannsuu_computer();
    }
    b[t]=a[t];
}
一見問題がないように見えますが数字を入力するところがおかしいです。
あなたの得点 0 点
もう1枚取りますか?(1)はい(2)いいえ
1
あなたの得点 1 点
もう1枚取りますか?(1)はい(2)いいえ
1
12 [main] a 552 _cygtls::handle_exceptions: Error while dumping state (prob
ably corrupted stack)
Segmentation fault (core dumped)
これが実行結果です。普通に遊べるようにするためにはどこが間違っているのか教えてください。
それと52*(rand()/32767.1)+1というのがよくわからないのですが(多分トランプのカードのことかと思いますが)rand()%51+1とは違うんでしょうか?

Re:ブラックジャックのプログラム

Posted: 2008年1月30日(水) 20:54
by box
> 一見問題がないように見えます

現実のブラックジャックの手順を反映していますか?
確か、ディーラーとプレイヤーに2枚ずつカードを配るところから
始まるのだと思っていましたけれど。
違っていたらすみません。

Re:ブラックジャックのプログラム

Posted: 2008年1月30日(水) 20:59
by YYY
すみません。それはなしです・・・。
どんどん引いていって好きなところでやめて合計が21に近い方が勝ちって感じです。
細かいルールは適応させてないので・・。

Re:ブラックジャックのプログラム

Posted: 2008年1月30日(水) 22:46
by box
rannsuu_player関数とrannsuu_computer関数の実装に
再帰呼び出しを使う必要はありますか?

> 52*(rand()/32767.1)+1というのがよくわからない

どなたか他のかたが書かれたコードですか?

Re:ブラックジャックのプログラム

Posted: 2008年1月30日(水) 22:57
by YYY
>どなたか他のかたが書かれたコードですか?

宿題の文章そのままって奴です。間違っている所を直せというやつなので・・・。

>rannsuu_player関数とrannsuu_computer関数の実装に
再帰呼び出しを使う必要はありますか?

{
rannsuu_computer();
}
これが要らないということですか?

Re:ブラックジャックのプログラム

Posted: 2008年1月30日(水) 23:13
by box
> 宿題の文章そのままって奴です。間違っている所を直せというやつなので・・・。

ということでしたら、変数がすべて外部変数になっている点を含めて、
設計を最初からやり直す必要がありそうです。

> {
> rannsuu_computer();
> }
> これが要らないということですか?

単なるループを使うことによって同じ機能が実装できる状態で、
わざわざ再帰呼び出しを使う必要性を感じないです。私は。

Re:ブラックジャックのプログラム

Posted: 2008年1月30日(水) 23:20
by YYY
分りました。後は自分でやってみます。ありがとうございました。

Re:ブラックジャックのプログラム

Posted: 2008年1月31日(木) 17:52
by 管理人
コードを投稿する時は、
<pre>と</pre>のタグで挟んで投稿してください。(<>は半角)