如何完成一个猜数字小游戏

想要用C代码完成一个简单游戏,需要分为三个部分,第一先要对整个游戏的逻辑进行分析,将其分为几个不同的功能模块;然后再根据每个模块的不同需求进行代码实现,最后将不同功能代码模块进行有序组合。

一、逻辑分析

作为一个游戏首先要有一个菜单供玩家选择,而每个选项都代表不同的功能,这种多分支的票结构可以用switch语句很好实现,并能用其中的defalut语句进行玩家的错误操作提示。

每个游戏功能,都可以用一个函数进行封装,由于这个游戏非常简单,用一个函数足矣。

游戏的大体逻辑如下:
这里写图片描述

二、代码实现

1、main函数的代码实现如下:
int main()
{
    int input = 0;
    srand((unsigned int)time(NULL));//为了保证随机生成数起点不再变化,从而让rand函数生成的随机数均匀,故将其放在main函数内只调用一次。
    do
    {
        menu();
        printf("请选择:\n");
        scanf("%d",&input);
        switch(input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("游戏结束\n");
            break;
        default :
            printf("输入有误,请重新输入\n");
            break;
        }
    }while (input);
    return 0;
}

main函数是对整个游戏的逻辑进行实现,先给出一个大的框架,接着通过函数调用实现内部功能。

2、打印一个简单的菜单:
void menu()
{
    printf("***********************************\n");
    printf("***********    1.play   ***********\n");
    printf("***********    0.exit   ***********\n");
    printf("***********************************\n");
}
3、游戏功能的实现
3.1 rand函数的了解

猜数字游戏,在猜之前需要生成一个随机的数字。
通过调用rand函数可以生成一个随机数。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    int n = 0;
    int i = 0;
    scanf("%d",&n);
    printf("生成的%d个随机数分别为:\n",n);
    for (i=0; i<n; i++)
    {
        printf("%d ",rand());
    }
    return 0;
}

但在测试中发现,通过调用此函数,程序每次执行生成的“随机数”都是相同的。这是因为如果没有设置随机数种子,rand()函数在调用时,自动设计随机数种子为1。那么随机种子相同,每次产生的随机数也会相同。

通过对rand函数的了解发现,再调用它之前,需要先调用srand函数生成一个随机数的起点。
这里写图片描述

3.2time函数的了解

生成随机数的起点可以通过time函数的调用来实现。time函数的返回值是当前时间点与计算机初始时间1970.01.01 00:00:00的差值。
这里写图片描述
这里写图片描述

可见,time函数的返回类型是一个长整形或者int类型,time函数的参数部分是一个名为timer的time_t *类型指针,在调用时可用NULL指针代替。

3.3 srand函数的了解

再来看看srand函数的参数类型:
这里写图片描述
srand需要传递的参数必须为unsiged int类型,所以需要对调用time函数返回的long/int进行强制类型转换。

3.4游戏功能的实现代码如下:
void game ()
{
    int i = 0;
    int ret = 0;
    ret = rand()%100+1;//保证生成的随机数在1~100之间
    printf("%d\n",ret);
    while (1)
    {
        printf("请输入你认为的数字:");
        scanf("%d",&i);
        if (i>ret)
        {
            printf("猜大了\n");
        }
        else if (i<ret)
        {
            printf("猜小了\n");
        }
        else
        {
            printf("恭喜你!猜对了\n");
            break;
        }
    }
}

三、完整代码

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

void game ()
{
    int i = 0;
    int ret = 0;
    ret = rand()%100+1;
    while (1)
    {
        printf("请输入你认为的数字:");
        scanf("%d",&i);
        if (i>ret)
        {
            printf("猜大了\n");
        }
        else if (i<ret)
        {
            printf("猜小了\n");
        }
        else
        {
            printf("恭喜你!猜对了\n");
            break;
        }
    }
}

int main()
{
    int input = 0;
    srand((unsigned int)time(NULL));
    do
    {
        menu();
        printf("请选择:\n");
        scanf("%d",&input);
        switch(input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("游戏结束\n");
            break;
        default :
            printf("输入有误,请重新输入\n");
            break;
        }
    }while (input);
    return 0;
}

四、效果演示

这里写图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值