手把手带你用C语言实现猜数字游戏,猜不对直接关机!(搞怪室友版)

一、游戏要求:

  1. 电脑⾃动⽣成1~100的随机数
  2. 玩家猜数字,猜数字的过程中,根据猜测数据的⼤⼩给出⼤了或⼩了的反馈,直到猜对,游戏结束
  3. 拓展:(1)加入能够猜的次数(2)如果猜不对倒计时60秒关机,输入“我是猪”才取消关机

二、打印简易菜单

    按常规套路,玩游戏前都会有一个简易菜单,让用户选择是否开始游戏,由于现在讲到的知识有限,在这里我们利用函数printf直接做一个菜单
    思路:我们需要用户输入一个值来确定是否开始游戏,在这里我们就定为:输入1开始游戏,输入0退出游戏,输入其他值就显示输入错误,请重新选择,后面我们会讲到具体实现
    现在我们有了规定就开始动手吧,为了美观,我们将其包装为一个函数menu(),菜单代码如下:

void menu()
{
            printf("\n**********************\n");
            printf("*****1. 开始游戏 *****\n");
            printf("*****0. 退出游戏 *****\n");
            printf("**********************\n\n");
            printf("提示:输入1或0后回车\n\n");
}

三、游戏大致模型

    在进入游戏后,我们至少会让玩家选择一次玩还是不玩,再加上如果玩家要玩游戏,玩过之后还要询问是否还要玩,这就构成了一个循环,那用哪个循环最好呢?由于要让玩家至少选择一次,所以我们使用do······while循环最好,因为要让循环体的代码至少运行一次
    在循环中, 我们需要做什么呢,首先要打印一次菜单,然后让玩家选择,选择的值有0或者1,有这种具体的整型值,我们最好使用Switch分支语句,但是也要注意如果用户输入其它值,那么也要提示他重新选择,就要用到default
    为什么选择1或者0让用户输入呢,这是为了让我们循环判断方便一些,如果用户输入0,刚好0代表假,那么循环不会继续,输入1,非零为真,所以循环可以继续,输入其它值就显示输入错误
    为了简化代码我们将游戏的具体实现封装为一个函数game(),等一下讲到具体实现的办法,现在先把它写到我们的主体中,游戏大致模型代码如下:

int main()
{
	int n = 0;

	do
	{
		menu();
		scanf("%d", &n);
		switch (n)
		{
		case 0:
			printf("游戏结束\n");
			break;
		case 1:
			game();
			break;
		default:
			printf("输入错误,请重新输入:");
			break;
		}
	} while (n);
	return 0;
}

四、生成随机数

    既然我们是猜数字游戏,那么我们肯定要生成一个数字让用户去猜,而且是随机数,我们先来看看随机数怎么生成的,再想办法来限定它的具体大小
    此时我们需要一个函数来帮助我们实现,那就是rand()函数,它的参数为空,它的作用就是帮我们生成一个范围是0~RAND_MAX的伪随机数,一般最大值是32767,伪随机数是什么呢,就是电脑生成的数字,不可能是完全随机的,它是根据一定的算法实现看起来是随机数而已
    使用rand()函数,需要包含一个头文件,接下来我们就使用一下它,多使用几次来看看是不是能生成随机数:
在这里插入图片描述
    可以看出确实是生成了随机数,那么是不是就这样就能完成我们生成随机数的要求了呢?我们关闭运行窗口,让代码再次跑起来,结果如下:
在这里插入图片描述
    我们惊讶的发现,这一次代码运行产生的随机数居然和上一次一模一样,这很明显不符合我们的要求,我们的要求是每一次都能生成不同的随机数,否则这一次生成的随机数和下一次一样,用户不需要猜都知道答案,游戏就没有意义了
    那这是这是怎么回事呢?是因为rand()函数生成的是伪随机数,是通过一定的算法实现的,给算法一个值,它就能生成许多随机数,但是由于算法固定,所以随机数也固定了,这个值就是rand()函数的种子,默认情况下这个种子是1,如果我们不去改变它,那么种子永远都是1,生成的随机数也会固定,只有让我们的种子不固定,才能真正实现创造随机数
    为了更改这个种子,C语言又提供了一个函数srand(),它的参数是一个无符号的整数,但是有一个问题,我们需要srand()的参数不固定,但是rand()不能真正生成随机数,也就不能让它作为参数,那怎么办呢?
    在程序中我们⼀般是使⽤程序运⾏的时间作为种⼦的,因为时间时刻在发⽣变化的,在C语⾔中有⼀个函数叫time(),就可以获得这个时间,用户每玩一次游戏,时间肯定就过去了,我们的种子也就跟着变了,生成的随机数也就变了,最终实现我们的生成随机数的需求
    在使用time这个函数时,我们需要包含头文件<time.h>,在这里我们直接写出它的用法,等讲到指针我们再具体讲解time函数,如果不懂,也可以直接复制下面的代码:

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

