本节必须掌握的知识点:
项目需求
示例二十八
综合实战,本小节将我们之前介绍的所有知识点结合在了一起,其目的就为了告诉大家,学了这么长时间的C语言了,我们可以做一些有趣的小游戏了。
7.6.1 项目需求
■游戏界面
写一个主界面,如下图7-7所示:
图7-7 游戏主界面
如果我们选择1,则出现图7-8游戏加载界面:
图7-8 游戏加载界面
如果选择2,则退出程序。
加载完成后进入游戏主界面,如图7-9游戏主界面:
图7-9 游戏界面
打开了游戏主界面,笔者一共准备了2个游戏,如果输入1则可以进入猜数字的游戏界面;如果选择2,则进入打地鼠游戏的界面;如果选择3,则退出程序。
■猜数字游戏规则:
猜数字游戏规则:系统通过使用随机函数(rand())产生一个数字,该数字在0~10之间。如果猜小了,则输出小了;如果猜大了,则输出大了;如果猜对了,则输出猜对了。
如果猜的次数等于10次,则游戏结束。
■打地鼠游戏规则:
首先生成一张地图,3行3列共9个老鼠洞,使用随机函数老鼠在9个洞里跑,通过输入x、y坐标来判断我们有没有打中老鼠,如果打中,则输出“Boom”打中了;如果没打中,则继续。
7.6.2 示例二十八
示例代码二十八
这里不再将代码一行行分析了,因为每行代码后面都有注释,且每行代码读者都能看懂。希望读者在看代码之前,能自己动手写一下,多锻炼自己的动手能力。
/*
猜数字和打地鼠游戏
*/
#include <stdio.h> //输入输出头文件
#include <stdlib.h> //工具库头文件(随机函数)
#include <windows.h>//windows操作系统头文件(Sleep函数)
#include <time.h> //time函数头文件获取系统时间
int main(void)
{
agining1:
printf("\t\t 欢迎来到游戏世界!\n");
printf("\t\t是否进入选择游戏界面:\n\t\t\t是请输入1;\n\t\t\t否请输入2;\n");
int option_enter = 0;//选择是否进入界面
scanf_s("%d", &option_enter);
switch (option_enter)
{
case 1://输入1 进入
{
printf("\n\n您选择的是进入游戏界面\n");
printf("请您耐心等待,界面加载中");
for (int i = 0; i < 15; i++) //加载进度条
{
printf(" □");
Sleep(100);//延迟100毫秒
}
system("CLS");//清屏
//
Sleep(500);//延迟500毫秒
agining2:
printf("\t\t 游戏主界面 \n");
printf("\t\t 1、猜数字\n");
printf("\t\t 2、打地鼠\n");
printf("\t\t 3、退出\n");
int option_game = 0;//选择要玩的游戏
printf("\t\t 请输入您要玩的游戏编号:\n");
scanf_s("%d", &option_game);
switch (option_game)
{
case 1:
{
system("CLS");//清屏,清理之前屏幕上的痕迹
agining31: ;//magic猜的数字,rangNum生成的随机数
int magic, rangNum, i, count
i = 0;
count = 0;
srand((unsigned int)time(NULL));//以当前系统时间为随机种子
rangNum = rand() % 10 + 1;//生成1~10之间的随机数
agin:
printf("请输入您猜的数字(1~10):"); i++;
scanf_s("%d", &magic);
for (; i <= 10; )
{
count++;
if (magic == rangNum)//如果相等输出结果,并退出程序
{
printf("恭喜猜对了!");
printf("magic = %d rangNum = %d\n", magic,rangNum);
system("PAUSE");
break;
}
//如果猜的次数大于随机数且猜的次数小于等于9次了则进入下轮猜数字游戏
if ((magic > rangNum) && i <= 9)
{
printf("大了!\n继续");
goto agin;
}
//如果猜的次数大于随机数 且猜的次数等于10次了则介结束游戏
if ((magic > rangNum) && i == 10)
{
printf("大了!");
goto end;
}
//如果猜的次数小于随机数且猜的次数小于等于9次了则进入下轮猜数字游戏
if ((magic < rangNum) && i <= 9)
{
printf("小了!\n继续");
goto agin;
}
//如果猜的次数小于随机数 且猜的次数等于10次了则介结束游戏
if ((magic < rangNum) && i == 10)
{
printf("小了!\n继续");
goto end;
}
end:
printf("猜了%d轮", count);
if (count >= 10) //猜数的次数大于等于10次则退出游戏
{
printf("GameOver!");
}
}
//Sleep(500);
system("CLS");//清屏
printf("是否返回游戏主界面:\t是请输入1;\t否请输入4;\n");
printf("是否返回游戏界面:\t是请输入2;\t否请输入4;\n");
printf("重玩此游戏,请输入3:");
int option_agin = 0;
scanf_s("%d", &option_agin);
switch (option_agin)
{
case 1:
{
system("CLS");//清屏
goto agining1;
break;
}
case 2:
{
system("CLS");//清屏
goto agining2;
break;
}
case 3:
{
system("CLS");//清屏
goto agining31;
break;
}
default:
{
exit(0);
break;
}
}
break;
}
case 2:
{
system("CLS");//清屏
agining32:
int times;//游戏的次数
int mousex = 0;//老鼠的X轴坐标
int mousey = 0;//老鼠的Y轴坐标
int posx = 0;//锤子的X轴坐标
int posy = 0;//锤子的Y轴坐标
int hits = 0;//统计击中老鼠的次数
int missed = 0;//统计击错的次数
int i, row, col;//循环打老鼠效果的变量
//1、九个老鼠洞以及打老鼠的次数
srand((unsigned int)time(0));//随机种子
printf("□□□\n□□□\n□□□\n");
printf("请输入打老鼠的次数:\n");
scanf_s("%d", ×);
//2.循环多次打老鼠的效果
for (i = 1; i <= times; i++)
{
//老鼠的随机坐标
mousex = rand() % 3 + 1;//老鼠的X轴坐标从1-3的随机数
mousey = rand() % 3 + 1;//老鼠的Y轴坐标从1-3的随机数
//判断锤子的使用范围
do
{
printf("请输入锤子的坐标:\n");
scanf_s("%d%d", &posx, &posy);
} while (posx < 1 || posx>3 || posy < 1 || posy>3);
//判断锤子和老鼠的坐标是否一致
if (mousex == posx && mousey == posy)//击中老鼠
hits++;
else
missed++;
//循环打印地图
for (row = 1; row <= 3; row++)
{
for (col = 1; col <= 3; col++)
{
if (row == posy && col == posx)//锤子的坐标
printf("■");
//老鼠的坐标
else if (row == mousey && col == mousex)
printf("@");
else
printf("□");
}
printf("\n");
}
if (mousey == posy && mousex == posx) {
printf("Boom,打中老鼠了!\n");
}
else {
printf("Sorry,没有打中\n");
}
//打印总成绩
printf("打中%d次,错过%d次\n", hits, missed);
system("pause");
}
system("CLS");//清屏
printf("是否返回游戏主界面:\t是请输入1;\t否请输入4;\n");
printf("是否返回游戏界面:\t是请输入2;\t否请输入4;\n");
printf("重玩此游戏,请输入3:");
int option_agin = 0;
scanf_s("%d", &option_agin);
switch (option_agin)
{
case 1:
{
system("CLS");//清屏
goto agining1;
break;
}
case 2:
{
system("CLS");//清屏
goto agining2;
break;
}
case 3:
{
system("CLS");//清屏
goto agining32;
break;
}
default:
{
exit(0);
break;
}
}
break;
}
default:
{
exit(0);//退出程序
}
}
break;
}
default://输入其他退出
{
exit(0);//退出
break;
}
}
system("pause");
return 0;
}
图7-10 猜数字游戏
图7-11 打地鼠游戏
练习
使用汇编语言完成示例二十八,并进行反汇编代码分析。