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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

4024閲覧

じゃんけんゲームのif文を簡潔にしたい

mn6262

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/05/11 05:35

前提・実現したいこと

C言語でコンピューターとプレーヤーでじゃんけんをするプログラムを作りました。
0がグーで、1がチョキ、2がパーです。
配列は使わないで、コンピュータの手は乱数で決めて、プレイヤーはキーボードから手を入力します。

発生している問題・エラーメッセージ

きちんと動くプログラムはできたのですが、if文が冗長であるような気がしています。
もう少し簡潔に書ければそうしたいのですが、あまりいい案が思いつきません。
何かもっと簡潔に書くことができるアドバイスなどあればいただきたいです。

該当のソースコード

printf("プレイヤーは"); if(player==0){ printf("グー"); } else if(player==1){ printf("チョキ"); } else{ printf("パー"); } printf("で、コンピューターは"); if(comp==0){ printf("グー"); } else if(comp==1){ printf("チョキ"); } else{ printf("パー"); } judge=(player-comp+3)%3; if(judge==0){ printf("なので、引き分け\n"); } else if(judge==1){ printf("なので、コンピューターの勝ち\n"); } else{ printf("なので、プレイヤーの勝ち\n"); }

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

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

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

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

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

Zuishin

2020/05/11 05:44

配列を使えばいいのでは? printf("%s\n", hand[player]);
fana

2020/05/11 05:45

> 配列は使わないで のような「縛りプレイの範囲で」簡潔にしたい,という話?
mn6262

2020/05/11 05:47

はい!そうです。
HogeAnimalLover

2020/05/11 05:56

縛りプレイするならば別に今のままで良いと思うけど。
Zuishin

2020/05/11 05:59

また嫌がらせのクイズか。
Zuishin

2020/05/11 06:10

> C言語でコンピューターとプレーヤーでじゃんけんをするプログラムを作りました。 作ってないでしょ。宿題でしょ。自分でやれ。
mn6262

2020/05/11 06:41

不快に思われたのでしたら、申し訳ありませんでした。 ですが、自分でプログラムを作ったのは本当です。 作ったうえで、もっといいものにすることができるのならしたいと思って質問をさせていただきました。
Zuishin

2020/05/11 06:43

自分で作るのにそんな変な縛りを入れる必要は無いし、 > 回答ありがとうございます。 はい…。本当に面倒なのですが、配列禁止とのことでして(泣) 他人から禁止されるいわれもない。
fana

2020/05/11 07:10

頭空っぽにして,9パターン分岐のswitchを書くというのがある意味「簡潔」かもしれない.
guest

回答3

0

えーと、if~else if~else~ を何度も書きたくないってことかな?

C

1#include <stdio.h> 2 3const char* hand(int type) { 4 if ( type == 0) { 5 return "グー"; 6 } else if ( type == 1) { 7 return "チョキ"; 8 } else { 9 return "パー"; 10 } 11} 12 13const char* judge(int player, int comp) { 14 int judge = (player - comp + 3) % 3; 15 if (judge == 0) { 16 return "引き分け"; 17 } else if (judge == 1) { 18 return "コンピューターの勝ち"; 19 } else { 20 return "プレイヤーの勝ち"; 21 } 22} 23 24/* 25 おためし 26 */ 27int main() { 28 int player; 29 int comp; 30 for ( player = 0; player < 3; ++player ) { 31 for ( comp = 0; comp < 3; ++comp ) { 32 printf("プレイヤーは%sで、コンピューターは%sなので、%s\n", 33 hand(player), hand(comp), judge(player,comp)); 34 } 35 } 36 return 0; 37}

投稿2020/05/11 06:43

episteme

総合スコア16612

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

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

mn6262

2020/05/11 06:54

回答ありがとうございました! わざわざコードまで書いていただきとても参考になりました。 今回はポインタ等の使用も制限されているので、使うことが出来ませんが、もう少し勉強して使えるようになった時の参考にさせていただこうと思います。
guest

0

ベストアンサー

配列使わない縛りらしいので……

  • {グー,チョキ,パー}の表示は2回やってる→関数にでもしたらどうか
  • ifは三項演算子にでもしたら見た目には簡潔と言えるかも?(判断は人に依るか)

くらいかな.

投稿2020/05/11 06:07

fana

総合スコア11996

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

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

mn6262

2020/05/11 06:15

回答ありがとうございます。 いただいたアドバイスを参考にして改善してみようと思います。
fana

2020/05/11 06:18

「配列使わない縛り」に対抗するために, メンバのアライメントが確定する形で書いた構造体を用いてアドレスオフセットでどうの! とかも考えられるが,それ「簡潔」か? と言われると違う気がする.
mn6262

2020/05/11 06:45

まだプログラミングを勉強し始めたばかりで初歩的なことしか出来ませんが、いつかそういった対抗策が思いつくように努力していこうと思います! ありがとうございました!
guest

0

どこの if 文が冗長と考えているのか分かりませんが、

C

1 char* hands[] = { 2 "グー", 3 "チョキ", 4 "パー" 5 }; 6 7printf("%s", hands[player]);

とか?

って、配列使わないのか……

ならば無理矢理だが(w

C

1#include <stdio.h> 2#cinlude <string.h> 3 4char* hands = "グー チョキパー "; // グーとチョキの間、パーの後ろには全角空白 5char buffer[10]; 6 7memset(buffer, '\0', 10); 8strncpy(buffer, hands+(player * strlen("チョキ")), strlen("チョキ")); 9printf("%s", buffer);

いわゆる文字列を使えない、ならこれでもアウトですが一応(w

投稿2020/05/11 05:49

編集2020/05/11 06:24
tacsheaven

総合スコア13703

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

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

mn6262

2020/05/11 06:08

回答ありがとうございます。 はい…。本当に面倒なのですが、配列禁止とのことでして(泣)
mn6262

2020/05/11 06:47

何度もありがとうございました! とても参考になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問