専門家に聞いた!繰り返す痔の原因は!? >>

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

A 回答 (3件)

C/C++はかじり出したばかりなもので(^^;)、とりあえず


ソースコードではなく発想の一般論として言えば、

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

…てな感じでどうでしょうか?
    • good
    • 0
この回答へのお礼

ありがとうございます。
もしよろしかったらcrimsonさんにも
KOH_daにお願いした質問をお願いしたいのですが…

お礼日時:2001/07/09 18:25

4月からなら楽勝だと思うんですけど...。


もしかして教える人の技量が低いか、
学生側に問題があるかのどちらかだと思います。
それはさておき...。

もう一度、じゃんけんに...ではなく、
while+breakの組み合わせを覚えると便利です。
こんな感じです。
メインからは...
 while() {
  janken();
  hoi();
  if(やめ) break;
 }
というように呼び出すものとして、

void janken()
{
 while(1) {
  じゃんけん処理;
  if(決着がついた) break;
 }
}

なんて処理はいかがでしょうか。
じゃんけんの勝敗などは、
すべてグローバル変数で受け渡すものとします。
    • good
    • 0

ホントに作りたいと思ってるの?


作らなきゃならない事情があるんでしょ(笑)。
プログラムの始めの方で、

  srand(time(NULL));

ランダムに上下左右は、

  w = rand() % 4;

くらいが無難だと思います。
0-3の値が得られるので、得られた値によって、
上下左右の処理に振り分ければいいです。
time()を使うので、#include <time.h>もいります。

この回答への補足

実は学校で課題としてでてるんです…(笑)
回答ありがとうございます。
あともう1つ質問したいんですが…よろしいでしょうか?
ある程度までプログラムを実行したところで
指定したある場所に移動するようにするにはどうしたらいいでしょうか?
例えば、じゃんけんで勝ったけどあっち向いてホイのところで向きが一致
しなかったらもう一度じゃんけんに戻りますよね?
そういう場合はどうしたらいいんでしょうか??
4月にCをやり始めたんですが授業でそこらへんのところはまだやってないんですよ。
それで作れって言うほうがおかしいと思うんですが、出さないと単位が…

補足日時:2001/07/09 18:09
    • good
    • 0

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

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

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

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

Qじゃんけんゲームをつくったのですが・・・。

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

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

Aベストアンサー

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

#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;
}

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

#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(...続きを読む

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 はグロ...続きを読む

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...続きを読む

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 でない) ...続きを読む


人気Q&Aランキング