#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
#define NUM_LEN
4
#define ESC
27
#define BACK
8
typedef struct
{
int A ;
int B ;
} NumRightAB;
enum level{easy = 30, normal = 20, hard = 10, esc = 0} gameLevel;
int init(void) ;
level startChoose(void) ;
void initNum(int num[]) ;
void inputNum(int num[]) ;
void checkNum(int inNum[], int num[], NumRightAB *reslut) ;
void outReslut(NumRightAB reslut) ;
void outWin(int gameCount) ;
void outLose(int num[]) ;
int main(void)
{
int num[4] = {0} ;
int inNum[4] = {0} ;
NumRightAB reslut = {0, 0};
int gameCount ;
init() ;
initNum(num) ;
if(!(gameLevel = startChoose()))
{
printf("游戏结束!") ;
return 1 ;
}
else
{
system("cls") ;
printf("\t猜数字游戏\n") ;
printf("数字长度:%d/t最多机会:%d\n", NUM_LEN, gameLevel) ;
gameCount = gameLevel ;
}
do
{
inputNum(inNum) ;
checkNum(inNum, num, &reslut) ;
outReslut(reslut) ;
gameCount-- ;
}while(reslut.A != NUM_LEN && gameCount) ;
if(gameCount)
{
outWin(gameCount) ;
}
else
{
outLose(num) ;
}
return 0 ;
}
//init()函数
//说明:对整个游戏进行图像和随机开始点等设置进行初始化
int init(void)
{
srand(time(NULL)) ;
system("cls") ;
return 1 ;
}
//startChoose()函数
//说明:选择游戏难度 1,2,3选择难度 4和ESC退出整个游戏
level startChoose(void)
{
while(1)
{
system("cls") ;
printf("\t猜数字游戏\n") ;
printf("请选择游戏难度\n1。简单\n2。正常\n3。困难\n") ;
switch(getch())
{
case
'1':
return easy ;
case
'2':
return normal ;
case
'3':
return hard ;
case
'4':
case
ESC:
return esc ;
default:printf("输入有误!请按照正确要求输入!") ;
}
}
}
//initNum()函数
//说明:对游戏目标数组num进行初始化
void initNum(int num[])
{
int i ;
int tNum[10] = {0} ;
for(i = 0;i < NUM_LEN;i++)
{
if(!tNum[i])
{
num[i] = rand()%10 ;
tNum[num[i]] = 1 ;
}
}
}
//inputNum()函数
//说明:等待用户输入猜测数组
void inputNum(int inNum[])
{
int i ;
char tchar = 0, ch = 0 ;
char numChar[NUM_LEN] = "" ;
for(i = 0;i < NUM_LEN;)
{
ch = getch() ;
//确定输入的数字为0~9
//0~9的ASCII码为 48~57 (ASC(0~9)+2)/ 10的值为 5
tchar = (ch+2)/10 ;
if(tchar == 5)
{
putchar(ch) ;
inNum[i] = ch-'0' ;
numChar[i] = ch ;
i++ ;
}
switch(ch)
{
case
BACK:
i-- ;
numChar[i] = 0 ;
printf("\r%s", numChar) ;
break ;
default:break ;
}
}
}
//checkNum()函数
//说明:对输入的数组和目标数组进行对比 返回对比结果
void checkNum(int inNum[], int num[], NumRightAB *reslut)
{
int i, j ;
reslut->A = 0 ;
reslut->B = 0 ;
for(i = 0;i < NUM_LEN;i++)
{
for(j = 0;j < NUM_LEN;j++)
{
if(inNum[i] == num[j])
{
reslut->B ++ ;
break ;
}
}
if(inNum[i] == num[i])
{
reslut->A ++ ;
}
}
}
//outReslut()函数
//说明:输出对比结果
void outReslut(NumRightAB reslut)
{
printf("\n%dA%dB\n", reslut.A, reslut.B) ;
}
//outWin()函数
//说明:胜利事件
void outWin(int gameCount)
{
printf("恭喜你猜对这%d个数\n", NUM_LEN) ;
printf("你用了%d步机会!\n", gameCount) ;
}
//outLose()函数
//说明:失败事件
void outLose(int num[])
{
int i ;
printf("你输掉了这次机会!") ;
for(i = 0;i < NUM_LEN;i++)
printf("答案:%d\n", num[i]) ;
}