【C语言】猜数字游戏的代码实现

0.初始部分:大致流程图展示:

1.第一部分:打印游戏菜单

void menu()
{
   printf("******************************");
   printf("**********  1.play  **********");
   printf("**********  0.exit  **********");
   printf("******************************");
}

2.第二部分:游戏运行逻辑的构建

(1)生成随机值,设置其范围:

a.生成随机值

1.rand函数的介绍:

   rand函数可以随机生成一个伪随机数(这个随机数的范围是在0~RAND_MAX之间的,故称为伪随机数),使用它时需要包含头文件<stdlib.h>.

2.该函数的特点:

   rand函数是对于一个叫“种子”的基准值进行运算生成的随机值,所以要使得其生成的随机值处于不断的变化当中,就需要让rand函数的种子处于不断变化的状态.

b.设置其范围

1.取余符号%的介绍:

   取余符号会将余数控制在0~右操作数-1的这个范围内.例如:左操作数%10就会将结果的范围控制在0~9之间.

2.产生范围分析:

   此处需要选择控制正确的数值范围,建议尝试把范围控制的小一些,这里把正确数值的范围控制在1~10之间.

int w = rand() % 10 +1

   在上述说明了一个数%10会将结果范围控制在0~9之间,我们再给它右边加上个1就把结果范围控制在1~10之间,就达成了目的.

3.公式法生成随机值

   想要产生一个a~b的随机值时,可以套公式:a + rand() % (b-a+1)

(2)自定义函数,存放猜测数值:

a.自定义函数:(用于表示自我猜测的数值)

int shuzi = 0;

b.使用scanf函数存放该自我猜测数值

scanf("%d",&shuzi);

(3)猜测正确与否的判断

a.分支语句,多case判断:

   使用分支语句if来对产生的多个情况进行判断(如图)

if(shuzi < w)
{
   printf("您猜测的数字比真实数要更小\n");
}
else if(shuzi > w)
{
   printf("您猜测的数字比真实数要更大\n");
}
else
{
   printf("恭喜您,猜对了正确的数字\n");
   break;
}

b.循环结构,多次重复判断:

   由于需要经过多次的猜测判断,就需要用到循环结构将分支语句if包含于while循环当中,满足表达式的情况下可以进行重复判断(如图)

while(1)
{
   printf("请选择数字:");
   scanf("%d",&shuzi);
   if(shuzi < w)
  {
   printf("您猜测的数字比真实数要更小\n");
  }
   else if(shuzi > w)
  {
   printf("您猜测的数字比真实数要更大\n");
  }
   else
  {
   printf("恭喜您,猜对了正确的数字\n");
   break;
  }
}

3.第三部分:构建粗略的游戏框架

(1)自定义函数:(用于表示开始的数值)

int put = 0;

(2)初始化、随机化随机值

a.初始化(srand函数介绍)

1.其原型为:
void srand(unsigned int seed)
2.作用:

   可以用来初始化随机值,确保每一次生成的随机值都不一样.

3.特点:

   可以通过srand函数的参数seed来设置rand函数生成随机数的种子,只要种子在变化,每次生成的随机数也会改变.

b.随机化(time函数介绍)

1.其原型为:
time_t time(time_t* timer);

   time函数包含于头文件<time.h>中,使用时需要引用该头文件.

2.作用:

   time函数会返回当前的日历时间,其返回的是1970年1月1日0时0分0秒到现在程序运行时间的差值。

3.特点:

如果timer参数是非NULL,那么函数也会将这个返回的差值放在timer指向的内存中带回去;

如果timer参数是NULL,那么就返回这个时间的差值,timer返回的这个时间差也被叫做:时间戳;

4.使用:

   此处需要返回一个时间戳作为srand函数的种子,故需要使timer参数为NULL(如下图)

time(NULL)

(注意:由于srand函数的参数类型为“unsigned int”,而time函数的参数类型为“time_t”,使用时将time函数强制类型转换为“unsigned int”)

(3)选择、套入循环结构

   此处使用的是“do while”循环,其特点是先循环再判断后再循环.

(4)引用菜单函数,提示用户选择

a.引用菜单函数(如下图)

   menu()

