#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int getRand(); // 获取随机数
void putRule(); // 输出游戏规则
void getUserInput(); // 获取用户输入
void getUserAgainInput(); // 再次获取用户输入
void initSystemNum(); // 初始化系统随机数
void detection(); // 判定胜利条件
void initGame(); // 初始化游戏
int detectionWin(); // 判断是否胜利
void gameStart(); // 游戏开始
void putResult(); // 输出结果
void putSystemNum(); // 测试类 输出随机结果
int systemNum[4]; //存入系统的随机数
int userNum[4]; //存入用户输入的数
char result[5]; // 存入提示字符
int totalTimes = 4; // 猜测次数
int main()
{
gameStart(); //游戏开始
printf("按enter键退出游戏\n");
getchar();
system("pause");
}
void gameStart() //开始游戏
{
initGame(); // 输出游戏规则 获取系统随机值 获取游戏玩家输入值 //初始化游戏
detection(); // 判断输入的值;
int flag = 1;
while (flag) //如果胜利则跳出
{
if (detectionWin())
{
putResult(); //成功后输出结果
printf("你太棒了。恭喜你全部猜测正确");
break;
}
if (--totalTimes <= 0)
{
printf("很遗憾,次数用完。正确的数字是: \n");
putSystemNum();
break;
}
putResult(); // 失败以后 输出结果
getUserAgainInput(); // 再次获取输入
detection(); // 再次判断
}
}
void initGame() //初始化游戏
{
putRule(); //输出游戏规则
initSystemNum();// 成功找出四个数,初始化系统随机数
//putSystemNum();
getUserInput(); //获取用户输入的值,并入到一个数组
}// 初始化游戏 初始化游戏
int getRand()// 生成一个随机数
{
int x;
srand(time(NULL));
x = rand() % 10;
return x;
}
void initSystemNum() //初始化系统随机数
{
int randNum; //保存随机数;
int flag = 1;
systemNum[0] = getRand();// 获取第一个数;
for (int i = 0; i < 3; i++)// S[0]已知则需要三个随机数;
{
flag = 1;
while (flag) {
randNum = getRand();
for (int g = 0;g <= i; g++)
{
if (systemNum[g] == randNum) break; // 如果有一样的就重新随机并对比;
if (g == i) { flag = 0; break; } // 比较完成后跳出;
}
}
systemNum[i + 1] = randNum; // 找到以后就赋值给systemNum;
}
}
void getUserInput() //获取用户输入的值,并把得到值放到一个一维数组
{
int num = 0;
printf("游戏开始,请输入4个数,并且挑战次数只有%d次:", totalTimes);
scanf_s("%d", &num);
if (num > 9999)
{
printf("输入的数字多于四位数,请重新输入");
getUserInput();
}
else
{
userNum[3] = num % 10;
userNum[2] = (num / 10) % 10;
userNum[1] = (num / 100) % 10;
userNum[0] = (num / 1000);
}// 输入四个数;
// 获取用户键入值
}
void getUserAgainInput()//失败后,再次获取输入的值,同样放到一个数组中
{
int num = 0;
printf("未能通过!请再次输入四个数:");
scanf_s("%d", &num);
if (num > 9999)
{
printf("输入的数字多于四位数,请重新输入");
getUserInput();
}
else
{
userNum[3] = num % 10;
userNum[2] = (num / 10) % 10;
userNum[1] = (num / 100) % 10;
userNum[0] = (num / 1000);
}// 输入四个数;
// 获取用户键入值
}
void putRule()//输出游戏规则
{
printf("============================================================\n");
printf(" 欢迎来到猜数字游戏 \n");
printf("============================================================\n");
printf("游戏规则:\n系统给出随机的四个数字,");
printf("用户通过输入四个数字去猜系统的四个数\n\n");
printf("判定结果:\n如果结果正确且位置正确则输出A\n如果结果正确但位置不正确系统给出B提示\n如果位置和数字不正确则输出C\n\n");
printf("例:系统给出 1 2 3 4 用户给出4 2 3 1 , 则系统将提示 B A A B \n");
printf("============================================================\n\n");
}
void detection() { //判断用户输入的数字与系统数字是否相同,并填入相同符号,便于输出提示
for (int x = 0; x < 4; x++) {
for (int y = 0; y < 4; y++)
{
if (userNum[x] == systemNum[y])
{
if (x == y)
{
result[x] = 'A';
break;
}// 位置和大小都一样
else
{
result[x] = 'B';
break;
}// 大小一样 位置不同
}// 如果有相同 判断位置关系
else
{
if (y == 3) result[x] = 'C'; // 如果查询完成后没有匹配
continue;
}
// 位置和大小都不同填入C
}
}
}
int detectionWin() //判断结果是否匹配,匹配返回1,不匹配返回0
{
for (int x = 0; x < 4; x++)
{
if (result[x] == 'B' || result[x] == 'C') break; //判断是否完全匹配,如果完全匹配,则返回1,不安全匹配则返回0
if (x == 3) return 1;// 全部判断完成 且没有return
}
return 0;
}
void putResult()//输出提示
{
for (int a = 0; a < 4; a++)
{
printf("%c", result[a]);
}// 输出结果
printf("\n");
}
void putSystemNum() //输出系统给出的随机数
{
for (int a = 0; a < 4; a++)
{
printf("%d ", systemNum[a]);
}
printf("\n");
}