前言与概述
本文章讲述如何通过C语言开发一款猜数字的小游戏,开发这款小游戏会让你在学习编程道路上获得更多成就感和快乐。
程序功能
①:文字从两端向中间汇聚的欢迎界面
②:输入密码登录游戏
③:简约美观的游戏主界面
④:深挖猜数字游戏背后运行逻辑
⑤:丰富多样的程序功能
⑥:无限次数的游戏体验
欢迎界面
代码功能:
为了给用户更好的游戏体验,可以在游戏开始之前,简单的制作一个欢迎界面。
示例代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
int main()
{
char welcome[] = "welcome to guess number game !!!";
char replace[] = "********************************";
int left = 0;
int right = strlen(replace) - 1;
while (left <= right)
{
replace[left] = welcome[left];
replace[right] = welcome[right];
printf("%s", replace);
Sleep(500);
system("cls");
left = left + 1;
right = right - 1;
}
printf("%s", replace);
return 0;
}
模拟运行:
代码分析:
首先,定义两个字符串数组,一个字符串数组用于记录将要输出的原语句,另一个字符串数组是一堆星号,用于实现文字替换。接着,定义left变量储存数组左边下标,定义right变量储存数组右边下标。然后,每当变量left的值小于等于变量right的值时,就进入while循环。将welcome数组中变量left的值(下标)访问的元素赋予replace数组中变量left的值(下标)访问的元素,再将welcome数组中变量right的值(下标)访问的元素赋予replace数组中变量right的值(下标)访问的元素,从而实现文字替换。以字符串的形式打印数组replace的所有元素。并休息500毫秒、清空屏幕。调整变量left的值(加一)、变量right的值(减一)。再返回条件表达式,如果条件成立,进入循环语句块,条件不成立,离开循环语句。当循环语句结束后,以字符串的形式打印数组replace的所有元素。
补充说明:
1.strlen()函数,用于输出字符串的长度,头文件是string.h
2.数组总长度减一就是数组最后元素的下标
3.变量left的值小于变量right的值说明数组中还有元素没有替换,变量left的值等于变量right的值说明数组中所有元素完成替换。
4.Sleep()函数用于暂停程序的运行,单位毫秒,在代码中,Sleep(500);表示暂停程序运行0.5秒。其头文件是windows.h
5.system(“cls”);用于清空屏幕上所有内容,其头文件是stdlib.h
密码正确进入游戏
代码功能:
用户有三次输入密码的机会,如果三次都输入错误就会退出游戏,密码输错,程序会提示“密码错误”。只有密码正确,才可以进入游戏。
默认密码:123456
示例代码:
#include <string.h>
#include <stdio.h>
int main()
{
int count = 0;
printf("请输入登录密码:\n");
char password[] = { 0 };
for (count = 1; count <= 3; count++)
{
scanf("%s", password);
if (strcmp(password, "123456") == 0)
{
printf("密码正确,正在登陆游戏……\n");
break;
}
else {
printf("密码错误!\n");
}
}
if (count > 3)
{
printf("连续三次密码输入错误,退出游戏!\n");
goto end;
}
end:
return 0;
}
模拟运行:
代码分析:
strcmp()函数用于比较两个字符串的大小(实际上比较的是两个字符串ASCII码值的大小),如果两个字符串相等,返回0;如果第一个字符串大,返回>0的值;相反,返回<0的值。其头文件是string.h
设计游戏主界面
示例代码:
#include <stdio.h>
void menu()
{
printf("*************************\n");
printf("******输入1开始游戏******\n");
printf("******输入0退出游戏******\n");
printf("******输入2关闭电脑******\n");
printf("*************************\n");
}
int main()
{
menu();
return 0;
}
模拟运行:
游戏运行逻辑
代码功能:
设计一个game函数,由计算机生成一个随机数,让用户猜测。如果用户猜的数比随机数大,就告诉用户“你猜的数大了”,如果用户猜的数比随机数小,就告诉用户“你猜的数小了”。如果用户猜的数等于这个随机数,就告诉用户“恭喜你,猜对了!”,并告诉用户使用多少次机会猜对。
示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void game()
{
int times = 0;
int number = rand() % 100 + 1;
int guess = 0;
printf("现有一个1-100的数,请猜测它:\n");
while (guess != number)
{
printf("请输入你猜测的数:\n");
scanf("%d", &guess);
times = times + 1;
if (guess > number)
{
printf("你猜的数大了\n");
}
else if (guess < number)
{
printf("你猜的数小了\n");
}
else {
printf("恭喜了!猜对了!\n");
printf("你只用%d次就猜对了正确答案,超过了百分之九十九的玩家!\n", times);
break;
}
}
}
int main()
{
srand(time(0));
game();
return 0;
}
运行结果:
代码分析:
如何生成随机数?
C语言提供了rand函数用于生成随机数,但rand函数单独使用,生成的是伪随机数(多次生成的随机数是相同的)。于是需要调用srand()函数,使用srand()函数需要整型数字作为种子。通过特殊的算法将这个整型数字转换为随机数。但如果种子不变,生成的随机数也是相同的。于是,需要一个时刻都在变化的整型数字作为种子。时间戳就是时刻变化的数字。它是当前时间与计算机开始时间的时间差。time(0)用于获取当前时间的时间戳。srand(time(0))只需要调用一次即可,快速多次调用,会导致生成的随机数相近甚至相同。
补充说明:
- %100可以将生成的随机数控制在0~99,如果+1,生成的随机数范围就在1-100。
- rand()函数和srand()函数的头文件是stdlib.h time()函数的头文件是time.h
关机程序实现
代码功能:
当用户玩累了,想休息一会,需要关闭计算机。通过此代码,可以实现快速关机,当然用户也可以通过输入提示语句取消关机。
示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char del[] = { 0 };
system("shutdown -s -t 60");
printf("输入\"open\"可以取消关机命令\n");
scanf("%s", del);
if (strcmp(del, "open") == 0)
{
system("shutdown -a");
}
return 0;
}
代码分析:
system("shutdown -s -t 60");用于在1分钟后关闭计算机,-s表示执行关机操作,-t表示设置指定时间关机,单位秒。 system("shutdown -a");用于取消关机命令。
用户交互平台
代码功能:
让用户输入一个数字,如果输入1就进入游戏,输入0就退出程序,输入2就执行关机命令,输入其它数字,就提示输入错误,并要求重新输入数字。当用户玩完一局游戏后,可以重新选择。
示例代码:
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1:
{
game();
break;
}
case 2:
{
system("shutdown -s -t 60");
printf("输入\"open\"可以取消关机命令\n");
scanf("%s", del);
if (strcmp(del, "open") == 0)
{
system("shutdown -a");
}
break;
}
case 0:
{
printf("正在退出游戏,请稍后……\n");
break;
}
default:
{
printf("输入错误,请重新输入!\n");
break;
}
}
} while (input);
代码分析:
本代码,使用do while循环语句,循环条件是用户输入的值。switch-case语句用于根据用户输入的值进入相应的语句块。程序运行会先进入menu函数,并等待用户输入数字,如果输入1,进入game()函数,输入0,循环条件不成立,退出程序,输入2,进入关机命令,并输出提示语句。输入其它数字、再次输入1会再次进入menu函数,并等待用户输入数字。
源代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
//定义游戏主界面
void menu()
{
printf("*************************\n");
printf("******输入1开始游戏******\n");
printf("******输入0退出游戏******\n");
printf("******输入2关闭电脑******\n");
printf("*************************\n");
}
//定义游戏运行逻辑
void game()
{
int times = 0;
int number = rand() % 100 + 1;
int guess = 0;
printf("现有一个1-100的数,请猜测它:\n");
while (guess != number)
{
printf("请输入你猜测的数:\n");
scanf("%d", &guess);
times = times + 1;
if (guess > number)
{
printf("你猜的数大了\n");
}
else if (guess < number)
{
printf("你猜的数小了\n");
}
else {
printf("恭喜了!猜对了!\n");
printf("你只用%d次就猜对了正确答案,超过了百分之九十九的玩家!\n", times);
break;
}
}
}
int main()
{
int input = 0;
char del[] = { 0 };
int count = 0;
srand(time(0));
//定义欢迎界面
char welcome[] = "Welcome to guess number game!!!";
char replace[] = "*******************************";
int left = 0;
int right = strlen(replace) - 1;
while (left <= right)
{
replace[left] = welcome[left];
replace[right] = welcome[right];
printf("%s", replace);
Sleep(500);
system("cls");
left = left + 1;
right = right - 1;
}
printf("%s\n", replace);
//登录信息判断
printf("请输入登录密码:\n");
char password[] = { 0 };
for (count = 1; count <= 3; count++)
{
scanf("%s", password);
if (strcmp(password, "123456") == 0)
{
printf("密码正确,正在登陆游戏……\n");
break;
}
else {
printf("密码错误!\n");
}
}
if (count > 3)
{
printf("连续三次密码输入错误,退出游戏!\n");
goto end;
}
//用户选择功能
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1:
{
game();
break;
}
case 2:
{
system("shutdown -s -t 60");
printf("输入\"open\"可以取消关机命令\n");
scanf("%s", del);
if (strcmp(del, "open") == 0)
{
system("shutdown -a");
}
break;
}
case 0:
{
printf("正在退出游戏,请稍后……\n");
break;
}
default:
{
printf("输入错误,请重新输入!\n");
break;
}
}
} while (input);
end:
return 0;
}