ミスチルの大名曲の数々が配信決定!! 31日間無料!!【PR】

自分でじゃんけんゲームを作ってみたのですが、他の人のソースで
どういう風に組んでいるのか研究したいのでソースお願いします。
後、もっとこういう風にした方がいいとおもう所があればおねがいします。
<ソース>
#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;
}

A 回答 (6件)

インデントに全角スペースを使ってます。

実際にコピーペーストする際には気をつけてください。
勝敗判定のコードをまとめて簡略化していますが、入力エラーチェックを強化したのでコード量は大して変わってません。

#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;
}
    • good
    • 0
この回答へのお礼

配列を使ってみるのもいいですね。
while文で繰り返しやってみるのもいいですね。
ソースとても参考になったのでコンパイルさせていただきます。
1である限り繰り返しは考えつきませんでした。
面白いプログラミングですね。

お礼日時:2009/05/16 06:47

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) {}でもよかった。
    • good
    • 0

#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;
}
    • good
    • 1
この回答へのお礼

いいプログラミングだと思います。
じっくり読ませていただいたのですが、配列の計算面白いです。
enumeを使うの思いつかなったです。
後は理解できます。
やはりwhile文を使って繰り返し判定を出すの必要だと思いました。

お礼日時:2009/05/16 07:01

配列を用いた方法が既に出ていますが、それ以外のところで参考になればと思いましたので、回答します



#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;
}
    • good
    • 0
この回答へのお礼

構造体+配列わかりやすいです。
他の方で配列を使っている方もいたので、配列でまた作りなおしてみます。

お礼日時:2009/05/16 06:56

思いっきり配列を使ってみました。


少し仕組みも変わっていて遊ぶ人に分かりやすくしてあります。

#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;
}
    • good
    • 0
この回答へのお礼

見てわかりやすいプログラムだと思いました。
配列を使うと、すっきりしますね。
コンパイルさせていただきます。

お礼日時:2009/05/16 06:52

>もっとこういう風にした方がいいとおもう所があればおねがいします。



printf("あいこです\n"); などの同じ文を繰り返し書いていますね。
勝ち負けの判定を関数にしましょう。

あと、「やりなおしてください」のメッセージと共に、
ユーザにプログラムの起動からやり直させるのはどうなんでしょう。
scanf("%d",&i); まで勝手に戻った方がよいのでは?
    • good
    • 0
この回答へのお礼

そうですね。勝ち負けの判定した方がいいですね。
やり直してくださいはwhile文を使って考えてみます。

お礼日時:2009/05/16 06:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC言語 じゃんけんゲーム 非常に困っています

じゃんけんゲームを作成したのですが

コンピュータの出す手を5つのパターンを作成して
その5つのパターンを関数化して呼び出すようにする。

というのを作成したいのですが検索などしましたが
コンピュータの調子が悪く、それらしい物が見つからず、
何方か無礼ですが自分ならこうするという模範解答お願いします…
一応下記のプログラムまでは進められましたが
switch()case を関数化してゲーム前に入力して5つのパターンを
それぞれ呼び出せるようにしたいです…
(例:ゲーム前に「パターンを選択:5でランダム、6でコンピュータ絶対勝つ…(省略)」
を表示させて入力数字でパターンを呼び出し、開始する)

5つのパターン(コンピュータの手)
完全ランダム
コンピュータが絶対勝つ
コンピュータが絶対負け
絶対引き分け
絶対引き分け無い

作成したプログラム
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

char *table[]={"グー","パー","チョキ"};

int main(void)
{
int i,j;
int continue_f;
int player,computer;
int p_win,p_lose,p_draw;
int t_win,t_lose,t_draw;

t_win=t_lose=t_draw=0;
srand(time(NULL));
do{
p_win=p_lose=p_draw=0;
for(i=0;i<5;i++){
while(1){
printf("あなたが出した手は・・・\n");
printf("グー:0 パー:1 チョキ:2\n");
scanf("%d",&player);
if(0<=player&&player<=2){
break;
}else{
printf("もう一度入力してください。\n");
}
}
switch(i){
case 0:
computer=rand()%3;
break;
case 1:
computer=(player+1)%3;
break;
case 2:
computer=(player+2)%3;
break;
case 3:
computer=player;
break;
case 4:
do{
computer=rand()%2;
}while(computer==player);
break;
}
if((player+1)%3==computer){
printf("あなたは%sでわたしは%sです・・・わたしの勝利です。\n",
table[player],table[computer]);
p_lose++;
}else if(player==computer){
printf("あなたもわたしも%sです・・・引き分けです。\n",table[player]);
p_draw++;
}else{
printf("あなたは%sでわたしは%sです・・・あなたの勝利です。\n",
table[player],table[computer]);
p_win++;
}
}
printf("%d勝 %d敗 %d引き分けでした。\n",p_win,p_lose,p_draw);
printf("このまま続けますか?続ける場合は何か数字を入力し、"
"続けない場合は-1を入力してください。\n");
scanf("%d",&continue_f);
t_win+=p_win;
t_lose+=p_lose;
t_draw+=p_draw;
}while(continue_f!=-1);
printf("トータルで %d勝 %d敗 %d引き分けでした。\n",t_win,t_lose,t_draw);
return 0;
}

