C语言对猜数游戏的优化(防止输入错误)

简介: C语言对猜数游戏的优化(防止输入错误)

本人纯萌新,如果有技术上的失误欢迎各位大佬来指导。

一.游戏描述

顾名思义,该程序让系统随机生成一个指定范围内的整数,让玩家来猜,玩家猜数字后,系统给予玩家回馈并且统计玩家猜的次数,直到玩家猜对为止。

但是其实,我们往往在输入的时候有输错的情形,在玩游戏时直接影响了愉悦的心情.

为此优化了一些输入

二游戏内容

1、生成游戏菜单 1. play(进入游戏) 0. exit (退出游戏)
2、使用循环语句,构建游戏框架,使玩家可以进行多次游戏,直到猜对为止。

3、让用户输入想要使用的次数,并记录,防止非法输入影响游戏体验。
4、设计游戏具体思路,使系统生成一个随机数,让玩家输入一个数字,然后两个数字对比,根据系统反馈信息,逐渐锁定目标。

代码实现:

1.生成游戏菜单

此处应该不需要过多的解释吧!

//猜数游戏
void menu()
{
  printf("****************\n");
  printf("**** 1.play ****\n");
  printf("**** 0.exit ****\n");
  printf("****************\n");
}
2.定义限定输入的数据类型函数
//限定输入的数据类型
int Judge(int n)
{
  while (scanf("%d", &n) == 0 || getchar() != '\n')
  {
    printf("输入的次数不为整数,请重新输入:");
    while (getchar() != '\n');  // 清除缓存区
  }
  return n;
}
此处解释一下

我们输入的时候有可能会输入其他的字符,但是正常使用scanf时会出现以下情形:

可以看到这里我们没有一直输入数据,但是程序一直循环,因为在第一次输入数据时,我不小心输入了一个字符'a',但是scanf是读取要求的类型与输入的类型不符合,然而又被留在scanf的缓存区中了,故一直循环读取scanf缓存区的内容,形成了死循环!

为了解决这个问题,我写了一个函数去防止读取错误,具体可看拙作

C语言中限定输入scanf的为整型(整数),浮点型-CSDN博客

3.构建游戏内容的函数
void game()
{
  srand((unsigned int)time(NULL));
  //如果 timer 是NULL,就只返回这个时间的差值。
  //srand 用来初始化随机数的生成器的
  int ret = rand() % 100 + 1;//1.生成随机数(1-100)
  int count = 0;//想要猜的次数
  int trueCount = 0;//实际猜的次数
  int guess = 0;//2.要猜的数字
  printf("请输入你想要猜的次数"); count = Judge(count);
  while (count)
  {
    printf("猜猜数字"); guess = Judge(guess);
    if (guess < ret)
    {
      printf("猜小了\n");
    }
    else if (guess > ret) {
      printf("猜大了\n");
    }
    else {
      printf("猜对了,恭喜你\n");
      printf("你猜的次数是%d次\n", trueCount);
      break;
    }
    count--;
    trueCount++;
  }
  if (count == 0)
  {
    printf("次数用尽,正确答案是%d\n", ret);
  }
}
此处解释一下

我个人认为游戏性是很重要的!!!为此我限定了用户希望猜的次数,并且能让用户在体验后知道自己使用的次数,为此我加上了count和trueCount这两个变量.此处的输入已经用Judge函数代替了!!!

4.实现效果如下

可以明显的看出不会因为输入错误而报错了!!!

如果使用二分法进行猜100以内的任何一个随机数,最多七次就可以正确猜对该随机数。

所以我建议使用二分法去猜数!

代码附上

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
//猜数游戏
void menu()
{
  printf("****************\n");
  printf("**** 1.play ****\n");
  printf("**** 0.exit ****\n");
  printf("****************\n");
}
//限定输入的数据类型
int Judge(int n)
{
  while (scanf("%d", &n) == 0 || getchar() != '\n')
  {
    printf("输入的次数不为整数,请重新输入:");
    while (getchar() != '\n');  // 清除缓存区
  }
  return n;
}
void game()
{
  srand((unsigned int)time(NULL));
  //如果 timer 是NULL,就只返回这个时间的差值。
  //srand 用来初始化随机数的生成器的
  int ret = rand() % 100 + 1;//1.生成随机数(1-100)
  int count = 0;//想要猜的次数
  int trueCount = 0;//实际猜的次数
  int guess = 0;//2.要猜的数字
  printf("请输入你想要猜的次数"); count = Judge(count);
  while (count)
  {
    printf("猜猜数字"); guess = Judge(guess);
    if (guess < ret)
    {
      printf("猜小了\n");
    }
    else if (guess > ret) {
      printf("猜大了\n");
    }
    else {
      printf("猜对了,恭喜你\n");
      printf("你猜的次数是%d次\n", trueCount);
      break;
    }
    count--;
    trueCount++;
  }
  if (count == 0)
  {
    printf("次数用尽,正确答案是%d\n", ret);
  }
}
int main()
{
  int input = 0;
  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;
}
相关文章
|
2月前
|
算法 C语言 C++
【C语言实战项目】三子棋游戏
【C语言实战项目】三子棋游戏
32 1
|
2月前
|
程序员 C语言
【C语言实战项目】猜数字游戏
【C语言实战项目】猜数字游戏
28 0
【C语言实战项目】猜数字游戏
|
2月前
|
C语言
关于使用C语言编写一个简单的猜数字游戏
关于使用C语言编写一个简单的猜数字游戏
23 0
|
2月前
|
存储 缓存 安全
C语言中的内存管理与优化技巧
C语言中的内存管理与优化技巧
38 0
|
2月前
|
算法 C语言
【C语言】三子棋游戏实现代码
【C语言】三子棋游戏实现代码
【C语言】三子棋游戏实现代码
|
2月前
|
C语言
C语言-------扫雷游戏的代码实现
C语言-------扫雷游戏的代码实现
27 0
|
2月前
|
算法 C语言 C++
【C语言-扫雷游戏全功能详解】
【C语言-扫雷游戏全功能详解】
39 1
|
4月前
|
缓存 算法 Java
C语言中的内存优化及碎片优化
C语言中的内存优化及碎片优化
|
4月前
|
C语言
C语言之详解数组【附三子棋和扫雷游戏实战】(二)
C语言之详解数组【附三子棋和扫雷游戏实战】(二)
|
1天前
|
并行计算 算法 测试技术
【C 言专栏】优化 C 语言程序性能的策略
【5月更文挑战第2天】本文探讨了优化C语言程序性能的策略,包括算法优化(选择合适的时间和空间复杂度)、代码结构优化(减少函数调用,合理使用循环)、内存管理优化(合理分配和及时释放内存)、编译器优化(选择优化级别,内联函数,循环展开)、数据结构优化(根据需求选择数组、哈希表或堆)、并行计算优化(多线程、多进程和MPI编程)以及性能测试与分析(使用性能分析工具、基准测试和分析执行路径)。通过这些方法,可以提升C语言程序的效率和运行速度。