srand((unsigned int)time(NULL))
//由于srand的参数是无符号整型,
//所以这里我们就可以使用学过的
//强制类型转换,将它转为无符号整数

此时我们的种子就在不断的变化,这下使用rand()函数就没有顾虑了,对于种子的改变我们将它写在主函数main中,如图:
在这里插入图片描述

五、实现基础游戏内容

   上文中我们提到将游戏内容包装为一个函数game(),那么我们现在就来想想基本思路

  1. 首先我们要对用户进行提示,我们要猜的数字在哪个范围,这里我们将范围指定为1~100,代码为:
	printf("\n游戏开始,请猜1~100之间的数字\n\n");
	//其中三个\n是为了让输出的结果更好看,也可以自行调整
  1. 现在我们就要真正来生成一个1~100的随机数了,我们刚刚讲过rand()函数生成的随机数一般都在1 ~ 32767之间,怎么约束它呢,我们只需要给它**%100+1**就可以了,%100可以产生0~99的数字,+1后就变成了1 ~ 100了,代码如下:
	int num = rand() % 100 + 1; 
  1. 生成随机数过后,我们就需要用户输入值来猜,就需要打印提示信息,以及输入数字,代码如下:
int guess = 0;
printf("请猜数字:");
scanf("%d", &guess);
  1. 随后我们需要对生成的随机数num和玩家猜的guess的值进行比较,给玩家提示信息,比如猜的数字大于随机数就输出猜大了,反之就猜小了,如果猜对了就输出,“恭喜你,猜对了”,随后游戏结束,由于玩家不可能一次猜对,所以会重复猜,就要使用我们的循环,这里我们使用while(1)对代码死循环,如果猜对了就break跳出来,具体代码实现如下:
     while(1)
	 {
		 printf("\n请猜数字:");//由于每次用户都要输入
		 scanf("%d", &guess);//于是把它们放在循环内部
		 if (guess > num)
		 {
			 printf("\n猜大了\n");
		 }
		 else if (guess < num)
		 {
			 printf("\n猜小了\n");
		 }
		 else
		 {
			 printf("\n恭喜你,猜对了\n");
			 break;
		 }
	 }

上述代码中有许多\n是为了使游戏更好看,可以自行调整,此时我们就完成了这个猜数字游戏的基础版,赶紧试试吧!

六、猜数字游戏基础版完整代码

#define _CRT_SECURE_NO_WARNINGS

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

void menu()
{
	printf("\n**********************\n");
	printf("*****1. 开始游戏 *****\n");
	printf("*****0. 退出游戏 *****\n");
	printf("**********************\n\n");
	printf("提示:输入1或0后回车\n\n");

}


void game()
{
	printf("\n游戏开始,请猜1~100之间的数字\n\n");
	int num = rand() % 100 + 1;
	int guess = 0;
	
     while(1)
	 {
		 printf("\n请猜数字:");
		 scanf("%d", &guess);
		 if (guess > num)
		 {
			 printf("\n猜大了\n");
		 }
		 else if (guess < num)
		 {
			 printf("\n猜小了\n");
		 }
		 else
		 {
			 printf("\n恭喜你,猜对了\n");
			 break;
		 }
	 }
}

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

七、拓展1:添加玩家可以猜数字的次数(附代码)

  1. 大致思想:为了实现这个代码我们可以增加一个count变量来约束循环,我们这里就不把循环设置为死循环,将它的循环条件设置为count,我们每循环一次就让count自减一次,直到count变成0,循环结束,然后我们就在屏幕上输出:“次数耗尽,游戏失败”,最后我们将随机数打印出来,让玩家知道结果
  2. 细节补充:我们可以在游戏开始前提示玩家一共有多少次机会猜数字,然后每猜一次就提示还剩几次机会,同时经过实验,将count设置为6最合理,当然也可以根据需求更改,
  3. 拓展后代码:
#define _CRT_SECURE_NO_WARNINGS

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

void menu()
{
	printf("\n**********************\n");
	printf("*****1. 开始游戏 *****\n");
	printf("*****0. 退出游戏 *****\n");
	printf("**********************\n\n");
	printf("提示:输入1或0后回车\n\n");

}


