C语言猜数游戏

题目要求:计算机想一个数,由用户猜,若猜对则输出right,若猜错则输出wrong,并告诉用户所猜的数是大是小,每次程序可以准许用户猜多个数,

每次准许用户猜十次,并且记录猜的次数,并且要具有容错能力,即输入的并非为正数时,可接着输,猜对或者未猜对一个数时,给出提示信息(yes/no),询问用户是否要猜下一个数。

将任务分为多个子任务;

任务一:

//分解为 计算机生成一个数、用户猜数两个 任务

#include

#include

#include

#define MAX_NUMBER 100

#define MIN_NUMBER 1

#define MAX_TIMES 10 //都是宏常量

int MakeNumber(viod);

void GuessNumber(int number);

int IsRight(int number,const int guess);

int IsValidNum(int number);

int main()

{

int number;

char reply; //用户对于是否继续猜数的回答 yes or no!

srand(time(NULL)); //初始化随机种子,是为了保证计算机每次随机生成的数是不一样的,只要随机种子不同,数就不同

do

{

number = MakeNumber(); //用函数的方法,计算机随机生成一个数

GuessNumber(number); //用户猜数字

printf("Do you want to continue(Y/N or y/n)?"); //提示是否

scanf(" %c",&reply); //空格,拿走缓冲区域的换行符号即回车;若不空格,当输入 //输入是否继续的回答

}while(reply=='y'||reply=='Y'); //输入y/Y才会循环

return 0;

}

/任务2:定义所需要的函数 --- MakeNumber和GuessNumber

//#include "MakeNumber.h" ---- 后文当中有很多include " " 的语句,其为命名的作用,在程序中无功能的实现

#include //assert 为断言语句是为了测试算法的正确性,调试某个阶段程序表达式的真与假,断言仅用于调试程序,不能作为程序的功能;

int MakeNumber(viod)

//函数参数:无

//函数返回值:返回计算机生成的随机数

{

int number;

number=(rand() % (MAX_NUMBER - MIN_NUMBER + 1)) + MIN_NUMBER; //函数:随机生成一个数 eg:rand() % 100+1;表示1到100之间的随机数

assert(number >= MIN_NUMBER && number <= MAX_NUMBER); //调试生成的随机数是否位于1-100之间;

return number;

}

//随即生成数已经完成,接下来是猜数;

猜数又要细分为小任务,主的:记录猜的次数、重复输入猜的数;

副的:分解为“判断用户的猜的数是否合法”和“判断用户猜的数是大是小及判断并输出是否猜中(用返回值 --- 0、1)”两个任务

//GuessNumber.c

//#include "IsRight.h" //判断猜的数是否正确

//#include "IsValidNum.h" //判断猜的数是否合法

void GuessNumber(int number)

//函数参数:计算机随机生成的数字;

//函数返回值:无

{

int guess; //用户猜的数

int count=0; //猜的次数

int right = 0; //猜的数是否猜中

int ret; //用于保存scanf()的返回值

do

{

printf("try %d:",count+1);

ret = scanf("%d",&guess);

//处理读入的数,判断输入是否有误,是否在合理范围内

while(ret != 1 || !IsValidNum(guess)) //调用后的函数了,猜的数不是合法的 //ret != 1 --- 存在输入错误 //返回值不是1

{

printf("Input error! \n");

while(getchar() != ' \n '); //清除输入缓冲区中的错误数据,SANF读取缓冲区的数,非数字字符不会被读取,若不清除,则会一直读取失败

printf("try %d: ",count+1);

ret = scanf("%d",&guess);

}

count++; //开始为0,后+1;每次循环都+1;但是在非法输入的那个循环里,未+1,保持不变;+1不是++;++每次都要调用的

right = IsRight(number,guess); //判断用户猜的数是大是小,有输出,(too small/too big);判断是否正确,就是用1、0的返回值判断,表示的是”是或非

}while(!right&&count<MAX_NUMBER); //返回值不是1

if(right) //如果猜对了,给出相应的提示信息 //返回值为1

printf("congratulations! \n");

else

printf("failed after %d times \n",MAX_TIMES);

}

//最后,对两个合法和是否正确的函数定义

//void GuessNumber(const int number) const的作用是变量不变,guess是实参

//合法

//#include ”IsValidNum,h"

//函数返回值:若合法,返回1;若不合法,返回0

//函数功能:判断是否在1-100内

//函数参数:number为用户输入的数,用时变为guess就好了

int IsValidNum(int number)

{

if(number>=MIN_NUMBER && number <= MAX_NUMBER)

return 1;

else

return 0;

}

//#include "IsRight.h"

//函数功能:判断谁大谁小,分别给出提示信息

//函数返回值:猜对,1;猜错,0

int IsRight(int number,const int guess)

{

if(guess<number)

{

printf("Wrong!Too smal! \n");

return 0;

}

else if(guess>number)

{

printf("Wrong!Too big! \n");

return 0;

}

else return 1;

}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值