[C语言][小游戏][猜数游戏]

简介: [C语言][小游戏][猜数游戏]

目录:

带着梦想,带着好奇,带着执着,在C语言的世界里旅行。亲爱的朋友们,一起加油。

一、猜数判定

显示玩家从键盘输入的值和计算机事先准备的“目标数字”进行比较

#include <stdio.h>
int main()
{
    int no;//读取的数字
    int ans = 7;//目标数字
    printf("请输入0~9的数字:\n\n");
    printf("你猜是多少呢?:\n");
    scanf("%d", &no);
    if (no > ans)
        printf("\a再小一点。\n");
    else if (no < ans)
        printf("\a再大一点。\n");
    else
        printf("猜对了。");
    return  0;
}

1)本游戏的“目标数字”是7,用变量ans表示,从键盘输入的值则用变量no表示。

2)程序通过if来判断no和ans两个变量值的大小,根据判断结果显示“再小一点。”“再大一点。”“猜对了。”。

3)输出的字符串包含两个转义字符。一个是我们熟悉的\n,表示换行,另一个\a,表示警报。


二、重复到猜对为止

如果“猜数字游戏”只允许玩家输入一次数值,那就显得无趣。我们把程序改良一下,玩家可以一直重复输入,直到猜对了为止。

#include <stdio.h>
int main()
{
    int no;//读取的数字
    int ans = 7;//目标数字
    printf("请输入0~9的数字:\n\n");
    do
    {
        printf("你猜是多少呢?:\n");
    scanf("%d", &no);
    if (no > ans)
        printf("\a在小一点。\n");
    else if (no < ans)
        printf("\a再大一点。\n");
} while (ans!=no);//重复到猜对为止
printf("猜对了。\n");
    return  0;
}

1)do语句while(表达式);是通过先循环后判断重复进行处理的语句。

2)do和while围起来的语句叫做循环体。只要控制表达式的结果不为零,那么循环体就会一直重复执行下去。

3)我们把控制表达式设为no!=ans,当程序读取到的no和“目标数字”ans一样的值时,控制表达式的求值结果为0,循环就结束了,画面显示“猜对了。”,程序结束。


三、随机设定目标数字

前面的游戏,“目标数字”都是自己设置好的,为了提升这个游戏的趣味性,我们让这个值变化起来。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    //srand((unsigned)time(NULL));
    int no;//读取的数字
    int ans = rand()%1000+1;//目标数字
    printf("请输入1~1000的数字:\n\n");
    do
    {
        printf("你猜是多少呢?:\n");
    scanf("%d", &no);
    if (no > ans)
        printf("\a在小一点。\n");
    else if (no < ans)
        printf("\a再大一点。\n");
} while (ans!=no);//重复到猜对为止
printf("猜对了。\n");
    return  0;
}

1)rand函数(生成随机数):头文件为<stdlib.h>.rand函数生成的值是伪随机数,总会生成一个相同的随机数序列。

rand函数是对一个叫做“种子”的基准值加以运算得到随机数的。每次运行程序都会生成一个随机序列,rand函数默认种子为常量1。要生成不同的随机数,就要改变这个种子。负责执行这项任务的是srand函数。



2)srand函数(设置生成随机数的种子):srand函数是用来设置种子的,一但决定了种子,那么生成的随机数序列也就确定了。如果我们想每次运行程序的时候都能生成不同的随机数,那么就必须将种子的值从常数变成随机数。

3)我们一般使用的方法是把运行程序的时间当做种子:

srand((unsigned)time(NULL))。rand函数的范围是0~32767,所以rand函数要求使用unsigned类型。

time函数用到的头文件是<time.h>。

4)一般情况下,我们需要的是某个特定范围内的随机数。

“目标数字”设定为1~1000如:

rand()%1000+1;


四、限制输入次数

只要不断输入数值,终会猜对,为了增加难度,也为了给玩家紧张感,我们把玩家最多输入的次数限制一下。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
     srand((unsigned)time(NULL));
    int no;//读取的数字
    int ans = rand() % 1000 + 1;//目标数字
    int max_s ;//最多输入的次数
    printf("最多输入几次:\n");
    scanf("%d", &max_s);
    int s = max_s;//还可以输入的次数
    printf("请输入1~1000的数字:\n\n");
    do
    {
        printf("还剩%d次机会,你猜是多少呢?\n", s);
        s--;
        scanf("%d", &no);
        if (no > ans)
            printf("\a在小一点。\n");
        else if (no < ans)
            printf("\a再大一点。\n");
    } while (ans != no && s > 0);
    if (ans == no)
    {
        printf("猜对了。\n");
        printf("你用了%d次猜中\n", max_s - s);
    }
    else
        printf("\a很遗憾,你猜错了\n");
    return  0;
}

1)max_s变量表示玩家最多可输入的次数,自己设置。

2)s表示还能输出的次数,,其初始值是max_s变量的值,每次玩家输入数值时,s就进行自减运算。

3)当s为0,或者在有限的次数内猜对了,就会跳出循环。

4)max_s 减去s就可以知道玩家是在第几次猜中了目标数字。


