【游戏描述】:
随机产生一个由0~9构成的各位不重复的n位数,由你来猜测,每一次猜测的结果以类似2A1B的形式反馈,表示你的猜测中有2个数字是完全正确的,有1个只是数值正确,但是没有出现在正确的位置上,来试试吧。
【输入】
根据程序提示。
【输出】
根据题意描述。
【输入的鲁棒性】
即支持包含空格在内的有且仅有n个数字的长度不超过100的字符串,如果数字不够或者出现非数字也非空格的字符,根据程序提示重新输入。
【随机两两不重复的n位数的构造】
使用rand(),用一个数组num[10]存放0~9,每次随机产生[ i , 9 ]的下标x,再把num[x]和num[i]交换,i从0开始自增,到i=n-1时停止。
【代码】
/*猜数字小游戏*/
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include<time.h>
#define random(x,y) (x+rand()%(y-x+1))//构造属于区间[x,y]的随机数
using namespace std;
int num[10]={0,1,2,3,4,5,6,7,8,9};
int guess[20]; //记录输入的数字
char s[100]; //输入行
int both_right = 0,half_right = 0;
int over=0; //游戏是否结束
int input_num ; //记录输入的数字个数
int step=0; //记录猜测的次数
int level; //猜测的位数
/**
* temp为从 i 到 9 选取的随机数
* 交换下标为 i 和 temp 的数
* 则第 i 个数确定
*/
void create()
{
srand((int)time(0));
int temp;
for(int i = 0;i < level;i++)
{
temp=random(i,9);
swap(num[temp],num[i]);
}
// for(int i = 0;i < level;i++)
// printf("%d ",num[i]);
printf("告诉我你猜的数字吧!\n");
}
/**
*一行输入,空格随意,但是能且仅能输入level个数字,否则需要重新输入
*/
void sf()
{
gets(s);
input_num=0;
for(int i = 0;i < strlen(s);i++)
{
if(s[i] == ' ')
continue;
else if('0' <= s[i] && s[i] <= '9')
{
guess[input_num] = s[i]-48;
input_num++;
}
else
{
printf("叫你好好输入数字,重新来!\n");
input_num = 0;
sf();
break;
}
}
if(input_num != level)
{
printf("只能输入%d个数字,重新来!\n",level);
input_num = 0;
sf();
}
}
/**
*both_right的数值表示有多少个数字是完全正确的,half_right的数值表示有多少个数字是仅仅数值正确但是不在正确位置上
*/
void solve()
{
sf();
both_right = half_right = 0;
for(int i = 0;i < level;i++)
{
for(int j = 0;j < level;j++)
{
if(num[i]==guess[j])
{
if(i==j)
both_right++;
else
half_right++;
}
}
}
if(both_right == level)
{
over=1;
printf("STEP %d : You Win !\n",++step);
}
else
printf("STEP %d : Ooops,please try again... %d A %d B \n",++step,both_right,half_right);
}
int main()
{
printf("选择猜测的位数吧!\n");
scanf("%d",&level);
getchar();
create();
while(over == 0)
solve();
return 0;
}