マスターマインド

数字当てゲーム - みずぴー日記 にインスパイヤされて『マスターマインド』を作ってみます。 ゲームそのものの呼び方はさまざまで マスターマインド - Wikipedia にも『ヒット・アンド・ブロー』と呼ばれていると書かれています。

以前は Ruby の作者の Matz さんの『Matz にっき』にも出ていた問題なので、記憶に残っている人もいるかもしれません。

#! /usr/local/bin/nawk -f
# hit_blow.awk
# usage: nawk -f hit_blow.awk

BEGIN {
    num = get_random_num();

    for (;;) {
        printf("input 4 digit number > ");
        getline input < "/dev/stdin";

        check = get_hit_blow(num, input);

        if (check == "4 0") {
            print "CLEAR!!";
            exit;
        }
    }
}

# get_random_num():     4 桁のランダムな数を返す
function get_random_num(    i, num) {
    srand();

    for (i = 1; i <= 4; i++) {
        num = num int(rand() * 10);
    }

    return num;
}

# get_hit_blow():   ヒット & ブローの数を返す
#   in:     回答となる数 (num1)
#           ユーザーの入力 (num2)
#   out:    ヒットとブローの数
function get_hit_blow(num1, num2,
            arr_num1, arr_num2, i, j, count_hit, count_blow) {
    split(num1, arr_num1, "");
    split(num2, arr_num2, "");

    for (i = 1; i <= 4; i++) {
        if (arr_num2[i] == arr_num1[i]) {
            count_hit++;
        } else if (match(num1, arr_num2[i])) {
            count_blow++;
        }
    }

    print "hit: " count_hit + 0 ", blow: " count_blow + 0;

    return count_hit + 0 " " count_blow + 0;
}

ブローのカウント方法が良く分かっていませんが、数字当てゲーム - みずぴー日記 に合わせてマッチすればカウントするようにしています。

実際に動かしてみます。

$ nawk -f hit_blow.awk
input 4 digit number > 1111
hit: 2, blow: 2
input 4 digit number > 1234
hit: 0, blow: 1
input 4 digit number > 5678
hit: 0, blow: 1
input 4 digit number > 9812
hit: 1, blow: 2
input 4 digit number > 9123
hit: 2, blow: 0
input 4 digit number > 9156
hit: 2, blow: 0
input 4 digit number > 9171
hit: 3, blow: 0
input 4 digit number > 9181
hit: 4, blow: 0
CLEAR!!

個人的にこういう数字遊びは苦手ですが、プログラムとしては難しくないので、作ってみました。

tag_nawk.png tag_nawk.png tag_nawk.png tag_nawk.png