C语言程序设计-----猜数字游戏(1A2B详解)

简介: C语言程序设计-----猜数字游戏(1A2B详解)

一、游戏介绍



游戏内容


该游戏可以由程序随机产生或由用户输入四个0到9之间的数字,且不重复。玩游戏者通过游戏提示输入八次来匹配上面所输入的数字。A表示位置正确且数字正确,B表示数字正确而位置不正确。例如玩家输入四位数5678,计算机会按照正确答案5720给出1A1B的提示内容,玩家根据此提示继续猜测数字。


游戏玩法


1、游戏软件随机产生4个数字,但不显示,给用户提供输入提示符,让用户猜4个数字的值和位置顺序。如果数字值和位置顺序均正确,则猜数字成功。

2、玩家有8次猜数字的机会,如果在8次之内仍末猜出正确的数字值和数字位置顺序,则提示用户游戏失败。

3、 一旦玩家在8次的次数限制内猜出正确的数字值和位置顺序,则赢得游戏。


二、游戏实现思路



1、首先设计一个menu函数,生成游戏菜单 ——>1.开始游戏 2.帮助 3.退出

2、设计一个help函数,说明游戏规则。

3、设计一个same函数,判断产生的随机数各个位置上有没有重复的函数。

4、设计一个game函数,比较用户输入数据和随机数,并产生提示信息。

5、利用生成随机数的函数产生随机数。


三、游戏实现过程



1、游戏菜单menu函数


void menu()//函数声明
{
  printf("\t\t\t\t猜数字游戏\n\n\n\n");
  printf("\t\t\t\t1.开始游戏\n\n");
  printf("\t\t\t\t2.帮助\n\n");
  printf("\t\t\t\t3.退出\n\n");
  printf("\t\t\t请输入(1-3):");
}


效果展示:

4d71221e4d3746aa9738b71ecd5c776b.png


2、help函数


void help()//游戏规则说明函数
{
printf("\t\t\t欢迎使用本程序\n\n\n");
printf("游戏说明:输入四位数字,输入后有提示XAYB,X表示有几个数字与答案数字相同且位置相同。\n");
printf("Y表示有几位数字与答案数字相同且位置不正确。\n");
printf("按任意键继续............\n");
}


3、same函数


这里的u是全局变量

int same(int num[])//判断产生的随机数各个位置上有没有重复的函数
{
  int i, j;
  u = 0;
  for (i = 0; i < 3; i++)
    for (j = i + 1; j < 4; j++)
      if (num[i] == num[j])
        u = 1;
  return u;
}



4、game函数


此函数没有返回值,它是分配空间将随机生产的数存储到这个函数的int a[]参数中并且在这个函数里定义一串其他的参数,来实现玩家对数据的输入和提示信息的输出,与此同时再实现对游戏成功与否的判断,若游戏成功在主屏幕上打印“恭喜,游戏成功!”,若是游戏失败就打印“游戏失败!”。


void game(int a[])//比较用户输入数据和随机数,并产生提示信息
{
  int b[4] = {0};
  int i = 0, j = 0;
  while (1)
  {
    //生成4个随机数
    do
    {
      for (i = 0; i < 4; i++)
        a[i] = rand() % 10;
      same(a);
    } while (u);
    if (a[0] != 0)
      break;
  }
  int k = 1, A = 0, B = 0, N = 8 ,pick = 0;
  printf("请输入要猜想的四位数\n");
  while (A != 4 && k <= N)
  {
    A = 0, B = 0;
    printf("第%d次:", k);
    scanf("%d", &pick);//玩家从键盘输入数据
    while (pick < 999 || pick>10000)
    {
      printf("输入不合法!\n");
      scanf("%d", &pick);
    }
    for (i = 3; i >= 0; i--)
    {
      b[i] = pick % 10;
      pick = pick/ 10;
    }
    //比较对应位置上的数
    for (i = 0; i < 4; i++)
      for (j = 0; j < 4; j++)
        if (a[i] == b[j])
          if (i == j)
            A++;
          else
            B++;
    printf("%dA%dB\n", A, B);
    if (A == 4)
    {
      printf("恭喜,游戏成功!\n");
    }
    k++;
  }
  if (A != 4 && k > 8)
  {
    printf("游戏失败!\n");
    printf("正确答案是:");
    for (i = 0; i < 4; i++)
      printf("%d", a[i]);
    printf("\n");
  }
  printf("输入 1 继续游戏,输入 2 返回菜单,输入 0 退出游戏:");
  while (1)
  {
    scanf("%d", &pick);
    if (pick == 2)
    {
      system("cls"); menu();
      int select=0;
      while (select != 3)
      {
        switch (select)
        {
        case 1: {system("cls"); game(a); break; }
        case 2: {system("cls"); help(); _getch(); system("cls"); menu(); break; }
        default:printf("输入不合法,请重新输入!"); break;
        }
        scanf("%d", &select);
      }
      exit(0);
    }
    else if (pick == 1)
    {
      system("cls");
      game(a);
    }
    else if (pick == 0)
      exit(0);
    else
      printf("输入错误,请重新输入!\n");
  }
}


