Hit and Blowとは
4桁の数字を当てるゲームを行います.
このときプレイヤーは4桁の数字を入力し,その数字と答えの数字との一致している桁数を得ることができます.
入力した数字が答えの数字と位置まで一致している場合にはHit,数字は一致しているが,位置が間違っている場合にはBlowとして出力されます.
しかしどの桁の数字がHitやBlowしているのかはわかりません.
また答えの各桁の数字は重複がないようにしています.
例えば1234が答えだった場合,1345を入力すると,1Hit,2Blowとなります.
このゲームをC言語を用いて実装します.
以下の4つのファイルを同じディレクトリに配置して実行すれば,プレイできます.
header.h
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 4 //ヒットアンドブローゲームの桁数(1~10)
extern int answer[10], input[N];
void make_answer(void);
void get_player_answer(int count);
Main.c
#include "header.h"
int answer[10], input[N];
int main(void) {
int i, j, count = 1;
srand((unsigned int)time(NULL));
make_answer();
while (1) {
unsigned short hit = 0, blow = 0; //hit数、blow数保存用変数の初期化
get_player_answer(count);
for (i = 0; i < N; i++) {
if (input[i] == answer[i]) {
hit++; //hit数保存用変数更新
continue;
}
for (j = 0; j < N; j++) {
if (input[i] == answer[j]) {
blow++; //blow数保存用変数更新
break;
}
}
}
printf("%dhit, %dblow\n", hit, blow);
if (hit == N)
break; //ヒット数が桁数に一致したら終了
count++;
}
printf("%d回でクリア!!\n", count);
return 0;
}
player.c
#include"header.h"
void get_player_answer(int count) {
int key, i;
printf("%d桁の数字を入力(%d回目):", N, count);
scanf_s("%04d", &key); //キーボードからN桁の数字を受け取る
for (i = 0; i < N; i++) { //4桁の数字の各位の数を配列に格納
input[i] = key % 10;
key /= 10;
}
}
answer.c
#include"header.h"
void make_answer(void) {
int i, temp, rand1, rand2;
for (i = 0; i < 10; i++)
answer[i] = i; //正答用配列の初期化
for (i = 0; i < 20; i++) { //正答用配列の生成(20は任意の入れ替え回>数)
for (rand1 = 0; rand1 < 10; rand1++) {
rand2 = rand() % 10;
temp = answer[rand1];
answer[rand1] = answer[rand2];
answer[rand2] = temp;
}
}
}