C++入门之 0001 猜数字
一、引言
猜数字(Bull and Cows)是一种大概于20世纪中期兴起于英国的益智类小游戏。一般由两个人玩,也可以由一个人和计算机玩,在纸上、网上都可以玩。该游戏规则简单,但可以考验人的严谨和耐心。
游戏规则:
参与游戏的两方,一方出数字,另一方猜数字。出数字的人要想好一个没有重复数字的4位数,不能让猜的人知道。猜的人就可以开始猜,每猜一个数字,出数者就要根据这个数字给出几A几B,其中A前面的数字表示位置正确的个数,而B前面的数字表示数字正确而位置不对的数的个数。
例如,正确答案为5346,猜数字的人猜的数字为5238,则提示1A1B,其中有一个5位置对了,记为1A,而3数字对了,而位置不对,因此即为1B,合起来就是1A1B。
接着,猜数字的人根据出题者的几A几B继续猜,直到猜中(即4A0B)为止。
二、系统设计
本系统属于典型的小游戏,是针对单机版开发的益智类小游戏。
① 灵活的操作,可以自动判断胜负;
②系统采用良好的人机对话模式,界面设计美观良好;
③系统运行稳定、安全可靠。
2.1 具体要求
2.2 设计思路
三、具体实现
3.1 文件引用
3.2 主要功能实现
3.2.1 主函数
3.2.2 猜数字函数执行过程
自定义guess函数,作用是产生随机数并将输入的数与产生的数作比较,并将比较后的提示信息输出。
3.3 代码实现
//头文件的引用
#include"stdafx.h"
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<windows.h>
void guess(int n); //自定义函数声明
/*使用Windows API函数封装
void gotoxy(int &&x, int &&y)
{
COORD coord={x,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}*/ //此处定义的gotoxy函数,出现错误提示信息,所以另外编写gotoxy,原理一样
void gotoxy(int x, int y) {
COORD pos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
/*main函数作为程序的入口函数,通过输入相应的数字选择不同的功能*/
void main()
{
int i,n; /*定义整型变量*/
while(1) /*循环条件*/
{
system("cls"); /*清屏*/
gotoxy(15,6); /*将光标定位*/
printf("1.start game"); /*1 开始游戏*/
gotoxy(15,8); /*光标定位*/
printf("2.Rule"); /*2 显示规则*/
gotoxy(15,10); /*光标定位*/
printf("3.exit\n"); /*3 退出*/
gotoxy(25,15);
printf("please choose: "); /*提示用户选择*/
scanf("%d",&i); /*接收用户输入信息*/
switch(i) /*根据不同的输入执行不同的操作*/
{
case 1: /*如果用户选择1,则开始游戏*/
system("cls");
printf("please input n:\n"); /*输入使用的数字个数*/
scanf("%d",&n); /*接收用户输入*/
guess(n); /*调用guess函数*/
Sleep(5); /*程序停止5秒钟*/
break; /*跳出循环*/
case 2: /*输出游戏规则*/
system("cls");
printf("\t\tThe Rules Of The Game \n");
printf("step1: input the number of digits\n");
printf("step2: input the number,separated by a space between two numbers\n");
printf("step3: A represent location and data are correce\n");
printf("\tB represent location is correct but data is wrong!\n");
Sleep(800);
break;
case 3:
exit(0); /*退出游戏*/
default: /*默认*/
break; /*跳出*/
}
}
}
/*自定义函数guess*/
void guess(int n)
{
int acount,bcount,i,j,k=0,flag,a[10],b[10];
do
{
flag=0;
srand((unsigned)time(NULL)); /*利用系统时钟设定种子*/
for(i=0;i<n;i++)
a[i]=rand()%10; /*每次产生0~9范围内任意的一个随机数并存到数组a中*/
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
if(a[i]==a[j]) /*判断数组a中是否有相同数字*/
{
flag=1; /*若有上述情况则标志位置1*/
break;
}
}
}while(flag==1); /*若标志位为1,则重新分配数据*/
do
{
k++; /*记录猜数字的次数*/
acount=0; /*每次猜的过程中位置与数字均正确的个数*/
bcount=0; /*每次猜的过程中位置不正确但数字正确的个数*/
printf("guess:");
for(i=0;i<n;i++)
scanf("%d",&b[i]); /*输入猜测的数据到数组b中*/
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(a[i]==b[i]) /*数据相同且位置相同的个数*/
{
acount++;
break;
}
if(a[i]==b[j]&&i!=j) /*数据相同但位置不同*/
{
bcount++;
break;
}
}
printf("clue on:%dA %dB\n\n",acount,bcount);
if(acount==n) /*判断acount是否与数字的个数相同*/
{
if(k==1) /*如果用户一次就输入正确*/
printf("you are the topmost rung of Fortune's ladder!!\n\n");
else if(k<=5) /*如果用户5次以内猜正确*/
printf("you are genius!!\n\n");
else if(k<=10) /*如果用户10次以内猜正确*/
printf("you are cleaver!!\n\n");
else
printf("you need try hard!!\n\n");
getchar();
printf("按任意键继续");
getchar();
break;
}
}while(1);
}