五、保存输入的记录

如果程序能够保持玩家输入的值,玩家就能在游戏结束时,确认自己猜的数字距离目标数字有多远

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
     srand((unsigned)time(NULL));
    int no;//输入的数字
    int ans = rand() % 1000 + 1;//目标数字
    int max_s ;//最多输入的次数
    int arr[1000];//存放输入的值
    int i = 0,j=0;
    printf("最多输入几次:\n");
    scanf("%d", &max_s);
    int s = max_s;//还可以输入的次数
    printf("请输入1~1000的数字:\n\n");
    do
    {
        printf("还剩%d次机会,你猜是多少呢?\n", s);
        s--;
        scanf("%d", &no);
        arr[i++] = no;
        if (no > ans)
            printf("\a在小一点。\n");
        else if (no < ans)
            printf("\a再大一点。\n");
    } while (ans != no && s > 0);
    if (ans == no)
    {
        printf("猜对了。\n");
        printf("你用了%d次猜中\n", max_s - s);
    }
    else
        printf("\a很遗憾,你猜错了\n");
    puts("\n---输入记录---");
    for(j=0;j<i;j++)
    printf("%2d:%4d %+4d\n", j + 1, arr[j], arr[j] - ans);
    return  0;
}

1)创建一个个数组arr[1000],用来存放输入的值;i+1表示第几次输入;arr[i]表示玩家输入的值;arr[i]-ans表示玩家输入的值与正确答案之差。

2)“%+d”表示数值即使是正值和0也会带符号。

六、测试小游戏

代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
     srand((unsigned)time(NULL));
    int no;//输入的数字
    int ans = rand() % 1000 + 1;//目标数字
    int max_s ;//最多输入的次数
    int arr[1000];//存放输入的值
    int i = 0,j=0;
    printf("最多输入几次:\n");
    scanf("%d", &max_s);
    int s = max_s;//还可以输入的次数
    printf("请输入1~1000的数字:\n\n");
    do
    {
        printf("还剩%d次机会,你猜是多少呢?\n", s);
        s--;
        scanf("%d", &no);
        arr[i++] = no;
        if (no > ans)
            printf("\a在小一点。\n");
        else if (no < ans)
            printf("\a再大一点。\n");
    } while (ans != no && s > 0);
    if (ans == no)
    {
        printf("猜对了。\n");
        printf("你用了%d次猜中\n", max_s - s);
    }
    else
        printf("\a很遗憾,你猜错了\n");
    puts("\n---输入记录---");
    for(j=0;j<i;j++)
    printf("%2d:%4d %+4d\n", j + 1, arr[j], arr[j] - ans);
    return  0;
}

感觉游戏看着不太美观,我们再扩展一下:

1)加个界面:

void menu()
{
    printf("********************\n");
    printf("*****1.进入游戏*****\n");
    printf("*****0.退出游戏*****\n");
    printf("********************\n");
}

代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
    printf("********************\n");
    printf("*****1.进入游戏*****\n");
    printf("*****0.退出游戏*****\n");
    printf("********************\n");
}
void game()
{
    int no;//输入的数字
    int ans = rand() % 1000 + 1;//目标数字
    int max_s;//最多输入的次数
    int arr[1000];//存放输入的值
    int i = 0, j = 0;
    printf("最多输入几次:\n");
    scanf("%d", &max_s);
    int s = max_s;//还可以输入的次数
    printf("请输入1~1000的数字:\n\n");
    do
    {
        printf("还剩%d次机会,你猜是多少呢?\n", s);
        s--;
        scanf("%d", &no);
        arr[i++] = no;
        if (no > ans)
            printf("\a在小一点。\n");
        else if (no < ans)
            printf("\a再大一点。\n");
    } while (ans != no && s > 0);
    if (ans == no)
    {
        printf("猜对了。\n");
        printf("你用了%d次猜中\n", max_s - s);
    }
    else
        printf("\a很遗憾,你猜错了\n");
    puts("\n---输入记录---");
    for (j = 0; j < i; j++)
        printf("%2d:%4d %+4d\n", j + 1, arr[j], arr[j] - ans);
}
int main()
{
     srand((unsigned)time(NULL));
     int n;
     while (1)
     { 
         menu();
     scanf("%d", &n);
     if (n == 1)
         game();
      else if (n == 0)
         break;
     else
         printf("输错了,请重新输入:\n");
     }
    return  0;
}

2)加个Sleep函数和system函数

Sleep函数用来休眠,单位是毫秒;system函数可以执行系统命令,system(“cls”)清理屏幕,达到闪烁的目的。

