#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
unsigned int seigo[15][2] = { 0 };
unsigned int info[15][4] = { 0 }; //com用のデータ保存
int a, b, c, d, e, f, g, h, answer, n, kaisu;
int maru, sankaku;
int kaisuB;
void com(void); //comの関数
void player(void); //playerの関数
int finish(void); //gameの終了判定の関数
void seigoA(int A, int B); //プレイヤーの「△」を表示する関数
void seigoB(int C, int D); //プレイヤーの「○」を表示する関数
int seigoC(int A, int B) //comが△や○を調べる関数
int main(void)
{
int mouikkai = 0; //もう一回やるかどうか
printf("4桁の数あてゲームを始めるぞ。わし(コンピューター)と人間(あなた)が戦う。\n0はでてこないはずじゃ。\n");
printf("○は数字も桁もあっている数、△は数字は合っているけれど桁が違う数を表す。\n");
printf("文字を入力するとバグるぞ。\n");
printf("computerに対しては、正しい数を入力してくれ。\n");
srand(time(NULL)); //乱数の種を初期化
do
{
e, f, g, h = 0; //変数の初期化
kaisuB = 0;
int finish_ = 0;
printf("まず、4桁の数字(0や同じ数字を含むものはno)をおもいうかべてくれ。10秒まつ。\n");
Sleep(10 * 1000);
do
{
a = rand() % 9 + 1;
b = rand() % 9 + 1;
c = rand() % 9 + 1;
d = rand() % 9 + 1;
answer = 1000 * a + 100 * b + 10 * c + d; //コンピューターの数を乱数で作成
} while (a == b || a == c || a == d || b == c || b == d || c == d);
int senko_koko = rand() % 2; //先攻か後攻か
if (senko_koko == 0) { //先攻のとき
for (;;)
{
player();
com();
finish_ = finish();
if (finish_ == 1)
break;
}
}
else { //後攻のとき
for (;;)
{
com();
player();
finish_ = finish();
if (finish_ == 1)
break;
}
}
do {
printf("もう一回やるか?\nはい...1\nいいえ...0\n");
scanf_s("%d", &mouikkai);
if (mouikkai != 0 && mouikkai != 1) {
printf("指示を聞け!\n");
}
} while (mouikkai != 0 && mouikkai != 1);
} while (mouikkai == 1);
return 0;
}
void seigoA(int A, int B)
{
if (A == B)
printf("△");
return;
} //プレイヤーの△を表示する関数
void seigoB(int C, int D)
{
if (C == D)
printf("○");
return;
} //プレイヤーの〇を表示する関数
int seigoC(int A, int B) {
if (A == B) {
return 1;
}
else {
return 0;
}
} //com用の正誤判定関数
void player(void) {
printf("\nあなたの番じゃ。\n");
printf("9999以下の数字を一桁づつ入力せい。\n");
do {
printf("千の位");
scanf_s("%d", &e);
printf("百の位");
scanf_s("%d", &f);
printf("十の位");
scanf_s("%d", &g);
printf("一の位");
scanf_s("%d", &h);
kaisu++;
if (e == f || e == g || e == h || f == g || f == h || g == h)
{
printf("\a同じ整数を入力するなといったはずだ。やり直し!\n");
}
if (e < 1 || e>9 || f < 1 || f>9 || g < 1 || g>9 || h < 1 || h>9) {
printf("\a指示に従え。やり直し!\n");
}
} while (e == f || e == g || e == h || f == g || f == h || g == h || e < 1 || e>9 || f < 1 || f>9 || g < 1 || g>9 || h < 1 || h>9); //プレイヤーの数字を読み取る
n = 1000 * e + 100 * f + 10 * g + h;
seigoA(a, f);
seigoA(a, g);
seigoA(a, h);
seigoA(b, e);
seigoA(b, g);
seigoA(b, h);
seigoA(c, e);
seigoA(c, f);
seigoA(c, h);
seigoA(d, e);
seigoA(d, f);
seigoA(d, g); //プレイヤーの数字の△を示す
seigoB(a, e);
seigoB(b, f);
seigoB(c, g);
seigoB(d, h); //プレイヤーの数字の〇を示す
}
void com(void)
{
printf("\nコンピューターの番じゃ。\n");
maru = 0;
sankaku = 0;
int saizenkamo[2000] = { 0 };
int kouho = 0;
int randamu = 0;
int saizen = 0;
if (kaisuB == 0) { //1手目
int a = 0;
int b = 0;
int c = 0;
int d = 0;
do
{
a = rand() % 9 + 1;
b = rand() % 9 + 1;
c = rand() % 9 + 1;
d = rand() % 9 + 1;
saizen = 1000 * a + 100 * b + 10 * c + d; //コンピューターの数を乱数で作成
} while (a == b || a == c || a == d || b == c || b == d || c == d);
}
else if (kaisuB == 1) { //2手目
int sankaku = 0;
int maru = 0;
int a = info[0][0];
int b = info[0][1];
int c = info[0][2];
int d = info[0][3];
int aa = 0;
int cc = 0;
int dd = 0;
int bb = 0;
while (maru > 0 || sankaku != 1 || aa == bb || aa == cc || aa == dd || bb == cc || bb == dd || cc == dd) {
aa = rand() % 9 + 1;
bb = rand() % 9 + 1;
cc = rand() % 9 + 1;
dd = rand() % 9 + 1;
saizen = 1000 * aa + 100 * bb + 10 * cc + dd; //コンピューターの数を乱数で作成
int j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y;
j = seigoC(a, bb);
k = seigoC(a, cc);
l = seigoC(a, dd);
m = seigoC(b, aa);
n = seigoC(b, cc);
o = seigoC(b, dd);
p = seigoC(c, aa);
q = seigoC(c, bb);
r = seigoC(c, dd);
s = seigoC(d, aa);
t = seigoC(d, bb);
u = seigoC(d, cc);
sankaku = j + k + l + m + n + o + p + q + r + s + t + u;
v = seigoC(a, aa);
w = seigoC(b, bb);
x = seigoC(c, cc);
y = seigoC(d, dd);
maru = v + w + x + y;
}
}
else { //3手目以降
for (int a = 1; a < 10; a++) {
for (int b = 1; b < 10; b++) {
for (int c = 1; c < 10; c++) {
for (int d = 1; d < 10; d++) {
int goodkouho = 0;
if (a == b || a == c || a == d || b == c || b == d || c == d) {
}
else {
for (int i = 0; i < kaisuB; i++) {
int e = info[i][0];
int f = info[i][1];
int g = info[i][2];
int h = info[i][3];
int sankaku, maru;
sankaku = seigoC(a, f) + seigoC(a, g) + seigoC(a, h) + seigoC(b, e) + seigoC(b, g) + seigoC(b, h) + seigoC(c, e) + seigoC(c, f) + seigoC(c, h) + seigoC(d, e) + seigoC(d, f) + seigoC(d, g);
if (seigo[i][0] == maru && seigo[i][1] == sankaku) {
goodkouho++;
}
}
if (goodkouho == kaisuB) {
saizenkamo[kouho] = 1000 * a + 100 * b + 10 * c + d;
kouho++;
}
}
}
}
}
}
if (saizenkamo[0] == 0) {
printf("\nありえないんじゃないか?");
}
if (kouho == 1) {
printf("\nこれで間違いないじゃろう!\n");
}
randamu = rand() % kouho;
saizen = saizenkamo[randamu]; //候補の中からランダムで選ぶ
}
if (saizen == 0) {
printf("なにかおかしい。入力をミスってないか?次からは気を付けてくれ。\n");
printf("正解は%dじゃった。", answer);
} //comで答えがありえなくなった時の表示
info[kaisuB][0] = saizen / 1000;
info[kaisuB][1] = (saizen / 100) % 10;
info[kaisuB][2] = (saizen / 10) % 10;
info[kaisuB][3] = saizen % 10; //comの数を保存
printf("%dでどうじゃ。\n", saizen);
do {
printf("〇:");
scanf_s("%d", &maru);
printf("△:");
scanf_s("%d", &sankaku);
if (maru > 4 || maru < 0 || sankaku>4 || sankaku < 0 || maru + sankaku>4 || maru + sankaku < 0) {
printf("\nいじわるよくない");
} //ありえない時のいじわる
} while (maru > 4 || maru < 0 || sankaku>4 || sankaku < 0 || maru + sankaku>4 || maru + sankaku < 0);
seigo[kaisuB][0] = maru;
seigo[kaisuB][1] = sankaku; //comの数字の保存
kaisuB++;
}
int finish(void) {
if (n == answer && maru != 4) {
printf("くっ...負けた\n");
printf("あなたは%d回の入力で正解した。\n", kaisu);
return 1;
}
if (n == answer && maru == 4) {
printf("ひきわけじゃ。\n");
printf("あなたは%d回の入力で正解した。\n", kaisu);
return 1;
}
if (n == answer && maru == 4) {
printf("ひきわけじゃ。\n");
printf("あなたは%d回の入力で正解した。\n", kaisu);
return 1;
}
if (n != answer && maru == 4) {
printf("お前の負けえぇぇぇぇぇぇぇぇぇぇぇ\n");
printf("正解は%dじゃ。まだまだだな。\n", answer);
return 1;
}
return 0;
}