![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
自分でじゃんけんゲームを作ってみたのですが、他の人のソースで
どういう風に組んでいるのか研究したいのでソースお願いします。
後、もっとこういう風にした方がいいとおもう所があればおねがいします。
<ソース>
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{
int i;
int n;
srand(time(NULL));
n=rand()%3;
printf("じゃんけんをします,0がグーで1がチョキで2がパーです\n");
printf("じゃんけんぽい!");
scanf("%d",&i);
if(i==0&&n==0){
printf("あいこです\n");
}
else if(i==0&&n==1){
printf("勝ちました\n");
}
else if(i==0&&n==2)
{
printf("負けました\n");
}
if(i==1&&n==0){
printf("負けました\n");
}
else if(i==1&&n==1){
printf("あいこです\n");
}
else if(i==1&&n==2)
{
printf("勝ちました\n");
}
if(i==2&&n==0){
printf("勝ちました\n");
}
else if(i==2&&n==1){
printf("負けました\n");
}
else if(i==2&&n==2){
printf("あいこです\n");
}
if(i>2)
{
printf("やりなおしてください\n");
}
return 0;
}
No.2ベストアンサー
- 回答日時:
インデントに全角スペースを使ってます。
実際にコピーペーストする際には気をつけてください。勝敗判定のコードをまとめて簡略化していますが、入力エラーチェックを強化したのでコード量は大して変わってません。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define GU 0
#define CHOKI 1
#define PA 2
#define MAX_STRLEN 256
int main()
{
int i;
int n;
char input[MAX_STRLEN];
char hand[][MAX_STRLEN] = {"グー", "チョキ", "パー"};
srand(time(NULL));
n=rand()%3;
printf("じゃんけんぽい!\n");
// 手を入力 -- 有効な数値が入るまで繰り返す
while(1)
{
printf("あなたの手(グー:0 チョキ:1 パー:2):");
fgets(input, MAX_STRLEN, stdin);
if(sscanf(input, "%d", &i) < 1)
{
printf("数値を入力してください。\n");
}else{
if(i < GU || i > PA)
{
printf("0から2の範囲で入力してください。\n");
}else{
break;
}
}
}
// 自分の手と相手の手を表示
printf("あなたの手:%s わたしの手:%s\n", hand[i], hand[n]);
// 勝敗判定
if(i == n)
{
printf("あいこです\n");
}else{
if((i + 1) % 3 == n)
{
printf("あなたの勝ちです\n");
}else{
printf("あなたの負けです\n");
}
}
return 0;
}
配列を使ってみるのもいいですね。
while文で繰り返しやってみるのもいいですね。
ソースとても参考になったのでコンパイルさせていただきます。
1である限り繰り返しは考えつきませんでした。
面白いプログラミングですね。
No.6
- 回答日時:
No.4です。
自分のを見直してみたら変なところがありました。
一つ目
> int pc, player; /* PC(私)とプレイヤー(あなた)の手 */
> enum { GU, CHOKI, PA, END };
どうせなら、
typedef enum { GU, CHOKI, PA, END } TE;
TE pc, player; /* PC(私)とプレイヤー(あなた)の手 */
とすべきでした。
二つ目
> const char *te[] = { "グー", "チョキ", "パー", "終了"};
> const char *message[] = { "負けました", "あいこです", "勝ちました" };
constにするなら
char const * const
ここまですべきかな?
三つ目
> if (player < 0 || player > END) {
> puts("やり直してください");
> continue;
> } else if (player == END)
> break;
do while文にした意味がない。
breakをcontinueに変えるか、while(1) {}でもよかった。
No.5
- 回答日時:
#3のzwiです。
調子に乗って第2弾。マトリックス・タイプも既に出てますが勝率判定付きです。
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{
int i;
int n;
int hantei;
int allplay = 0;
//結果
static int hantei_count[3] = {0,0,0};
//勝ち負け
enum {
HANTEI_AIKO,
HANTEI_KACHI,
HANTEI_MAKE
};
//判定マトリックス
static int hantei_matrix[3][3] = {
HANTEI_AIKO, HANTEI_KACHI, HANTEI_MAKE,//i:0 n:0 i:0 n:1 i:0 n:2
HANTEI_MAKE, HANTEI_AIKO, HANTEI_KACHI,//i:1 n:0 i:1 n:1 i:1 n:2
HANTEI_KACHI, HANTEI_MAKE, HANTEI_AIKO//i:2 n:0 i:2 n:1 i:2 n:2
};
//判定表示用の文字列。
static char *hantei_str[3] = {
"あいこです",//HANTEI_AIKO,
"勝ちです", //HANTEI_KACHI,
"負けです" //HANTEI_MAKE
};
//表示用
static char *te[3] = {
"グー",// 0
"チョキ",// 1
"パー"// 2
};
srand(time(NULL));
while( 1 ) {
n=rand()%3;
printf("じゃんけんをします,0がグーで1がチョキで2がパーです。-1で終了します。\n");
printf("じゃんけんぽい!");
scanf("%d",&i);
//終了
if( i==-1 ) {
break;
}
//エラー判定
if( (i>2) || (i<0) ) {
printf("0,1,2を入力して、やりなおしてください\n");
continue;
}
//判定を得る。
hantei = hantei_matrix[i][n];
//結果表示
printf( "自分:%s(%d) コンピュータ:%s(%d) 判定は、%s。\n", te[i],i, te[n],n, hantei_str[hantei] );
//勝率の計算と表示
hantei_count[hantei]++;
allplay++;
printf( "あなたの勝率:%d%% あいこの確率:%d%%\n\n", hantei_count[HANTEI_KACHI]*100/allplay, hantei_count[HANTEI_AIKO]*100/allplay );
}
return 0;
}
いいプログラミングだと思います。
じっくり読ませていただいたのですが、配列の計算面白いです。
enumeを使うの思いつかなったです。
後は理解できます。
やはりwhile文を使って繰り返し判定を出すの必要だと思いました。
No.4
- 回答日時:
配列を用いた方法が既に出ていますが、それ以外のところで参考になればと思いましたので、回答します
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{
int i;
int pc, player; /* PC(私)とプレイヤー(あなた)の手 */
enum { GU, CHOKI, PA, END };
const char *te[] = { "グー", "チョキ", "パー", "終了"};
typedef enum { LOOSE, EVEN, WIN} JUDGE;
const JUDGE result[3][3] = {
{EVEN, WIN, LOOSE},
{LOOSE, EVEN, WIN},
{WIN, LOOSE, EVEN}
}; /* プレイヤーの勝ち負けはresult[player][pc]で得られる */
const char *message[] = { "負けました", "あいこです", "勝ちました" };
srand((unsigned)time(NULL));
puts("じゃんけんをします");
for (i = 0; i < sizeof(te) / sizeof(te[0]); i++) {
printf("%dが%sで", i, te[i]);
}
puts("す");
do {
puts("じゃんけんぽい!");
scanf("%d",&player); /* 手抜き */
if (player < 0 || player > END) {
puts("やり直してください");
continue;
} else if (player == END)
break;
pc = (int)(rand() / (RAND_MAX + 1.0) * 3);
printf("あなたの手:%s\n", te[player]);
printf("私の手:%s\n", te[pc]);
puts(message[result[player][pc]]);
} while (player != END);
return 0;
}
No.3
- 回答日時:
思いっきり配列を使ってみました。
少し仕組みも変わっていて遊ぶ人に分かりやすくしてあります。
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{
int i;
int n;
static char *hantei[3][3] = {
"あいこです",// i:0 n:0
"勝ちです", // i:0 n:1
"負けです", // i:0 n:2
"負けです", // i:1 n:0
"あいこです",// i:1 n:1
"勝ちです", // i:1 n:2
"勝ちです", // i:2 n:0
"負けです", // i:2 n:1
"あいこです" // i:2 n:2
};
static char *te[3] = {
"グー",// 0
"チョキ",// 1
"パー"// 2
};
srand(time(NULL));
while( 1 ) {
n=rand()%3;
printf("じゃんけんをします,0がグーで1がチョキで2がパーです。-1で終了します。\n");
printf("じゃんけんぽい!");
scanf("%d",&i);
if( i==-1 ) {
break;
}
if( (i>2) || (i<0) ) {
printf("0,1,2を入力して、やりなおしてください\n");
continue;
}
printf( "自分:%s(%d) コンピュータ:%s(%d) 判定は、%s。\n\n", te[i],i, te[n],n, hantei[i][n] );
}
return 0;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# プログラムの時、フローチャートはどうなりますか?図でお願いします。 int main(void) { 1 2022/10/01 22:45
- C言語・C++・C# プログラミングのペーパーテスト 実行結果がどのように表示されるか答えよ #include <stdi 1 2022/07/09 14:27
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# プログラミングのペーパーテスト 実行結果を表示せよ #include <stdio.h> int h 1 2022/07/09 15:27
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c言語でAからZまでを表示する...
-
hit&bolwのプログラミングがで...
-
【C言語教えてください】sin波...
-
10個出力で改行したいのですが...
-
printf で二進表示を行いたい。
-
コンパイルエラーについて
-
error C2143: 構文エラー : ';'...
-
C言語に関する質問です
-
C言語 プログラミング
-
if文がコンパイルエラーを起こ...
-
C言語で入力した変数の値から三...
-
wsprintfの書式制御文字列につ...
-
ホームページをC言語で作りたい...
-
strcmp
-
分数を表示するプログラム(長...
-
4の倍数を論理演算で表す。。
-
英語小文字または大文字を入力...
-
unsigned int型について
-
コマンドラインに出力した文字...
-
C言語のヘッダーファイルの作成...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
【C言語教えてください】sin波...
-
printf で二進表示を行いたい。
-
c言語でAからZまでを表示する...
-
コマンドラインに出力した文字...
-
strcmp
-
4の倍数を論理演算で表す。。
-
C言語での、年複利の計算方法...
-
C言語 プログラミング
-
scanfに文字が入力されたときに...
-
hit&bolwのプログラミングがで...
-
%P と %X の違い
-
unsigned int型について
-
printf( " %2d", p * q );
-
cshの文字列操作(0埋め)
-
改行について 1行に何個かづ...
-
8人分のテストの点数を入力し、...
-
入力したお金の金額からお札の...
-
三角形の判別
-
テキストカーソル位置の取得
おすすめ情報