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

目录
打赏
0
0
0
0
6
分享
相关文章
|
2月前
|
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
75 16
|
2月前
|
【C语言程序设计——循环程序设计】求解最大公约数(头歌实践教学平台习题)【合集】
采用欧几里得算法(EuclideanAlgorithm)求解两个正整数的最大公约数。的最大公约数,然后检查最大公约数是否大于1。如果是,就返回1,表示。根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。作为新的参数传递进去。这个递归过程会不断进行,直到。有除1以外的公约数;变为0,此时就找到了最大公约数。开始你的任务吧,祝你成功!是否为0,如果是,那么。就是最大公约数,直接返回。
95 18
【C语言程序设计——循环程序设计】利用循环求数值 x 的平方根(头歌实践教学平台习题)【合集】
根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码,求解出数值x的平方根;运用迭代公式,编写一个循环程序,求解出数值x的平方根。注意:不能直接用平方根公式/函数求解本题!开始你的任务吧,祝你成功!​ 相关知识 求平方根的迭代公式 绝对值函数fabs() 循环语句 一、求平方根的迭代公式 1.原理 在C语言中,求一个数的平方根可以使用牛顿迭代法。对于方程(为要求平方根的数),设是的第n次近似值,牛顿迭代公式为。 其基本思想是从一个初始近似值开始,通过不断迭代这个公式,使得越来越接近。
65 18
|
2月前
|
【C语言程序设计——循环程序设计】统计海军鸣放礼炮声数量(头歌实践教学平台习题)【合集】
有A、B、C三艘军舰同时开始鸣放礼炮各21响。已知A舰每隔5秒1次,B舰每隔6秒放1次,C舰每隔7秒放1次。编程计算观众总共听到几次礼炮声。根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。开始你的任务吧,祝你成功!
64 13
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
42 3
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
27 2
【C语言程序设计——函数】回文数判定(头歌实践教学平台习题)【合集】
算术运算于 C 语言仿若精密 “齿轮组”,驱动着数值处理流程。编写函数求区间[100,500]中所有的回文数,要求每行打印10个数。根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码。如果操作数是浮点数,在 C 语言中是不允许直接进行。的结果是 -1,因为 -7 除以 3 商为 -2,余数为 -1;注意:每一个数据输出格式为 printf("%4d", i);的结果是 1,因为 7 除以 -3 商为 -2,余数为 1。取余运算要求两个操作数必须是整数类型,包括。开始你的任务吧,祝你成功!
56 1
《C语言程序设计》一 第 1 章 程序设计概述
本节书摘来自华章出版社《C语言程序设计》一 书中的第1章,第1.1节,作者:赵宏 陈旭东 马迪芳,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1188 0
《C语言程序设计与实践(第2版)》——第1章 C语言与程序设计概述 1.1初见C语言程序
我国古代数学家张邱建在其编写的《算经》里提出了历史上著名的“百钱买百鸡”问题:今有鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。凡百钱买鸡百只,问鸡翁、母、雏各几何?对于这个问题,很多读者在小学或初中的竞赛中可能都见到过,而且通常都采用不定方程求解。
1157 0
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
73 23
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等