void game()
{
	printf("\n游戏开始,请猜1~100之间的数字\n\n");
	int num = rand() % 100 + 1;
	int guess = 0;
	int count = 6;
	printf("你共有%d次机会\n", count);
     while(count)
	 {
		
		 printf("\n请猜数字:");
		 scanf("%d", &guess);
		 if (guess > num)
		 {
			 printf("\n猜大了\n");
		 }
		 else if (guess < num)
		 {
			 printf("\n猜小了\n");
		 }
		 else
		 {
			 printf("\n恭喜你,猜对了\n");
			 break;
		 }
		 count--;
		 printf("你还有%d次机会\n", count);
	 }
	 if (count == 0)
	 {
		 printf("\n次数耗尽,游戏失败,随机数是:%d\n\n",num);

	 }
}

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

八、拓展2:添加关机程序(附代码)

  1. 我们先来了解一个Windows提供的命令:shutdown,我们这里了解它的两个参数
    (1)一个是-s -t +秒数,含义是多少秒后关机,比如shutdown -s -t 60就是60秒后关机
    (2)另一个是-a,作用是取消当前的关机命令,如shutdown -a就是取消关机
  2. 知道这两个命令有什么用呢?我们可以通过C语言来调用这个命令,方法就是用一个函数system(),只需要将命令写入括号中,并且用双引号引起就可以了,使用system函数需要包含一个头文件<windows.h>
  3. 具体构思:在上面增加次数的代码中,我们说如果次数耗尽那么就显示游戏失败,我们现在可以将其改成:如果次数耗尽,首先利用system函数使用shutdown -s -t 60,让电脑一分钟后关机,随后就提示“游戏失败,次数耗尽,游戏失败,随机数是:···”,然后再提示“请注意,你的电脑将在60秒后关机,输入我是猪取消关机”
  4. 这时我们需要注意的是,我们需要创建一个字符数组让玩家能够输入我是猪,代码如下:
char arr[10] = { 0 };
 scanf("%s", arr);

这样就可以让用户输入字符,那么然后我们就需要比较用户输入的字符是否是我是猪,如果不是就提示输入错误,要求重新输入,这里我们就要引入字符串比较函数strcmp(),用法就是将两个字符串分别传入函数,用逗号隔开,使用这个函数需要包含头文件<string.h>

  1. 根据上面的思路,我们需要用户输入字符,并且输入错误我们还需要让其重新输入,很容易就联想到使用循环,这里我们使用while循环,使用while(1)来构成死循环,如果输入的值错误就重新输入,如果输入正确,那么就利用system函数使用shutdown -a来取消关机,最后使用break跳出循环
  2. 经过上面的学习,相信你已经可以写出这个搞怪关机版的猜数字游戏了,在这里我提供代码仅供参考,可以根据自己的需要更改,代码如下:
#define _CRT_SECURE_NO_WARNINGS

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

void menu()
{
	printf("\n**********************\n");
	printf("*****1. 开始游戏 *****\n");
	printf("*****0. 退出游戏 *****\n");
	printf("**********************\n\n");
	printf("提示:输入1或0后回车\n\n");

}


void game()
{
	printf("\n游戏开始,请猜1~100之间的数字\n\n");
	int num = rand() % 100 + 1;
	int guess = 0;
	int count = 6;
	printf("你共有%d次机会\n", count);
     while(count)
	 {
		
		 printf("\n请猜数字:");
		 scanf("%d", &guess);
		 if (guess > num)
		 {
			 printf("\n猜大了\n");
		 }
		 else if (guess < num)
		 {
			 printf("\n猜小了\n");
		 }
		 else
		 {
			 printf("\n恭喜你,猜对了\n");
			 break;
		 }
		 count--;
		 printf("你还有%d次机会\n", count);
	 }
	 if (count == 0)
	 {
		 printf("\n次数耗尽,游戏失败,随机数是:%d\n\n",num);
		 char arr[10] = { 0 };
		 printf("请注意,你的电脑将在60秒后关机,输入我是猪取消关机\n\n");
		 system("shutdown -s -t 60");
		 printf("请输入:");
		 while (1)
		 {
			 
			 scanf("%s", arr);
			 if (strcmp(arr,"我是猪")==0)
			 {
				 system("shutdown -a");
				 printf("\n恭喜你,取消了关机\n");
				 break;
			 }
			 else
			 {
				 printf("输入错误,请重新输入:");
			 }

	}
	 }
}

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

七、将游戏分享给其他人的方法

    相信你已经尝试玩了这个猜数字游戏,是不是特别想分享给朋友室友玩一玩呢?跟着我来学习吧
    首先打开vs,将上方的debug模式改为release版本,随后将代码运行一次,如图:在这里插入图片描述
    然后找到存放该文件的文件夹,找到x64文件夹,然后找到release文件夹,打开后找到扩展名为exe的可执行文件,直接将其发送给朋友就可以了,是不是非常简单呢!

    最后如果觉得本文的猜数字游戏有用,记得一键三连,拜拜~~

  • 18
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值