代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
void menu()
{
    printf("********************\n");
    printf("*****1.进入游戏*****\n");
    printf("*****0.退出游戏*****\n");
    printf("********************\n");
}
void game()
{
    int no;//输入的数字
    int ans = rand() % 1000 + 1;//目标数字
    int max_s;//最多输入的次数
    int arr[1000];//存放输入的值
    int i = 0, j = 0;
    printf("最多输入几次:\n");
    scanf("%d", &max_s);
    int s = max_s;//还可以输入的次数
    printf("请输入1~1000的数字:\n\n");
    do
    {
        printf("还剩%d次机会,你猜是多少呢?\n", s);
        s--;
        scanf("%d", &no);
        arr[i++] = no;
        if (no > ans)
            printf("\a在小一点。\n");
        else if (no < ans)
            printf("\a再大一点。\n");
        Sleep(1000);//x休眠的意思,单位是毫秒
        system("cls");//清屏
    } while (ans != no && s > 0);
    if (ans == no)
    {
        printf("猜对了。\n");
        printf("你用了%d次猜中\n", max_s - s);
    }
    else
        printf("\a很遗憾,你猜错了\n");
    puts("\n---输入记录---");
    for (j = 0; j < i; j++)
        printf("%2d:%4d %+4d\n", j + 1, arr[j], arr[j] - ans);
}
int main()
{
     srand((unsigned)time(NULL));
     int n;
     while (1)
     { 
         menu();
     scanf("%d", &n);
     if (n == 1)
         game();
      else if (n == 0)
         break;
     else
         printf("输错了,请重新输入:\n");
     }
    return  0;
}

测试:

这样看着就很简介

相关文章
|
1月前
|
机器学习/深度学习 C语言
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
【8月更文挑战第5天】本篇文章用C语言采用多文件编写实现了一个基础的扫雷游戏(附源码),并讲解了关于函数递归的基础概念及其相对应的习题练习(附源码)
35 1
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
|
2月前
|
存储 C语言 开发者
C语言实战 | Flappy Bird游戏
【7月更文挑战第4天】Flappy Bird是由越南开发者制作的简单却极具挑战性的游戏,玩家需控制小鸟穿越水管障碍。游戏涉及角色初始化、显示和更新。小鸟和水管结构体存储数据,使用变量和数组。初始化小鸟和水管,显示背景、小鸟和水管,更新小鸟位置及碰撞检测。代码示例展示了小鸟和水管的状态管理,当小鸟与管道碰撞或触地时,游戏结束。游戏的成功在于其独特的虐心体验。
50 0
C语言实战 | Flappy Bird游戏
|
1月前
|
算法 编译器 C语言
【C语言篇】猜数字游戏(赋源码)
rand函数会返回⼀个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的⼤⼩是依赖编译器上实现的,但是⼤部分编译器上是32767。
|
2月前
|
存储 编译器 C语言
|
2月前
|
存储 C语言
【C语言】猜数字小游戏
C语言实现猜数字小游戏
30 2
【C语言】猜数字小游戏
|
2月前
|
存储 编译器 C语言
C语言实战 | “贪吃蛇”游戏
【7月更文挑战第5天】在C语言实战中,本文档介绍了如何构建一个简单的“贪吃蛇”游戏。游戏的核心是控制蛇移动并增长,当吃掉食物时,蛇的身体变长。数据结构使用固定大小的数组表示蛇的位置,变量存储食物位置和蛇的长度。初始化后,利用非阻塞式`getKey()`函数实现WASD键盘控制蛇的运动方向。虽然蛇的边界检测和吃食物后的增长尚未详细说明,但提到了这些问题作为练习留给读者解决,并预告将在后续章节讨论模块化编程以简化复杂代码。
77 0
C语言实战 | “贪吃蛇”游戏
|
2月前
|
存储 数据管理 C语言
C语言实战 | 使用链表完成“贪吃蛇”游戏
【7月更文挑战第1天】整体思维,即系统思维,强调以整体视角理解事物。在编程中,结构体体现这种思想,将相关变量打包处理。示例展示了如何用链表而非数组实现“贪吃蛇”游戏,链表提供了更灵活的动态数据管理。一系列代码图片详细描绘了链表结构体在游戏中的应用,包括节点定义、移动、碰撞检测等,凸显了使用链表的优势和代码的清晰组织。
32 0
C语言实战 | 使用链表完成“贪吃蛇”游戏
|
3月前
|
存储 C语言
C语言实战 | “贪吃蛇”游戏重构
在程序设计中,模块化思维至关重要,尤其对于复杂项目,它帮助分解任务,便于团队协作。以“贪吃蛇”游戏为例,游戏涉及两个角色:蛇和食物。使用数组存储蛇的位置,变量存储食物位置。游戏流程分为初始化、显示和更新数据。初始化时,食物位置随机,蛇的位置根据数组设定。显示数据则根据这些信息在屏幕上呈现角色。更新数据时,处理蛇的移动和增长以及食物的生成和消失。类似地,通过模块化方法可开发“打砖块”游戏,涉及球、球拍和砖墙,每个角色都有相应数据结构和更新逻辑。通过这种方式,游戏开发就像搭建积木,遵循框架逐步实现。
58 0
C语言实战 | “贪吃蛇”游戏重构
|
3月前
|
C语言
【海贼王编程冒险 - C语言海上篇】怎样用C语言实现简单的扫雷游戏?
【海贼王编程冒险 - C语言海上篇】怎样用C语言实现简单的扫雷游戏?
21 1
|
3月前
|
C语言
C语言实现猜数字游戏:代码详解与函数解析
C语言实现猜数字游戏:代码详解与函数解析