目录
在之前的文章中,我们介绍了分支语句、循环语句与转向语句的使用方法:
(上) C语言中的语句分类及分支语句:if语句、switch语句介绍-CSDN博客
(下) C语言中的循环与转向语句:do while语句、while语句、for语句、break语句、goto语句、continue语句介绍-CSDN博客
今天让我们来使用它们来制作一个小游戏吧。?
1. 我们随便猜1到100的一个数字,如果我们猜小了或猜大了,就告诉我们猜小了或猜大了,并告诉我们新的区间以及还有几次猜的机会。
2. 如果我们的机会都用完了,那么就告诉我们猜字失败,并告诉我们正确的数字。
3. 如果我们猜对了,就告诉我们猜对了,并询问是否再来一局。
首先我们需要创建我们所需的文件,三个.c文件,一个.h文件。
(1) main.c
?
(2) menu.c
?
(3) menu.h
?
(3) game.c
?
(4) game.h
?
自创的.h文件可以用于声明和定义函数、变量和数据结构,以供其他源文件引用和使用。
一般自创的.h文件包含时使用双引号"",用来区分库文件与自创文件。
图中的#pragma once的作用是防止被重复编译,或者说被多次编译。
图中的#ifndef和define以及#endif是条件编译的一般格式,它的作用是防止头文件的重复包含和编译,以及便于程序的调试和移植。
既然是做一个游戏,那么肯定要有一个菜单,如果我们需要选择难度,那么就需要一个菜单和一个选择难度的窗口。???????
这里在menu.c里定义了两个函数,菜单以及窗口,void类型说明函数没有返回值,menu和window是函数名,()里面没有参数,说明这是一个没有返回值,没有参数的函数,它们的功能就是打印菜单及窗口。
?
将两个函数的定义放到menu.h文件里,注意结尾需要加引号。
我们猜数字时,如果是自己指定数字去猜的话,数字就很容易重复。所以下面我们来生成一个根据时间变化而变化的随机数。
(1) time.h
在C语言的time.h头文件中,时间戳是指从1970年1月1日00:00:00(也称为UNIX纪元)到特定时间点所经过的秒数。可以使用time()函数来获取当前时间的时间戳。
?
time(NULL) 是一个 C 语言函数,它用于获取当前系统时间的秒数。而(unsigned)在这里是将返回的时间值强制转换为无符号整数。所以(unsigned)time(NULL)的意思是可以用来获取一个无符号整数表示的当前系统时间。
(2)?stdlib.h
在stdlib.h文件中,我们需要使用srand函数来设置随机数种子,然后使用rand函数来生成随机数。
?
?
由于我们需要猜的范围是1到100,所以我们先让rand函数对100取余得到0到99的随机数,然后加上1,得到1到100的随机数。
这里放到game函数而不放在main函数里的原因,是因为放到game函数里,每一场猜数字游戏的开始,都会生成一个新的随机数。
(1) do while与switch使用
?
首先,利用了do while必定先执行一次循环体的特性,先打印一次菜单后判断开始或退出。
将n同时作为第一层switch分支与do while循环的条件,当输入n为0时,既退出了switch分支又退出了do while循环,也就达到了退出游戏的效果。当输入n为1时,开始游戏。当输入的n为switch上没有写的数字时,执行default语句,提示请重新输入,并返回菜单。
system函数包含在stdlib.h文件里,这里的system("cls")是一个清屏的效果。
(1) while与if else使用
我们用变量,也就是机会的次数来限制while循环。然后判断输入的数字是否在1-100里面,如果猜的数字大于随机的数字,那么就告诉我们猜大了,反之,告诉我们猜小了,并减少一次机会。当猜的数字与随机数相等时,告诉我们猜对了。如果次数用完了还是没有猜对,就告诉我们正确的数字并宣告失败。
?
?
?
?
(1) windows.h
在windows.h文件中,使用Sleep函数可以暂停程序的执行一段时间。
?
这里是延迟一秒后清屏的意思。
(2) 改良后的程序
?
?
增加了两个变量,用来控制已知区间的变化,增加了一秒延时清屏,增加了game结束后,是否再来一局的判断。
?
?
?
?
?
?
增加了一个难度(只是一阶段加了个随机数,没有优化),添加了goto语句,当选择模式输入的数字是除了1和2以外的数字时,延迟一秒后,自动跳转到菜单位置。
?
?
?
?
?
?
可以自己想想可以添加什么新的玩法,这里只做了一个如何添加新模式的介绍。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> //调用输入输出
#include <stdlib.h> //调用伪随机数
#include <time.h> //调用时间戳
#include <windows.h> //调用延时
#include "menu.h" //调用菜单与窗口
#include "game.h" //调用游戏内部
int main()
{
int n = 0; //输入开始或退出
int m = 0; //选择模式
srand((unsigned)time(NULL)); //随机数种子
do
{
mu:
menu();
printf("请输入:");
scanf("%d", &n);
system("cls");
switch (n)
{
case 0:break;
case 1:window();
printf("请输入:");
scanf("%d", &m);
system("cls");
switch (m)
{
case 1:game1();
break;
case 2:game2();
break;
case 3:printf("目前暂无此模式,返回菜单");
Sleep(1000);
system("cls");
goto mu;
case 4:printf("目前暂无此模式,返回菜单");
Sleep(1000);
system("cls");
goto mu;;
default:printf("输入错误,返回菜单");
Sleep(1000);
system("cls");
goto mu;
}
break;
default:printf("输入错误,请重新输入\n");
break;
}
printf("是否再来一局(0/1):");
scanf("%d",&n);
system("cls");
} while (n);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include "game.h"
void game1()
{
int i = rand() % 100 + 1; //随机数
int j = 0; //猜的数字
int c = 7; //可以猜的次数
int a = 1, b = 100; //区间
while (c)
{
printf("请从%d-%d中猜数字:",a,b);
scanf("%d", &j);
if (j >= 1 && j <= 100)
{
if (j > i)
{
if(b > j)
b = j;
printf("猜大了\n");
}
else if (j < i)
{
if(a < j)
a = j;
printf("猜小了\n");
}
else
{
printf("恭喜你,猜对了。\n\n");
break;
}
c--;
printf("您还剩%d次机会", c);
}
else
{
printf("输入错误,请重试\n");
}
Sleep(1000);
system("cls");
}
if (c == 0)
{
printf("挑战失败,数字是%d\n\n", i);
}
}
void game2()
{
int i = rand() % 100 + 1; //随机数1
int n = rand() % 100 + 1; //随机数2
int j = 0; //猜的数字1
int m = 0; //猜的数字2
int c = 8; //可以猜的次数
while (c)
{
printf("请输入您猜的两个数字:");
scanf("%d %d", &j, &m);
if (j >= 1 && j <= 100)
{
if (j > i)
{
printf("第一个数字猜大了 ");
}
else if (j < i)
{
printf("第一个数字猜小了 ");
}
else
{
printf("第一个数字猜对了 ");
}
if (m > n)
{
printf("第二个数字猜大了\n");
}
else if (m < n)
{
printf("第二个数字猜小了\n");
}
else
{
printf("第二个数字猜对了\n");
}
if (j == i && m == n)
{
printf("恭喜你,挑战成功。\n\n");
break;
}
c--;
printf("您还剩%d次机会\n", c);
}
else
{
printf("输入错误,请重试\n");
}
}
if (c == 0)
{
printf("\n挑战失败, 第一个数字是%d,第二个数字是%d\n", i, n);
}
}
#ifndef __GAME_H__
#define __GAME_H__
#pragma once
void game1();
void game2();
#endif /* __GAME_H__ */
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "menu.h"
void menu() //菜单
{
printf("----------------------------\n");
printf("| |\n");
printf("| 猜数字小游戏 |\n");
printf("| |\n");
printf("| 1.开始游戏 |\n");
printf("| 0.退出游戏 |\n");
printf("| |\n");
printf("----------------------------\n");
printf(" | | \n");
printf(" | | \n");
printf("----------------------------\n");
}
void window() //难度选择窗口
{
printf("----------------------------\n");
printf("| |\n");
printf("| 1.简单难度 |\n");
printf("| 2.中等难度 |\n");
printf("| 3.困难难度 |\n");
printf("| 4.地狱难度 |\n");
printf("| |\n");
printf("----------------------------\n");
}
这个复制过来后就不正了,可以自己调整一下。
#ifndef __MENU_H__
#define __MENU_H__
#pragma once
void menu();
void window();
#endif /* __MENU_H__ */
猜数字小游戏制作就到这里了,如果文章中有什么话语上的问题,或是程序上的问题,请在评论区中帮忙指出错误的地方,我会及时改正。