質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1477閲覧

C++ 値を繰り返し足していく

Giovannaaa

総合スコア10

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/07/17 13:36

編集2020/07/17 13:54

実行例)
カードを引きますかY
SA
Total 1
カードを引きますかY
D3
Total 4
カードを引きますかY
S8
Total 12
カードを引きますかY
DQ
Total 24
21以上になりました。
このようにカードが引かれるたびに数字を足していくtotal関数を作ったのですが出力すると適当な数字が予め足されている状態ででます。
予め他の関数で作られた数字1〜13を引数としています。
どうしたらよいでしょうか??

C++

1 2#include<iostream> 3#include<cstdlib> 4 5using namespace std; 6 7int draw(void) 8{ 9 static int card[53]; 10 static int count=0; // 引いた枚数 11 12 srand(time(NULL)); // 乱数のタネ 13 int r; 14 15 do{ 16 r = rand()%52+1; //1~52の乱数 17 card[r]++; //2回目以上なら2以上 18 }while(card[r] > 1 && count < 52); 19 20 if(count > 52){ 21 r = 0; 22 } 23 24 count++; 25 26 return r; 27} 28 29void change(int n) 30{ 31 int suit, number; //スートと数字 32 33 suit = (n-1) / 13; //スートの計算 34 35 number = n - 13*suit; //数字の計算 36 37 switch(suit){ 38 case 0: cout << "S"; break; 39 case 1: cout << "H"; break; 40 case 2: cout << "D"; break; 41 case 3: cout << "C"; break; 42 } 43 44 switch(number){ 45 case 1: cout << "A"; break; 46 case 11: cout << "J"; break; 47 case 12: cout << "Q"; break; 48 case 13: cout << "K"; break; 49 default: cout << number; 50 } 51} 52 53void total(int n) 54{ 55 static int goukei; 56 57 goukei += n; 58 59 cout << "Total:"; 60 61 do{ 62 if(goukei<21){ 63 cout << goukei << endl; 64 } 65 else if(goukei == 21){ 66 cout << goukei << endl; 67 cout <<"Black Jack" << endl; 68 break; 69 } 70 }while(goukei<=21); 71 72 cout << goukei << endl; 73 cout << "21以上になりました" << endl; 74 } 75 76 77int main() 78{ 79 char check; // YかN 80 81 int number; //draw関数で引いた数字 82 83 do{ 84 cout << "カードを引きますか?(Y/N):"; 85 cin >> check; 86 if(check == 'Y'){ 87 number = draw(); 88 if(number){ // 0でなかったらカードを表示 89 change(number); // カードの数字とスートを返す 90 cout << endl; 91 } 92 else{ 93 check ='N'; 94 cout << "カードがありません。" << endl; 95 } 96 // total(number); 97 } 98 }while(check != 'N'); 99} 100 101

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bboydaisuke

2020/07/17 13:40

