C语言只用函数和循环实现猜数字游戏

前言:

题目:

1.随机数在1-100之间

2.猜数字

1>猜小了,程序会告诉你猜小了。继续猜

2>猜大了,程序会告诉你猜大了。继续猜
3>猜对了,程序会告诉:恭喜你猜对了。结束

3.游戏可以反复玩

4.打印菜单

先上总代码:

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

void menu()                //打印菜单
{
	printf("**************************\n");
	printf("******    1. play   ******\n");
	printf("******    0. exit   ******\n");
	printf("**************************\n");
}



void game()            //游戏的基础逻辑
{
	int num = 0;
	int ret = rand()%100+1;

	while (1)
	{
		printf("请猜数字:>");
		scanf("%d", &num);
		if (num < ret)
		{
			printf("猜小了\n");
		}
		else if (num > ret)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("恭喜你,猜对了\n");
			break;
		}
	}
}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));        //srand库函数的随机数发生器
	do
	{
		//打印菜单
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();            //game函数中是猜数字的整个逻辑
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);

	return 0;
}

​

接下来我们一段一段解析

一.首先确定主体该怎么写

#include<stdio.h>

void menu()        //由于菜单不需要返回值,所以用void
{
	printf("**************************\n");
	printf("******    1. play   ******\n");
	printf("******    0. exit   ******\n");
	printf("**************************\n");
}

int main()
{
    int input=0;        //初始化输入值;
    //猜数字游戏要先猜一次,所以使用do while循环
    //判断条件就可以用input来判断,由于在C语言中0为假,非零为真。
do
{
    menu();            //先打印菜单
    scanf("%d",&input);
}while(input)    
    return 0;
}

我们再开始把菜单打印出来,在进一步写下去。

小tips:在C语言,每写完一小段最好编译一下,更好的发现代码的BUG,而不是写完全部在找BUG

二.写游戏的逻辑

 紧接上文,我们继续写主函数里面,总体的思路该怎么走

#include<stdio.h>
#include<windows.h>    //windows 库函数头文件



void menu()        //由于菜单不需要返回值,所以用void
{
	printf("**************************\n");
	printf("******    1. play   ******\n");
	printf("******    0. exit   ******\n");
	printf("**************************\n");
}

int main()
{
    int input=0;        //初始化输入值;
    //猜数字游戏要先猜一次,所以使用do while循环
    //判断条件就可以用input来判断,由于在C语言中0为假,非零为真。
do
{
    menu();            //先打印菜单
    scanf("%d",&input);
    switch(input)        //用非0和0来判断真假
    {
        case 1:        
            printf("游戏即将开始\n");
            game()        //设置一个game函数,不需要返回值
        break;        
        case 0:        
            printf("即将退出游戏\n");
            Sleep(1500)        //使用Sleep库函数是实现睡眠,单位是毫秒,使代码打印慢一些。
            system("cls");    // 使用Windows库函数,该代码的意思为清空页面
                                //使得每次游戏结束时清空屏幕。
            break;       
        defalut:
            printf("选择错误,请重新选择\n");
            break;
   }
}while(input)    
    return 0;
}

ok,现在总体的思路我们已经写清楚了。接下来就是game函数的编写,要实现它该怎么做呢?

我们一步一步跟随主函数的思路写

//单独写出game函数(自定义函数)

void game()        //游戏是由输入值进来,所以不需要返回值,故使用void。
{
    int num =0;    //应题目要求我们应该生成随机数,在c语言中可以使用rand
    int ret=rand()%100+1    //rand的返回值用ret来接受
    //由于题目要求为1-100,所以%100之后范围就为1-99,之后再加一个1就满足题目条件
    //接下来开始猜数字游戏的主体逻辑
    while(1)        //游戏可以重复玩,可以使用循环;
    {    
        scanf("%d",&num);
        if(num>ret)
            printf("猜大拉\n");
        if(num<ret)
            printf("猜小拉\n");
        else
            {
                printf("恭喜你,猜对啦\n");    
                break;    //出循环
             }
    }
}
ok,现在游戏的逻辑我们就写完啦~

如果我们把一和二拼接起来,编译运行起来,会发现,每次猜的数字并不随机而且,非常相近。

这是怎么回事呢?

进一步说明下:计算机并不能产生真正的随机数,而是已经编写好的一些无规则排列的数字存储在电脑里,把这些数字划分为若干相等的N份,并为每份加上一个编号用srand()函数获取这个编号,然后rand()就按顺序获取这些数字。当srand()的参数值固定的时候,rand()获得的数也是固定的,所以一般srand的参数用time(NULL),因为系统的时间一直在变,所以rand()获得的数,也就一直在变,相当于是随机数了。只要用户或第三方不设置随机种子,那么在默认情况下随机种子来自系统时钟。如果想在一个程序中生成随机数序列,需要至多在生成随机数之前设置一次随机种子。

小tips:rand函数在使用之前要是用一个srand来设置随机数的生成器

 所以我们需要用time函数来获得系统时间,这样就是完全的随机数。

我们只需要在主函数调用一次就够了,不需要多次调用。

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));    //用空指针,程序就不需要参数获得数据。
        //time_t型数据转化为(unsigned)型再传给srand函数
	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;
}

ok这样我们就大功告成啦~。将它们拼接起来就是

#include<stdio.h>
#include<windows.h>    //windows 库函数头文件
#include<time.h>
#include<stdlib.h>

void menu()        //由于菜单不需要返回值,所以用void
{
	printf("**************************\n");
	printf("******    1. play   ******\n");
	printf("******    0. exit   ******\n");
	printf("**************************\n");
}

void game()
{
	int num = 0;
	int ret = rand() % 100 + 1;
	while (1)
	{
		printf("猜数字:");
		scanf("%d", &num);
		if (num < ret)
		{
			printf("猜小了\n");
		}
		else if (num > ret)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("恭喜你,猜对了\n");
			Sleep(2000);
			system("cls");

			break;
		}
	}
}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do 
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("游戏即将开始\n");
			game();	

			break;
		case 0:
			printf("即将退出游戏\n");
			Sleep(1500);
			system("cls");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);
		return 0;
}

大功告成润咯~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值