じゃんけんゲームを作成したのですが

コンピュータの出す手を5つのパターンを作成して
その5つのパターンを関数化して呼び出すようにする。

というのを作成したいのですが検索などしましたが
コンピュータの調子が悪く、それらしい物が見つからず、
何方か無礼ですが自分ならこうするという模範解答お願いします…
一応下記のプログラムまでは進められましたが
switch()case を関数化してゲーム前に入力して5つのパターンを
それぞれ呼び出せるようにしたいです…
(例:ゲーム前に「パターンを選択:5でラン...続きを読む

Aベストアンサー

突貫で考えたので粗悪ですが、とりあえずのコードを挙げます。

<仮定>
●ゲームモードは毎回選択する
 ⇔合計を取る意味が薄くなった。
●「じゃんけん処理関数」について
 ・引数は「プレイヤーの出した手」。戻り値は難易度にしたがい処理した「勝ち敗け結果」。

<簡単解説>
●主な変更点
 ・じゃんけん処理に使っていたswitch文を「ゲームモード毎のじゃんけん処理関数呼び出し」に変更。
 ・scanfが増えたので、エラー対策追加。
●変更コンセプトと反省点
 ・なるべく提示された原型を壊さずに改良してみた。
  結果として、あまりよろしくない処理になっている。以下の点を改良すると、もう少しよくなると思う。
   ・「ゲームモードの決定処理」が「プレイヤーの手処理」の前後に存在するので可読性・移植性が悪い
    「プレイヤーの手処理」も関数化して、「じゃんけん処理関数」の中から呼ぶべき

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "main.h"/* 関数の宣言などをまとめたヘッダファイル */

char *table[]={"グー","パー","チョキ"};

int main(void)
{
int i,j;
int continue_f;
int player,computer;
int p_win,p_lose,p_draw;
int t_win,t_lose,t_draw;

unsigned int gamemode;/* ゲームモードを覚えておく変数 */

t_win=t_lose=t_draw=0;
gamemode = 0;/* ちゃんと初期化します */
srand(time(NULL));
do{
/* ゲームモード選択 */
printf("ゲームモードを選択してください\n");
printf("0:楽勝\t 1:簡単\t 2:適当\n");
printf("3:いじめ\t 4:チート \n");
scanf("%d", &gamemode);

if(gamemode > 5)
{
/* エラー対策。本来は再入力を求めるべきだが、そのためには全体のロジック変更が望ましい */
/* なので、最低限の手抜き対策です */
printf("そんなモードはない。めんどいからチートモードにご案内\n");
gamemode = 4;

}

p_win=p_lose=p_draw=0;
for(i=0;i<5;i++){
while(1){
printf("あなたが出した手は・・・\n");
printf("グー:0 パー:1 チョキ:2\n");
scanf("%d",&player);
if(0<=player&&player<=2){
break;
}else{
printf("もう一度入力してください。\n");
}
}

switch(gamemode){
case 0:
/* 関数「楽勝」をコール (コンピュータが絶対負け)*/
computer = Veryeasy_mode(player);/*関数の中身は御自分でお願いします*/
break;
case 1:
/* 関数「簡単」をコール */
computer = Easymode(player);/*関数の中身は御自分でお願いします*/
break;
case 2:
/* 関数「適当」をコール */
computer = Normalmode(player);/*関数の中身は御自分でお願いします*/
break;
case 3:
/* 関数「いじめ」をコール */
computer = Hardmode(player);/*関数の中身は御自分でお願いします*/
break;
case 4:
/* 関数「チート」をコール (コンピュータが絶対勝つ)*/
computer = Cheetmode(player);/*関数の中身は御自分でお願いします*/
break;
default:
/* エラー対処済みなので何もしない */
/* めんどいのでやってないが、本来はゲームモードのスイッチ処理⇒プレイヤーの手処理とするべき */
break;
}

//以下、「勝敗処理」は提示頂いたコードと同じなので省略

突貫で考えたので粗悪ですが、とりあえずのコードを挙げます。

<仮定>
●ゲームモードは毎回選択する
 ⇔合計を取る意味が薄くなった。
●「じゃんけん処理関数」について
 ・引数は「プレイヤーの出した手」。戻り値は難易度にしたがい処理した「勝ち敗け結果」。

<簡単解説>
●主な変更点
 ・じゃんけん処理に使っていたswitch文を「ゲームモード毎のじゃんけん処理関数呼び出し」に変更。
 ・scanfが増えたので、エラー対策追加。
●変更コンセプトと反省点
 ・なるべく提示された原型を壊さずに改良して...続きを読む

QC言語で簡単なゲームを作る方法

僕はC言語を学び始めた程度ですが、一番簡単に作れるゲームとその作り方(ソース)を教えて下さい。お願いします。

Aベストアンサー

★じゃんけんゲームのソースです。

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

// じゃんけん定数
#define JKN_GOO  (0)
#define JKN_CHOKI (1)
#define JKN_PA  (2)

// 勝敗の定数
#define TYP_KATI (0)
#define TYP_MAKE (1)
#define TYP_AIKO (2)

// じゃんけんの判定関数
int check( int human, int computer )
{
 if ( human == computer ){
  return TYP_AIKO;
 }
 switch ( human ){
  case JKN_GOO:  return ((computer == JKN_CHOKI) ? TYP_KATI : TYP_MAKE);
  case JKN_CHOKI:  return ((computer == JKN_PA) ? TYP_KATI : TYP_MAKE);
  case JKN_PA:  return ((computer == JKN_GOO) ? TYP_KATI : TYP_MAKE);
  default:   return -1;
 }
}

// じゃんけんゲーム
int main( void )
{
 // ゲーム変数
 int count;  // 勝負回数
 int kati = 0; // 勝ちカウンタ
 int make = 0; // 負けカウンタ
 // 一時変数
 int human;  // キー入力の一時変数(人間用)
 int computer; // 乱数発生の一時変数(コンピュータ用)
 
 // (6)じゃんけん勝負を10回行う
 printf( "★じゃんけんゲーム(10回勝負)\n\n" );
 for ( count = 1 ; count <= 10 ; count++ ){
  // (1)人間:3つの状態を入力
  printf( "%2d回目…[1]グー [2]チョキ [3]パー を入力して下さい:", count );
  do {
   // (2)キー入力
   switch ( getche() ){
    case '1': human = JKN_GOO; break;
    case '2': human = JKN_CHOKI; break;
    case '3': human = JKN_PA; break;
    default: human = -1; break;
   }
  } while ( human == -1 );
  
  // (3)コンピュータ:3つの状態を乱数で決める
  computer = (rand() % 3);
  // (4)人間vsコンピュータの勝負
  switch ( check(human,computer) ){
   case TYP_KATI:
    kati++;
    printf( "⇒勝ち。\n" );
    break;
   case TYP_MAKE:
    make++;
    printf( "⇒負け。\n" );
    break;
   case TYP_AIKO:
    printf( "⇒引き分け。\n" );
    break;
   default:
    printf( "⇒エラー。\n" );
    break;
  }
 }
 // (7)結果表示
 printf( "\n★じゃんけんゲームの結果\n" );
 printf( "人間    :%d 回勝ち\n", kati );
 printf( "コンピュータ:%d 回勝ち\n", make );
 printf( "※引き分け回数は %d 回でした。\n", (10 - kati - make) );
 return 0;
}

注意:全角空白をタブ文字に変換して下さい。

★じゃんけんゲームのソースです。

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

// じゃんけん定数
#define JKN_GOO  (0)
#define JKN_CHOKI (1)
#define JKN_PA  (2)

// 勝敗の定数
#define TYP_KATI (0)
#define TYP_MAKE (1)
#define TYP_AIKO (2)

// じゃんけんの判定関数
int check( int human, int computer )
{
 if ( human == computer ){
  return TYP_AIKO;
 }
 switch ( human ){
  case JKN_GOO:  return ((computer == JKN_CHOKI) ? TYP...続きを読む

QC言語について

C言語のじゃんけんゲームを作成したいのですが、
仕様は
1.利用者とコンピュータによる対戦形式とします。
2.利用者がキーボードから入力した手(グー・チョキ・パー)と、擬似乱数を用いて生成したコンピュータの手を比較し、利用者の勝ち・あいこ・負けの結果を表示しなさい。
3.利用者の入力が不正の場合には再度入力を促すなど、適切な処理をしなさい。
4.これまでの累積勝利数・引き分け数・敗北数をそれぞれ、user_win・user_draw・user_loseの3つの変数(int型)に格納しなさい。
5.連勝中の場合は「5連勝中!」などと表示させるようにしなさい。
6.あいこである限りは自動的にじゃんけんを反復しなさい。
7.勝敗がついた場合、利用者にまだ継続するか質問した上で、じゃんけんを反復させなさい。
8.じゃんけんを終了した場合、これまでの通算成績として、累積勝利数・引き分け数・敗北数のほか、勝利=累積勝利数÷(累積勝利数+累積敗北数)×100、および、最大勝利数を計算して表示しなさい。

という仕様のじゃんけんゲームを作成したいのですが、下記に書いているまでしかできません。誰か教えていただけないでしょうか。分からなくて困っています。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(){
int a,c;

srand(time(NULL));
c = rand()%3+1;

printf("手を入力してください [1:グー 2:チョキ 3:パー] ");
scanf("%d",&a);

if(a==1 && c==1)
printf("あなたはグーで、私もグーでした。アイコです。\n");
else if(a==1 && c==2)
printf("あなたはグーで、私はチョキでした。あなたの勝ちです。\n");
else if(a==1 && c==3)
printf("あなたはグーで、私はパーでした。あなたの負けです。\n");
else if(a==2 && c==1)
printf("あなたはチョキで、私はグーでした。あなたの負けです。\n");
else if(a==2 && c==2)
printf("あなたはチョキで、私もチョキでした。アイコです。\n");
else if(a==2 && c==3)
printf("あなたはチョキで、私はパーでした。あなたの勝ちです。\n");
else if(a==3 && c==1)
printf("あなたはパーで、私はグーでした。あなたの勝ちです。\n");
else if(a==3 && c==2)
printf("あなたはパーで、私はチョキでした。あなたの負けです。\n");
else if(a==3 && c==3)
printf("あなたはパーで、私もパーでした。アイコです。\n");
else
printf("正しい手を入れてください。\n");

return 0;
}

C言語のじゃんけんゲームを作成したいのですが、
仕様は
1.利用者とコンピュータによる対戦形式とします。
2.利用者がキーボードから入力した手(グー・チョキ・パー)と、擬似乱数を用いて生成したコンピュータの手を比較し、利用者の勝ち・あいこ・負けの結果を表示しなさい。
3.利用者の入力が不正の場合には再度入力を促すなど、適切な処理をしなさい。
4.これまでの累積勝利数・引き分け数・敗北数をそれぞれ、user_win・user_draw・user_loseの3つの変数(int型)に格納しなさい。
5.連勝中...続きを読む

Aベストアンサー

>本当にC言語がさっぱりで、まったくわかんないんです。
・そのような方には、ちょっとレベルの高い課題ですね。
・なぞなぞを解くつもりで★楽しく課題に取り組んで。そしてなんといっても、数をこなすことです。

★たしか、課題の締め切りは「過ぎて」いますよね。以降、参考になれば・・。
・質問者様のソースには、ジャンケンの全ての組み合わせが書かれていますが、ちょっと工夫しました。
・下のソースの★部分、考えて!
・参考URLに文字コード。
(趣味の問題:cgTe[]の c は char型、 g はグローバルのつもり)

char cgTe[4][16] = { "0:未使用", "1:グー", "2:チョキ", "3:パー" };
void main()
{
 int a, c, user_win = 0, user_draw = 0, user_lose = 0, iRensyou = 0;
 char cStr[256];

 srand( time( NULL ) );

 while( 1 ){

  c = rand() % 3 + 1;

  printf( "手を入力してください [1:グー 2:チョキ 3:パー] 4:おわり\n" );

  scanf( "%s", &cStr );

  if( 0x34 == cStr[0] ) break; // ★なぜ、()内が cStr[0] == 0x34 でないか

  if( ( 0x31 > cStr[0] ) || ( 0x33 < cStr[0] ) ){

   printf( "正しい手を入れてください。[%s]\n", cStr );

   continue;
  }
  a = cStr[0] - 0x30; // ★文字列の先頭文字を数字へ

  if( a == c ){ // アイコ

   user_draw++;

   printf( "あなたは %s で、私も %s でした。アイコです。\n", cgTe[a], cgTe[c] );

   continue;
  }
  if( ( ( a + 1 ) == c ) || ( ( a - 2 ) == c ) ){ // 勝ち

   printf( "あなたは %s で、私は %s でした。あなたの勝ちです。\n", cgTe[a], cgTe[c] );

   user_win++;
   iRensyou++;

   if( 5 <= iRensyou ) printf( "%d連勝中です\n", iRensyou );

   continue;
  }
  if( ( ( a - 1 ) == c ) || ( ( a + 2 ) == c ) ){ // 負け

   user_lose++;
   iRensyou = 0; // 連勝ストップ

   printf( "あなたは %s で、私は %s でした。あなたの負けです。\n", cgTe[a], cgTe[c] );
  }
 }
 printf( "あなたの勝ち %d 負け %d アイコ %d\n", user_win, user_lose, user_draw );
}
(タブの代わりに全角空白を用いています。一括変換願います)

参考URL:http://e-words.jp/p/r-ascii.html

>本当にC言語がさっぱりで、まったくわかんないんです。
・そのような方には、ちょっとレベルの高い課題ですね。
・なぞなぞを解くつもりで★楽しく課題に取り組んで。そしてなんといっても、数をこなすことです。

★たしか、課題の締め切りは「過ぎて」いますよね。以降、参考になれば・・。
・質問者様のソースには、ジャンケンの全ての組み合わせが書かれていますが、ちょっと工夫しました。
・下のソースの★部分、考えて!
・参考URLに文字コード。
(趣味の問題:cgTe[]の c は char型、 g はグロ...続きを読む

Q3人のじゃんけんのプログラム

三人でじゃんけんをするプログラムを作るために
法則性を探しています。

グーを0,チョキを1,パーを2とした時に
あいこであるパターンは
000,012,021,021,102,111,120,201,210,222
勝ちのパターンは
001,010,011,112,121,122,200,202,220
負けのパターンは
002,020,022,100,101,110,211,212,221
でした。(違っていたら申し訳ないです。)

ここから法則を探そうと思うととりあえず、あいこの
パターンは3つの数字を足すと0,3,6のどれかになり
3の倍数になっていることがわかりました。

ですが、勝ちと負けは法則性が見つけられません。

もしかすると、このやり方以外にも3人のじゃんけんの
結果を示すプログラムを導く方法はあるかもしないので
もしご存知でしたらご教授お願いします。

Aベストアンサー

アルゴリズム系の問題は苦手だけど回答に挑戦。


じゃんけんする3人を A, B, C
グー = 0 チョキ = 1 パー = 2

とるする場合

(A + B + C) ÷ 3 のあまりが

:0の場合
 あいこ

: 1の場合
 ひとりだけ負け

 A = B なら C の負け
 B = C なら A の負け
 それ以外なら B の負け

: 2の場合
 ひとりだけ勝ち

 A = B なら C の勝ち
 B = C なら A の勝ち
 それ以外なら B の勝ち


ここから例えば A が勝ったかどうかは
((A + B + C) ÷ 3 のあまり = 1 かつ B = C でない) または ((A + B + C) ÷ 3 のあまり = 2 かつ B = C)
で判定できる。

TRUE に 1 FALSE に 0 という値が与えらるのなら
((A + B + C) ÷ 3 のあまり - 1) = (B = C)
でAの勝ちが分かる。


まちがってないかな…o(;-_-;)oドキドキ♪

アルゴリズム系の問題は苦手だけど回答に挑戦。


じゃんけんする3人を A, B, C
グー = 0 チョキ = 1 パー = 2

とるする場合

(A + B + C) ÷ 3 のあまりが

:0の場合
 あいこ

: 1の場合
 ひとりだけ負け

 A = B なら C の負け
 B = C なら A の負け
 それ以外なら B の負け

: 2の場合
 ひとりだけ勝ち

 A = B なら C の勝ち
 B = C なら A の勝ち
 それ以外なら B の勝ち


ここから例えば A が勝ったかどうかは
((A + B + C) ÷ 3 のあまり = 1 かつ B = C でない) ...続きを読む

QIF文で戻ることはできますか?(C++です)

例えば
cin >> A;
if(A > 100 || A <0 ){
cout << "MISS";
}
とあったとします。
もし、MISS表示になってしまった後、またcinにもどるにはどうすればいいですか?
初歩的な質問ですみません。

Aベストアンサー

既に回答がありますが、プログラムの「気持ち」は、

・入力された値が不正である間、再入力を求める
・不正な入力に対しては、その旨表示する

ということでしょうから、関数を使って、それぞれを分離すると、見通しが良くなることがあります。

bool isOK(int a)
{
if (a >= 0 && a <= 100)
return true;
else
{
std::cout << "MISS";
return false;
}
}


do{
std::cin >> a;
} while(! isOK(a));

この方法のもうひとつの利点は、「入力が妥当」という判断を将来変更する場合に、柔軟に対応できるということです。
たとえば、

・0 から 100 の値が正常
・3回失敗したら、もしかしたら入力条件を忘れているのかもしれないから、改めて表示
・でも、30回も入力したら、強引に 50にして継続

などということも、main の流れを乱さずに対応可能という点です。

QC言語でのじゃんけん

こんちには。
C言語の乱数を用いてじゃんけんプログラムを作ろうと思っているのですが、
エラーメッセージが出てしまいうまくいきません。
どこがおかしいのでしょうか?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int i,j,k;
printf("じゃんけんをしましょう(ぐー:1、ちょき:2、ぱー:3)¥n");
for(k=k; k<=10; k++)
{
srand(time(NULL));
j=rand()%3+1;
scanf("%d",&i);
if(i==1&&j==1)
printf("私はグーなので、あいこです¥n");
else if(i==1&&j==2)
printf("私はチョキなので、あなたの勝ちです¥n");
else if(i==1&&j==3)
printf("私はパーなので、あなたの負けです¥n");
else if(i==2&&j==1)
printf("私はグーなので、あなたの負けです¥n");
else if(i=2&&j==2)
printf("私はチョキなので、あいこです¥n");
else if(i==2&&j==3)
printf("私はパーなので、あなたの勝ちです¥n");
else if(i==3&&j==1)
printf("私はグーなので、あなたの勝ちです¥n");
else if(i==3&&j==2)
printf("私はチョキなので、あなたの負けです¥n");
else if(i==3&&j==3)
printf("私はパーなので、あいこです¥n");
else
printf("1か2か3を入力してください¥n");
}
}

OS mountain lionで利用中ですが、
「じゃんけんをしましょう(ぐー:1、ちょき:2、ぱー:3)」
と表示されたまま、うまく動作しません。
教えてください。

こんちには。
C言語の乱数を用いてじゃんけんプログラムを作ろうと思っているのですが、
エラーメッセージが出てしまいうまくいきません。
どこがおかしいのでしょうか?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int i,j,k;
printf("じゃんけんをしましょう(ぐー:1、ちょき:2、ぱー:3)¥n");
for(k=k; k<=10; k++)
{
srand(time(NULL));
j=rand()%3+1;
scanf("%d",&i);
if(i==1&&j==1)
printf("私はグーなので、あいこです¥n");
else if(i==1&&j==2)
printf("私はチョキなので...続きを読む

Aベストアンサー

> エラーメッセージが出てしまいうまくいきません

エラーメッセージを読んでください。
修正作業はそこからがスタートです。

人に聞いたり、ネットで検索したりする場合は、エラーメッセージはそのまま貼り付けてください。
下手に意訳されるとかえって混乱します。

コンパイラは何を使ってますか?
clangを使っているなら、エラー箇所にマークを付けて表示してくれるはずです。


そのプログラムをこちらでコンパイルしたところ、エラーにはなりませんが、警告(warning)が出ました。

警告は、エラーと違って、コンパイル自体は完了します。
しかし、何かの問題が発生する可能性がある、と予想される箇所です。警告メッセージを読んで、内容を理解し、修正するべきものか、無視するものかを判断する必要があります。


あきらかにおかしく、警告が出るのは
for(k=k; k<=10; k++)

警告ではないけど、noteとして注意してくれるのが
else if(i=2&&j==2)

です。この2つは、メッセージを読んで理解できれば、簡単に修正できるはずです。

難しいのは、エラー等は出ないのに、使い方が間違っている、というものです。

> srand(time(NULL));
乱数の仕組みについて、理解が不十分です。
randで使われているのは「疑似乱数」といって、「乱数っぽく見える」値を計算で求めています。
その式はいろいろとありますが、基本は「前回まで発生させた乱数を使って、次の乱数を計算する」というものです。
計算方法から「『前回まで発生させた乱数』が同じなら、『次の乱数』も同じになる」という性質があります。

このような計算をするなら「最初の値」が必要になります。これを「種」と言います。種を設定するのがsrandです。
そして、その性質から「種」が同じなら、続く乱数列は同じものになります。

srandにtimeを使う、というのは実行時毎に違う乱数を発生させたいときによく使われる手段です。
ですが、逆に1秒以内に実行すると、timeが同じ→種が同じ→乱数が同じ、となってしまいます。
このプログラムで言えば、パーで勝ったら最大1秒間はパーで勝ち続けられます。負けたとしても、相手は最大1秒間同じ手を出しますから、簡単に勝てます。

また、疑似乱数は、何度も計算を繰り返したときに、乱数っぽくなることを目指したものです。
毎回初期化しては、その乱数っぽさが出ない可能性があります。

srandは最初に1回だけにします。


> j=rand()%3+1;

randがどう作られているか、によるのですが
C標準のrandは、特定ビットに注目すると、短い周期的でパターンが繰り返されやすい傾向があるようです。
特に下位ビットでそうなりやすく、「余り」を使うと、その影響を大きく受け、(乱数っぽくない)特定パターンの繰り返しになりやすいです。
この程度の遊びならいいかもしれませんが、本格的にやるなら、他の方法にしましょう。


> 「じゃんけんをしましょう(ぐー:1、ちょき:2、ぱー:3)」
> と表示されたまま、うまく動作しません。

リアルタイムなキー入力では無いので、returnを押して確定しなければ、scanfで取り込むことはできません。
数字だけ入力しても先に進まないのは、プログラムの仕様通りです。

もし、他の現象なら、その「うまく動作しない」状況を、具体的に説明してください。

> \n

Macの場合、円マークとバックスラッシュは区別されます。
もし、これらが全て「円マーク」だったら、バックスラッシュに変更してください。
option+¥ でバックスラッシュになるはずです。

> エラーメッセージが出てしまいうまくいきません

エラーメッセージを読んでください。
修正作業はそこからがスタートです。

人に聞いたり、ネットで検索したりする場合は、エラーメッセージはそのまま貼り付けてください。
下手に意訳されるとかえって混乱します。

コンパイラは何を使ってますか?
clangを使っているなら、エラー箇所にマークを付けて表示してくれるはずです。


そのプログラムをこちらでコンパイルしたところ、エラーにはなりませんが、警告(warning)が出ました。

警告は、エラーと違って、...続きを読む

Q戻り値の意味がわかりません…

戻り値とはどういう値なのか簡単な例文で教えて頂けますか?

Aベストアンサー

バカくさいかもしれませんが簡単な例えをだしてみます。
2人の子供がいて、名前をそれぞれ太郎・花子にしましょう。この2人の子にある役割を決めます。
・花子は飴をもらうと、それをチョコにする役割。(できるかは別として)
・太郎は花子を呼んで飴をあげる役割。

さてこの例では太郎の飴が引数(ひきすう)になり
花子のチョコが戻り値になります。

このイメージを元に次の文を読んでみてください。

「プログラム中の関数やサブルーチンが処理を終了し
呼び出し元に処理の結果として返す値。」

これが戻り値の正しい定義です。
そのほかにはNo1さんのような役割指すときも、それを「戻り値」と呼んだりします。

QC言語初心者です。 ジャンケンゲーム

今、授業の課題でジャンケンゲームを作成していますが、なかなかできません。もし、良かったら何処が違うのか教えてください。

// main.c
#include <stdio.h>
#include <time.h>
//#include <time.h>
#include "my.h"
main(int argc, char* argv[]){
int i;
char s[7];
printf("これはジャンケンゲームです。\n");
printf("手を入力します(グー:1 チョキ:2 パー:3)\n");
scanf("%s",&s[7]);
srand((unsigned)time(NULL));
printf("%s\n",jyan(dice(3)));
if(s == jyan){
printf("あいこです。\n");
}else if(s == 1 && jyan ==2){
printf("あなたの勝ちです。\n");
}else if(s == 2 && jyan == 3){
printf("あなたの勝ちです。\n");
}else if(s == 3 && jyan ==1){
printf("あなたの勝ちです。\n");
}else{
printf("コンピュターの勝ちです。\n");
}

}



// dice.c
#include <time.h>
int dice(int n){
srand((unsigned)time(NULL));
return(rand()%n+1);

}


// jyan.c
char *jyan(int n){
static char s[][7]={"グー","チョキ","パー"};
return s[--n];


}


// my.h
#include <stdio.h>
char *jyan(int hand);
//int dice(int n);




見づらくて申し訳ありません。4つのファイルに分けて作成しています。上記のプログラムだと自分の手、コンピューターの手がランダムに出てくるのですが判定が出来ませんでした。アドバイス、よろしくお願いします。

長文になってしまい申し訳ありません。

今、授業の課題でジャンケンゲームを作成していますが、なかなかできません。もし、良かったら何処が違うのか教えてください。

// main.c
#include <stdio.h>
#include <time.h>
//#include <time.h>
#include "my.h"
main(int argc, char* argv[]){
int i;
char s[7];
printf("これはジャンケンゲームです。\n");
printf("手を入力します(グー:1 チョキ:2 パー:3)\n");
scanf("%s",&s[7]);
srand((unsigned)time(NULL));
printf("%s\n",jyan(dice(3)));
if(s == jyan){
printf("あ...続きを読む

Aベストアンサー

scanf("%s",&s[7]);
が、だめです。
文字を入力させるつもりなら
scanf("%s",s);

&s[7]だと確保した領域外になってしまいます。
>if(s == jyan){
>printf("あいこです。\n");
>}else if(s == 1 && jyan ==2){
から入力とjyanの返す値は数値を想定していますが、
数値ではありません。

Q多人数のじゃんけんプログラム

多人数でのじゃんけんプログラムを作成しています。

設定としては、
自分とコンピュータのじゃんけん大会
コンピュータの参加人数は最大で10人、
コンピュータの参加人数は自分で任意選択(1~10人)、誰か参加するかはランダム
出す手は、(自分の手→任意に選択)(コンピュータの手→参加者ごとにランダムで設定)
自分・コンピュータ(1~10)に固有の名前を与えてそれぞれの勝ち数をカウントする
じゃんけん終了後、買った回数順に順位をつけて、1位から順に表示する。

↑のようなプログラムを作成したいと思っております。
私が悩んでいる点は、じゃんけんの結果判定の方法と勝ち数ごとの順位付け・並び替えの方法です。(全部ですね・・・)
結果の判定方法は、
場に出ている手が2種類なら(勝ちか負け)、1種類・3種類なら(あいこ)とし、
2種類の場合には、出ている手と比較し勝敗判定を行う、
という形がいいのかなと思ってます(javaでどう書けばいいのかはわかりません--;)
並べ替えは、配列をうまく使えばいけるでしょうか?


ネットやテキストなどで学習中ですが全体的にわからない点が多く、
考え方(結果判定・順位付け&並び替え)やソースサンプルなどお教えいただけると嬉しいです。
どうぞ宜しくお願いいたします。

多人数でのじゃんけんプログラムを作成しています。

設定としては、
自分とコンピュータのじゃんけん大会
コンピュータの参加人数は最大で10人、
コンピュータの参加人数は自分で任意選択(1~10人)、誰か参加するかはランダム
出す手は、(自分の手→任意に選択)(コンピュータの手→参加者ごとにランダムで設定)
自分・コンピュータ(1~10)に固有の名前を与えてそれぞれの勝ち数をカウントする
じゃんけん終了後、買った回数順に順位をつけて、1位から順に表示する。

↑のようなプログラムを作成したい...続きを読む

Aベストアンサー

参加者をオブジェクトとして捉えるのが良いかと思います。
==================================
勝敗判定:
それぞれの手を何人が出していたかは関係なく、
自分の手と、その場に出ていた手の種類だけで勝敗判定可能です。

参加者に、場に出た手の種類を通知し、
「自分は勝ったか?」を判別し、勝ち数を覚えておいてもらえば、
成績の管理を他で行う必要がなくなります。
==================================
順位付け:
参加者をオブジェクトとして捉えた場合、
最後の順位付けは、参加者をList化しておいて、
それぞれから申告された勝ち数でソートすれば可能です。
ArrayListに登録されたオブジェクトのソート ということで、
参考URLを記載しておきます。
http://www.atmarkit.co.jp/fjava/javatips/140java030.html

Qあっち向いてホイのプログラムについて・・・

あっちむいてほいのプログラムを作りたいんですが
コンピューターにランダムに上下左右を選ばせる
プログラムが分かりません。
どなたか教えてください。

Aベストアンサー

C/C++はかじり出したばかりなもので(^^;)、とりあえず
ソースコードではなく発想の一般論として言えば、

(1) 乱数を発生させる。
(2) 4で割る。
(3) 余りが0→上、1→下、2→左、3→右と割り当てる。

…てな感じでどうでしょうか?


人気Q&Aランキング