Numer0n数当てゲーム

投稿者: | 2012年6月15日

フジテレビの深夜枠で放送されていたヌメロンという数当てゲームの動きを書いてみました。このゲームは、プレイヤー二人が向かいあって対戦するもので、基本的なルールは次のとおりになります。

基本ルール

  1. それぞれのプレイヤーが0~9までの数字が書かれたカードのうち3つを使って3ケタの番号を作成する。ただし、「112」「121」といった同じ数字を2つ以上使用した番号は作れない。
  2. 先攻のプレイヤーは相手が作成したと思われる番号をコールする。相手はコールされた番号と自分の番号を見比べ、コールされた番号がどの程度合って いるかを発表する。数字と位置が合っていた場合は「EAT」、数字は合っているが位置は合っていない場合は「BITE」となる。例として相手の番号が 「765」、コールされた番号が「746」であった場合「1EAT-1BITE」となる。
  3. これを先攻・後攻が繰り返して行い、先に相手の番号を完全に当てきったプレイヤーの勝利となる。

海戦ゲームを数字に置きかえてシンプルにし、艦船の位置による限定要因(推測の手掛かり)を、数字の有無であったり数字の位置情報に置きかえたようなゲームです。

ソースコード

このソースコードでは、プログラムが乱数で決定した3桁の数字をユーザが当てる形式をとっています。プログラムはユーザの入力値に基づいて、「イート」「バイト」「ヒット」の情報を正確に答えます。

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

int main()
{
    char x, y, z;
    int a, b, c;
    int n, m;

    /* 3桁の乱数値を生成 */
    srand((unsigned int)time(NULL));
    x = (char)(rand()%10);
    do {
        y = (char)(rand()%10);
    } while(y == x);
    do {
        z = (char)(rand()%10);
    } while(z == x||z == y);

    for (;;) {

        /* ユーザ入力を受け、1の位、10の位、100の位に分ける */
        scanf("%3d", &n);
        a = n/100;
        b = n%100/10;
        c = n%10;

        /* 不正な入力値をはじく */
        if (n < 12||n > 987||a == b||a == c||b == c)
            continue;

        /* 「イート」の数 */
        n = 0;
        if (a == x) n++;
        if (b == y) n++;
        if (c == z) n++;

        /* 「バイト」の数 */
        m = 0;
        if (a == y || a == z) m++;
        if (b == x || b == y) m++;
        if (c == x || c == y) m++;

        if (n != 3)
            printf("%d-%d\n", n, m);
        else {
            puts("Hit!\n");
            break;
        }
    }
    return 0;
}

アイテムなどの特別ルールはありません。基本システムだけです。

コメントを残す

メールアドレスが公開されることはありません。