見出し画像

C言語でじゃんけん!

とっても基本的な言語、C言語でじゃんけんをサンプルをお借りして実行してみます。

https://とうごろう.jp/wiki/授業/C言語基礎/じゃんけんゲーム/

実行環境は

を使って行きます。登録が必要ですが、無料で使えてC言語のようなコンパイルが必要な言語でもすぐに実行できる仕組みなので手軽に始めることができます。

使い方は

がわかりやすいかなと思います。

C言語は今時のプログラミング言語、SwiftやPythonなど違いちょっとめんどくさい作法があります。

まずおまじない。

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

いろんなライブラリを取り込んで使います。

そして必ず必要なものが

int main(void) {
  // 処理
}

ということになります。

int main(void) {
  printf("Hello");
}

とすると"Hello"とコンソールに出力されます。(Replitで実行した場合:通常はコンパイルが必要となります)

ここでじゃんけんは自分とコンピュータということになるのですが、相手であるコンピュータの手を自動で決めて行きたいと思います。その時に役立つのが乱数を発生させるプログラムです。

JavaScriptであれば乱数は

com_hands = Math.floor( Math.random() * 3);

で0,1,2という数字を簡単に作ることができました。Math.random()でランダムな数字を作ることができたからです。C言語の場合はちょっと工夫が必要です。

#include <time.h>

int main(void) {
  int r;

  srand((unsigned int) time(NULL));
  r = rand();
  printf("%d\n", r);

  return 0;
}

srand((unsigned int) time(NULL));

ということで乱数を作る時に常に変化する"何か"を用意する必要があります。これをこの場合、時間"time"を使っています。時間は常に変わっていっていますのでちょうどいいものになります。これで作る乱数は

2119997798、916550687、1562974782  ・・・

という数字が出てきます。

じゃんけんでは

1: グー、2: チョキ、3: パー

という数字が欲しいので

 srand((unsigned int) time(NULL)); 
 r = rand() % 3 + 1;

と乱数で出てきた数字を3で割った余りに1を足してやります。これで1,2,3の数字がランダムに出てくるようになります。

自分の手はどうして入力するかというと

scanf("%d", &h);

という感じでかくと変数"h"に代入されるのでこれを使ってじゃんけんの判定をします。

それでは大事な判定です。

 if (h != r) { break; }
    printf("あいこでしょ!(1: グー、2: チョキ、3: パー):\n");
  }

  if (r == 1 && h == 3 || r == 2 && h == 1 || r == 3 && h == 2) {
    printf("あなたの勝ち!\n");
  } else {
    printf("あなたの負け!\n");
  }

判定としてはまず"あいこ"

 if (h != r) 

自分が勝つパターン

 if (r == 1 && h == 3 || r == 2 && h == 1 || r == 3 && h == 2)

負けるのはそれ以外なので

else 

を使います。

"あいこ"の時はもう一度手を出し直すので、この場合繰り返しの"while"を使います。使い方は2つパターン

無限ループを使う場合

"while (1)"として無限ループを作り"あいこ"以外の時に"break"でループを抜ける方法。

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

int main(void) {
  int r, h;

  srand((unsigned int) time(NULL));  // 乱数のシード

  printf("じゃんけんぽん!(1: グー、2: チョキ、3: パー):\n");
  while (1) {
    r = rand() % 3 + 1;
    scanf("%d", &h);
    printf("あなた: %d、コンピューター: %d(1: グー、2: チョキ、3: パー)\n", h, r);
    if (h != r) { break; }
    printf("あいこでしょ!(1: グー、2: チョキ、3: パー):\n");
  }

  if (r == 1 && h == 3 || r == 2 && h == 1 || r == 3 && h == 2) {
    printf("あなたの勝ち!\n");
  } else {
    printf("あなたの負け!\n");
  }

  return 0;
}

"あいこ"の判定の場合に繰り返し入力を求める場合。

"while (h == r)"の場合、あいこの場合は再度入力を求めるパターン。

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

int main(void) {
  int r, h;

  srand((unsigned int) time(NULL));  // 乱数のシード

  printf("じゃんけんぽん!(1: グー、2: チョキ、3: パー):\n");
  r = rand() % 3 + 1;
  scanf("%d", &h);
  printf("あなた: %d、コンピューター: %d(1: グー、2: チョキ、3: パー)\n", h, r);

  while (h == r) {
    printf("あいこでしょ!(1: グー、2: チョキ、3: パー):\n");
    r = rand() % 3 + 1;
    scanf("%d", &h);
    printf("あなた: %d、コンピューター: %d(1: グー、2: チョキ、3: パー)\n", h, r);
  }

  if (r == 1 && h == 3 || r == 2 && h == 1 || r == 3 && h == 2) {
    printf("あなたの勝ち!\n");
  } else {
    printf("あなたの負け!\n");
  }

  return 0;
}

これでじゃんけんが成立するようになりました。

この記事が気に入ったらサポートをしてみませんか?