b.提示用户选择(如下图)

   使用printf函数打印“请您选择”字样对用户进行提示.

   printf("请您选择:")

(5)使用scanf函数存放选择开始数值

   scanf("%d",&input);

(6)选择分支语句,处理不同的情况

a.选择分支语句

   此处选择switch语句对游戏菜单选择不同情况的结果进行处理

b.处理不同的情况

1.“case 1”:(选择开始游戏)

   将game游戏函数引用到此情况下方,当菜单选择“case 1”过后,将开始运行游戏,而在结尾处需要加入break语句终止该情况分支.(如图)

2."case 0":(选择退出游戏)

   当菜单函数处选择“case 0”过后,运用printf函数在下方打印“游戏结束”,在结尾处需要加入break语句终止该情况分支.(如图)

3.“default”:(选择错误,请重新选择)

   当菜单函数处选择除了以上两种情况以外的情况后,运用printf函数在下方打印“选择错误,请重新选择”,在结尾处任然需要使用break语句终止该情况分支.(如图)

4.第四部分:构建完整的游戏框架

(1)处理的目的:

   经过以上步骤,就已经完成了对该游戏的粗略代码实现,但却尚有美中不足之处,可以对此作出一定的修饰调整,使得游戏变得更加完美.

(2)处理后的相应效果:(如图)

a.限定游戏的次数:(如图)

b.清除游戏记录:(如图)

c.失败后的正确值提醒:(如图)

(3)实际的处理步骤

a.限定游戏次数

1.自定义计次函数,设定初始值

  自定义一个计次函数,此处用count来定义;

  将count初始值设定为想要进行的游戏次数;

2.更换“while”循环的表达式

   将“while”循环后面的表达式换成count,当循环经过count次试验后没有成功则此时count==0(为假),使得while循环运行的条件不被满足,进行下一个步骤.

3.在循环末加入计次削减语句

  在相应的“while”循环的最下方加入“ count--;”语句,用于表示游戏次数的削减.

b.清除游戏记录

   当我们进行过多次的游戏过后,会残留大量的游戏记录而使得界面变得不美观,这时就可以考虑引用system函数进行清除,它是包含于<stdlib.h>头文件的,使用时需要先引用头文件.

清除游戏记录的语句: system("cls");

c.失败后的正确值提醒

   在while循环经过count次循环尝试后依旧没有成功猜到正确的值时,使用if分支语句将该情况进行管理,即当“count==0”时,使用printf函数打印“您失败了,正确的数字是:%d\n, w (定义产生的随机值)”(如图)

(4)该部分修改后的代码展示:(如图)

5.第五部分:完整游戏代码展示

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

void menu()
{
   printf("******************************\n");
   printf("**********  1.play  **********\n");
   printf("**********  0.exit  **********\n");
   printf("******************************\n");
}

void game()
{
   int w = rand() % 10 +1;
   int shuzi = 0;
   int count = 5;

   while(count)
  {
   printf("请选择数字:");
   scanf("%d",&shuzi);

   if(shuzi < w)
   {
      printf("您猜测的数字比真实数要更小\n");
   }
   else if(shuzi > w)
   {
      printf("您猜测的数字比真实数要更大\n");
   }
   else
   {
      printf("恭喜您,猜对了正确的数字\n");
      break;
   }

   count--;

  }
   
  if(count == 0)
 {
   printf("您失败了,正确的数字是:%d\n", w );
 }

  system("cls");

}

int main()
{
   int input = 0;
   srand((unsigned int) time (NULL));

   do
 {
   menu();
   printf("请选择:");
   scanf("%d",&input);

   switch(input)
  {
   case 1:
        game();
        break;
   case 0:
        printf("游戏结束\n");
        break;
   default:
        printf("选择错误,请重新选择\n");
        break;
   }


  }while(input) ;

   return 0;
}

6.第六部分:作者声明

(1)本博客由作者整理所学知识编排实践后而成,旨在分析猜数字游戏代码实现过程中的逻辑;

(2)本博客源于学习途中关于对猜数字游戏相关的拙见,如若存在错误或是解析不当之处还请探讨与指正,经验证后再进行修改的相关工作.

最后,感谢各位的支持!希望能够和各位一起在思想的碰撞中茁壮成长!再次对您表示感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值