コードは ``` で囲みましょう
SHOMI

2020/07/17 13:53 編集

`static int goukei;`の初期値は0ですがいったいどこの事を言っていますか? あと、doとwhileの対応がとれていません。 「21以上になりました。」となった後の次のゲームの話ならgoukeiをクリアしていないからです。
bboydaisuke

2020/07/17 13:47

謝らなくていいので直して欲しいのですが、この質問は、カードを引く関数とかは Giovannaaa さんがこれまでにした質問をチェックして調べて欲しいということですか?もしそうなら、面倒なので全部貼った方がいいですよ。 そこにあるものを見た感じでは、とりあえず do - while の文法が間違ってます。
Giovannaaa

2020/07/17 13:51

全部貼らせていただきます。
SHOMI

2020/07/17 13:54 編集

貼られたコードだとgoukeiが21未満だった場合、無限ループしてgoukeiを表示するだけのコードですが…
Giovannaaa

2020/07/17 13:57

それはどう対処すればよろしいでしょうか?
SHOMI

2020/07/17 14:06

そもそもループがいらないと思いますが。
Giovannaaa

2020/07/17 14:16

消させていただきました。 それからどうしたらよろしいでしょうか?
SHOMI

2020/07/17 14:20

もしかして21を超えていた場合に、Aを1と11で切り替える処理を入れようとしてその処理がないままループだけ入れていたのでしょうか?
Giovannaaa

2020/07/17 14:22

今回Aは1として取り扱っています。
guest

回答2

0

ベストアンサー

適当な数字が予め足されている状態ででます。

goukeiの初期値は0で、足されていません。
draw()152を返し、その値をそのままtotal()に渡しているためスペード以外のカードでは大きな値が足されているだけです。


ブラックジャックではAは、111のどちらか都合の良いほうとして扱えるのに、その処理がありません。
引かれたカードを覚えておいて合計を求める際に足すか、11として足しておき合計が21を超える場合は最大でAを引いた枚数まで10を引いて21以下になるなら続行する処理がいります。


貼られたコードだとtotal()goukeiが21未満だった場合、無限ループしてgoukeiを表示し続けています。
カードを引く処理は別の場所でやっていて、結果を表示するだけならループはいりませんよね。
それとも21を超えていた場合にA111切り替えて計算しなおす処理を入れようとして、そのコードがないままループだけとなっていたのでしょうか。


今回A1決め打ちということなので、以下の4行を修正とコメントのtotal()修正で一応動きます。

diff

1int draw(void) 2{ 3 static int card[53]; 4 static int count = 0; // 引いた枚数 5 6 srand(time(NULL)); // 乱数のタネ 7 int r; 8 9 do { 10 r = rand() % 52 + 1; //1~52の乱数 11 card[r]++; //2回目以上なら2以上 12 } while (card[r] > 1 && count < 52); 13 14- if (count > 52) { 15+ if (count >= 52) { 16 r = 0; 17 } 18 19 count++; 20 21 return r; 22} 23-void change(int n) 24+int change(int n) 25{ 26 int suit, number; //スートと数字 27 28 suit = (n - 1) / 13; //スートの計算 29 30 number = n - 13 * suit; //数字の計算 31 32 switch (suit) { 33 case 0: cout << "S"; break; 34 case 1: cout << "H"; break; 35 case 2: cout << "D"; break; 36 case 3: cout << "C"; break; 37 } 38 39 switch (number) { 40 case 1: cout << "A"; break; 41 case 11: cout << "J"; break; 42 case 12: cout << "Q"; break; 43 case 13: cout << "K"; break; 44 default: cout << number; 45 } 46+ return number; 47} 48 49int main() 50{ 51 char check; // YかN 52 53 int number; //draw関数で引いた数字 54 55 do { 56 cout << "カードを引きますか?(Y/N):"; 57 cin >> check; 58 if (check == 'Y') { 59 number = draw(); 60 if (number) { // 0でなかったらカードを表示 61- change(number); // カードの数字とスートを返す 62+ number = change(number); // カードの数字とスートを返す 63 cout << endl; 64 } 65 else { 66 check = 'N'; 67 cout << "カードがありません。" << endl; 68 } 69 total(number); 70 } 71 } while (check != 'N'); 72}

投稿2020/07/17 14:01

編集2020/07/17 15:01
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Giovannaaa

2020/07/17 14:09

値をそのまま返さないようにするにはどうすればよろしいでしょうか?
SHOMI

2020/07/17 14:18 編集

設計次第なのであなたがどうしたいかによります。 chang()で1~13を求めているようなのでそれを返すとか? 指摘に書いたようにAの処理がおかしいですが…
Giovannaaa

2020/07/17 14:16

上に書いてある実行例のような感じになれば十分です。
Giovannaaa

2020/07/17 14:20

void total(int n) { static int goukei=0; goukei += n; cout << "Total:"; if(goukei<21){ cout << goukei << endl; } else if(goukei == 21){ cout << goukei << endl; cout <<"Black Jack" << endl; } else{ cout << goukei << endl; cout << "21以上になりました" << endl; } } これでもだめでしょうか?
SHOMI

2020/07/17 14:24

Aは1決め打ちということならいいんじゃないでしょうか。
Giovannaaa

2020/07/17 14:24

今回Aは1として取り扱っています。
Giovannaaa

2020/07/17 14:26

changeはどう返せばいいでしょうか??
Giovannaaa

2020/07/17 14:32

ありがとうございました????‍♂️
SHOMI

2020/07/17 14:46 編集

カードがありませんになった時にも足していますね。 draw()のif (count > 52)をif (count >= 52)にしないと、最後の一枚を引いた次の一度だけ不定値が返ります。
Giovannaaa

2020/07/17 15:01

ありがとうございます!
SHOMI

2020/07/17 15:04

draw(void)で毎回srand()を呼んでいますが、最初に一度呼ぶだけでよいです。
guest

0

ゲームを始めるときに、totalをゼロにしないといけないでしょ
2回めのゲームするときはどうしましょうか

投稿2020/07/17 13:45

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Giovannaaa

2020/07/17 13:58

貼り直しました。 よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問