5、构建主函数


利用while()循环,确保玩家输入1—3的数字选择菜单选项。利用swich语句选择开始游戏还是获得游戏介绍或是选择退出游戏。


//主函数
int main()
{
  void help();//函数声明
  void game(int a[]);//函数声明
  int  k = 0, select=0;
  int a[4] = { 0 };
  srand((unsigned)time(NULL));//随机数种,只调用一次即可
  menu();
  scanf("%d", &select);
  while (select!= 3)
  {
    switch (select)
    {
    case 1: {system("cls"); game(a); break; }
    case 2: {system("cls"); help(); _getch(); system("cls"); menu(); break; }
    default:printf("输入不合法,请重新输入!"); break;
    }
    scanf("%d", &select);
  }
  return 0;
}


四、主函数内的其他函数的调用



1、产生随机数函数


scrand函数是随机数发生器的初始化函数。原型:void srand(unsigned seed);

随机的起点:srand((unsigned) int time(NULL)

上述代码用到了两个库函数void srand(unsigned int seed)和 longlong time(NULL),分别对应的头文件是<stdio.h>和<time.h>


用法:它初始化随机种子,会提供一个种子,这个种子会对应一个随机数,如果使用相同的种子后面的rand()函数会出现一样的随机数,如: srand(1); 直接使用1来初始化种子。不过为了防止随机数每次重复,常常使用系统时间来初始化,即使用 time函数来获得系统时间,它的返回值为00:00:00 GMT, January 1, 1970 到现在所持续的秒数,然后将time_t型数据转化为(unsigned)型再传给srand函数,即: srand((unsigned) time(&t)); 还有一个经常用法,不需要定义time_t型t变量,即:srand((unsigned) time(NULL)); 直接传入一个空指针,因为你的程序中往往并不需要经过参数获得的数据。


srand((unsigned)time(NULL));//随机数种,只调用一次即可

image.png


生成四个随机数储存到数组a中。


2、清屏函数


头文件:stdlib.h

函数:system(“cls”);


3、 _getch()函数


所在头文件:conio.h

函数用途:从控制台读取一个字符,但不显示在屏幕上

函数原型:int getch(void)

返回值:读取的字符

用_getch();会等待你按下任意键,再继续执行下面的语句


五、终极代码+游戏效果展示



#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
int u; //全局变量
int same(int num[]);//函数声明
void menu()//函数声明
{
  printf("\t\t\t\t猜数字游戏\n\n\n\n");
  printf("\t\t\t\t1.开始游戏\n\n");
  printf("\t\t\t\t2.帮助\n\n");
  printf("\t\t\t\t3.退出\n\n");
  printf("\t\t\t请输入(1-3):");
}
//主函数
int main()
{
  void help();//函数声明
  void game(int a[]);//函数声明
  int  k = 0, select=0;
  int a[4] = { 0 };
  srand((unsigned)time(NULL));//随机数种,只调用一次即可
  menu();
  scanf("%d", &select);
  while (select!= 3)
  {
    switch (select)
    {
    case 1: {system("cls"); game(a); break; }
    case 2: {system("cls"); help(); _getch(); system("cls"); menu(); break; }
    default:printf("输入不合法,请重新输入!"); break;
    }
    scanf("%d", &select);
  }
  return 0;
}
void help()//游戏规则说明函数
{
  printf("\t\t\t欢迎使用本程序\n\n\n");
  printf("游戏说明:输入四位数字,输入后有提示XAYB,X表示有几个数字与答案数字相同且位置相同。\n");
  printf("Y表示有几位数字与答案数字相同且位置不正确。\n");
  printf("按任意键继续............\n");
}
void game(int a[])//比较用户输入数据和随机数,并产生提示信息
{
  int b[4] = {0};
  int i = 0, j = 0;
  while (1)
  {
    //生成4个随机数
    do
    {
      for (i = 0; i < 4; i++)
        a[i] = rand() % 10;
      same(a);
    } while (u);//此处用到全局变量u
    if (a[0] != 0)
      break;
  }
  int k = 1, A = 0, B = 0, N = 8 ,pick = 0;
  printf("请输入要猜想的四位数\n");
  while (A != 4 && k <= N)
  {
    A = 0, B = 0;
    printf("第%d次:", k);
    scanf("%d", &pick);//玩家从键盘输入数据
    while (pick < 999 || pick>10000)
    {
      printf("输入不合法!\n");
      scanf("%d", &pick);
    }
    for (i = 3; i >= 0; i--)
    {
      b[i] = pick % 10;
      pick = pick/ 10;
    }
    //比较对应位置上的数
    for (i = 0; i < 4; i++)
      for (j = 0; j < 4; j++)
        if (a[i] == b[j])
          if (i == j)
            A++;
          else
            B++;
    printf("%dA%dB\n", A, B);
    if (A == 4)
    {
      printf("恭喜,游戏成功!\n");
    }
    k++;
  }
  if (A != 4 && k > 8)
  {
    printf("游戏失败!\n");
    printf("正确答案是:");
    for (i = 0; i < 4; i++)
      printf("%d", a[i]);
    printf("\n");
  }
  printf("输入 1 继续游戏,输入 2 返回菜单,输入 0 退出游戏:");
  while (1)
  {
    scanf("%d", &pick);
    if (pick == 2)
    {
      system("cls"); menu();
      int select=0;
      while (select != 3)
      {
        switch (select)
        {
        case 1: {system("cls"); game(a); break; }
        case 2: {system("cls"); help(); _getch(); system("cls"); menu(); break; }
        default:printf("输入不合法,请重新输入!"); break;
        }
        scanf("%d", &select);
      }
      exit(0);
    }
    else if (pick == 1)
    {
      system("cls");
      game(a);
    }
    else if (pick == 0)
      exit(0);
    else
      printf("输入错误,请重新输入!\n");
  }
}
int same(int num[])//判断产生的随机数各个位置上有没有重复的函数
{
  u = 0;//注意u是全局变量
  for (int i = 0; i < 3; i++)
    for (int j = i + 1; j < 4; j++)
      if (num[i] == num[j])
        u = 1;
  return u;
}


效果展示:

4532046477ba4b7fbaa9e006a1bbb4ec.png


Last



🔥 这是博主大一时期的课程设计,目前刚结束大一,实力有限,内容仅供参考,如果有不足之处,请多多指教。🤞

image.png

目录
相关文章
|
10天前
|
C语言
C语言程序设计核心详解 第四章&&第五章 选择结构程序设计&&循环结构程序设计
本章节介绍了C语言中的选择结构,包括关系表达式、逻辑表达式及其运算符的优先级,并通过示例详细解释了 `if` 语句的不同形式和 `switch` 语句的使用方法。此外,还概述了循环结构,包括 `while`、`do-while` 和 `for` 循环,并解释了 `break` 和 `continue` 控制语句的功能。最后,提供了两道例题以加深理解。
|
10天前
|
存储 C语言
C语言程序设计核心详解 第十章:位运算和c语言文件操作详解_文件操作函数
本文详细介绍了C语言中的位运算和文件操作。位运算包括按位与、或、异或、取反、左移和右移等六种运算符及其复合赋值运算符,每种运算符的功能和应用场景都有具体说明。文件操作部分则涵盖了文件的概念、分类、文件类型指针、文件的打开与关闭、读写操作及当前读写位置的调整等内容,提供了丰富的示例帮助理解。通过对本文的学习,读者可以全面掌握C语言中的位运算和文件处理技术。
|
10天前
|
存储 C语言
C语言程序设计核心详解 第七章 函数和预编译命令
本章介绍C语言中的函数定义与使用,以及预编译命令。主要内容包括函数的定义格式、调用方式和示例分析。C程序结构分为`main()`单框架或多子函数框架。函数不能嵌套定义但可互相调用。变量具有类型、作用范围和存储类别三种属性,其中作用范围分为局部和全局。预编译命令包括文件包含和宏定义,宏定义分为无参和带参两种形式。此外,还介绍了变量的存储类别及其特点。通过实例详细解析了函数调用过程及宏定义的应用。
|
10天前
|
C语言
C语言程序设计核心详解 第三章:顺序结构,printf(),scanf()详解
本章介绍顺序结构的基本框架及C语言的标准输入输出。程序从`main()`开始依次执行,框架包括输入、计算和输出三部分。重点讲解了`printf()`与`scanf()`函数:`printf()`用于格式化输出,支持多种占位符;`scanf()`用于格式化输入,需注意普通字符与占位符的区别。此外还介绍了`putchar()`和`getchar()`函数,分别用于输出和接收单个字符。
|
10天前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
10天前
|
存储 人工智能 C语言
C语言程序设计核心详解 第六章 数组_一维数组_二维数组_字符数组详解
本章介绍了C语言中的数组概念及应用。数组是一种存储同一类型数据的线性结构,通过下标访问元素。一维数组定义需指定长度,如`int a[10]`,并遵循命名规则。数组元素初始化可使用 `{}`,多余初值补0,少则随机。二维数组扩展了维度,定义形式为`int a[3][4]`,按行优先顺序存储。字符数组用于存储字符串,初始化时需添加结束符`\0`。此外,介绍了字符串处理函数,如`strcat()`、`strcpy()`、`strcmp()` 和 `strlen()`,用于拼接、复制、比较和计算字符串长度。
|
10天前
|
存储 C语言
C语言程序设计核心详解 第九章 结构体与链表概要详解
本文档详细介绍了C语言中的结构体与链表。首先,讲解了结构体的定义、初始化及使用方法,并演示了如何通过不同方式定义结构体变量。接着,介绍了指向结构体的指针及其应用,包括结构体变量和结构体数组的指针操作。随后,概述了链表的概念与定义,解释了链表的基本操作如动态分配、插入和删除。最后,简述了共用体类型及其变量定义与引用方法。通过本文档,读者可以全面了解结构体与链表的基础知识及实际应用技巧。
|
7天前
|
存储 Serverless C语言
【C语言基础考研向】11 gets函数与puts函数及str系列字符串操作函数
本文介绍了C语言中的`gets`和`puts`函数,`gets`用于从标准输入读取字符串直至换行符,并自动添加字符串结束标志`\0`。`puts`则用于向标准输出打印字符串并自动换行。此外,文章还详细讲解了`str`系列字符串操作函数,包括统计字符串长度的`strlen`、复制字符串的`strcpy`、比较字符串的`strcmp`以及拼接字符串的`strcat`。通过示例代码展示了这些函数的具体应用及注意事项。
|
16天前
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。
|
16天前
|
C语言
C语言 字符串操作函数
本文档详细介绍了多个常用的字符串操作函数,包括 `strlen`、`strcpy`、`strncpy`、`strcat`、`strncat`、`strcmp`、`strncpy`、`sprintf`、`itoa`、`strchr`、`strspn`、`strcspn`、`strstr` 和 `strtok`。每个函数均提供了语法说明、参数解释、返回值描述及示例代码。此外,还给出了部分函数的自实现版本,帮助读者深入理解其工作原理。通过这些函数,可以轻松地进行字符串长度计算、复制、连接、比较等操作。