设计思路
用一个二维数组来表示整个地图,我们先网上找一张地图来分析下。
分析:地图上有 墙、目的地、箱子、人。可以用数字来在二维数组中对应的标记这些东西,二维数组的大小就是地图的大小。
并加入了计时功能,通过游戏前后获取系统时间,计算二者时间差,差值及为游戏用时,还添加了游戏主界面模块。
#include
#include
int main()
{
time_t timep;
struct tm *p1,*p2;
time(&timep);
p1= gmtime(&timep);
int t,t1,t2;
t1=(p1->tm_hour)6060+(p1->tm_min)*60+(p1->tm_sec);
time(&timep);
//游戏执行函数
p2= gmtime(&timep);
t2=(p2->tm_hour)6060+(p2->tm_min)*60+(p2->tm_sec);
t=t2-t1; // t的值为TIME值
printf(“SCORE:%02d\n”,count);
printf(“TIME:%02d:%02d\n”,t/60,t%60);
return;
}
-----------------------------------------------------------------------------------------------------------------------
while (1) // 主界面模块
{
if(flag)
{
break;
}
printf(" \n");
printf(“请输入选项按回车进入:”);
scanf("%d",&choice);
switch(choice) // 主界面选项判定函数
{
case :
{
system(“cls”);
printf(" \n");
break;
}
-----------------------------------------------------------------------------------------------------------------------
#include
#include
#include
#include
#include
time_t timep;
struct tm *p1,*p2;
int map[10][11] = { //定义地图大小10*11
{0,0,0,0,0,0,0,0,0,0,0},
{1,1,1,1,1,1,1,1,1,1,1}, //0代表空地
{1,1,1,0,0,1,0,0,1,1,1}, //1代表墙
{1,1,0,4,0,1,0,0,0,1,1}, //3代表目的地
{1,1,0,0,0,4,0,0,0,1,1}, //4代表箱子
{1,1,0,4,0,0,1,0,0,0,1}, //5代表人
{1,1,0,1,1,1,1,0,4,0,1},
{1,0,0,8,3,0,0,1,0,0,1},
{1,0,0,3,3,0,0,0,0,1,1},
{1,1,1,1,1,1,1,1,1,1,1} };
void DrawMap() //绘制地图 //二维数组+switch()
{
//遍历二维数组 //0 打印空格 //1 墙 //3 目的地
for (int i = 0;i < 10; i++)
{
for (int j= 0; j < 11; j++)
{ //if else switch
switch(map[i][j])
{
case 0:
printf(" ");
break;
case 1:
printf("■");
break;
case 3:
printf("☆");
break;
case 4:
printf("□");
break;
case 5: //5 人
printf("●");
break;
case 7: //4 + 3 箱子在目的地中
printf("★");
break;
case 8: // 5 + 3 人在目的地当中
printf("●");
break;
}
}
printf("\n");
}
}
void PlayGame()
{
int r, c; //人的下标
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 11;j++)
{
if (map[i][j] ==5||map[i][j]==8) //地图上对应人的下标
{
r = i;
c = j;
}
}
}
char ch; //字符变量
ch = getch(); //getch()键盘的输入保存到字符中
//getchar()接收键盘字符
// getch()直接接收 不显示回文 getchar()显示回文可以修改 enter键结束
//根据不同的按键 改变不同的值、分支.
switch (ch)
{
case 'W': //W A S D方向 72 80 75 77 虚拟键值 ascii windowVK_UP VK_TAB VK_RETUNE
case 'w':
case 72:
if (map[r - 1][c] == 0||map[r - 1][c] == 3)
{
map[r - 1][c] += 5;
map[r][c] -= 5;
}
else if (map[r - 1][c] == 4|| map[r - 1][c] == 7)
{
if (map[r - 2][c] == 0|| map[r - 2][c] == 3)
{
map[r - 2][c] += 4;
map[r - 1][c] += 1;
map[r][c] -= 5;
}
}
break;
case 'S':
case 's':
case 80:
if (map[r + 1][c] == 0 ||map[r + 1][c] == 3)
{
map[r + 1][c] += 5;
map[r][c] -= 5;
}
else if (map[r + 1][c] == 4|| map[r+ 1][c] == 7)
{
if (map[r + 2][c] == 0|| map[r + 2][c] == 3)
{
map[r + 2][c] += 4;
map[r + 1][c] += 1;
map[r][c] -= 5;
}
}
break;
case 'A':
case 'a':
case 75:
if (map[r ][c - 1] == 0 ||map[r ][c - 1] == 3)
{
map[r ][c - 1] += 5;
map[r][c] -= 5;
}
else if (map[r][c - 1] == 4|| map[r][c - 1] == 7)
{
if (map[r ][c - 2] == 0|| map[r ][c - 2] == 3)
{
map[r ][c - 2] += 4;
map[r ][c - 1] += 1;
map[r][c] -= 5;
}
}
break;
case 'D':
case 'd':
case 77:
if (map[r][c + 1] == 0 ||map[r][c + 1] == 3)
{
map[r][c + 1] += 5;
map[r][c] -= 5;
}
else if (map[r][c + 1] == 4|| map[r][c + 1] == 7)
{
if (map[r][c + 2] == 0|| map[r][c + 2] == 3)
{
map[r][c + 2] += 4;
map[r][c + 1] += 1;
map[r][c] -= 5;
}
}
break;
}
}
int main() //主函数
{
int a;
time(&timep); //获取系统时间
p1= gmtime(&timep); //获取游戏开始前系统时间
int choice,num,flag=0;
while (1)
{
if(flag)
{
break;
}
printf(" \n"); //打印主界面
printf(" 欢迎来到推箱子!!!\n\n");
printf(" 1. 游戏说明\n\n");
printf(" 2. 开始游戏\n\n");
printf(" 3. 退出游戏\n\n");
printf("请输入选项按回车进入:");
scanf("%d",&choice);
switch(choice) //主界面选项选择语句
{
case 1: //1. 游戏说明
{
system("cls");
printf(" \n");
printf(" 地图中有四个箱子和四个目的地,玩家\n");
printf("通过控制地图上人物的移动来推动箱子,每\n");
printf("个箱子没有指定的目的地,只要箱子进入目\n");
printf("的地就可以得两分,玩家需将四个箱子全部\n");
printf("推进目的地才算通关,中途没有悔棋,每个\n");
printf("关卡只有一次机会!!!\n");
printf("\n");
printf(" ■----------墙\n");
printf(" ☆----------目的地\n");
printf(" □----------箱子\n");
printf(" ●----------人物\n");
printf(" ★----------箱子推进目的地\n");
printf("\n");
printf("输入1按回车返回主菜单:");
scanf("%d",&a);
{
if(a==1)
system("cls");
main(); //调用主函数实现主菜单界面的返回
}
break;
}
case 2: //2. 开始游戏
{
while (1)
{
int a;
int t,t1,t2;
int count = 0;
system("cls");
t1=(p1->tm_hour)*60*60+(p1->tm_min)*60+(p1->tm_sec); //获取的系统时间化成秒,方便后面计算时间差值
DrawMap(); //调用地图生成函数
printf(" \n");
printf("SCORE:%02d\r",count); //得分打印
if(map[7][3]==7||map[8][3]==7||map[7][4]==7||map[8][4]==7) //只有一个箱子推进目的地
{
count=count+2; //得分加2
printf("SCORE:%02d\r",count);
}
if((map[7][3]==7&&map[8][3]==7)||(map[7][3]==7&&map[7][4]==7)||(map[7][3]==7&&map[8][4]==7)||(map[8][3]==7&&map[7][4]==7)||(map[8][3]==7&&map[8][4]==7)||(map[7][4]==7&&map[8][4]==7)) //两个箱子推进目的地
{
count=count+2;
printf("SCORE:%02d\r",count);
}
if((map[7][3]==7&&map[8][3]==7&&map[7][4]==7)||(map[7][3]==7&&map[8][3]==7&&map[8][4]==7)||(map[7][3]==7&&map[7][4]==7&&map[8][4]==7)||(map[7][4]==7&&map[8][4]==7&&map[8][3]==7)) //三个箱子推进目的地
{
count=count+2;
printf("SCORE:%02d\r",count);
}
if(map[7][3]==7&&map[8][3]==7&&map[7][4]==7&&map[8][4]==7) //所有箱子推进目的地
{
count=count+2;
printf(" ====GAME OVER!!====\n");
printf(" \n");
time(&timep);
p2= gmtime(&timep); //获取游戏结束后系统时间
t2=(p2->tm_hour)*60*60+(p2->tm_min)*60+(p2->tm_sec);
t=t2-t1; //计算通关游戏所需时间
printf("SCORE:%02d\n",count);
printf("TIME:%02d:%02d\n",t/60,t%60);
printf(" \n");
printf("输入1按回车返回主菜单:");
scanf("%d",&a);
{
if(a==1)
system("cls");
main();
break;
}
}
PlayGame(); //调用函数
}
break;
}
case 3:
{
system("cls");
flag=1;
break;
}
}
}
return 0;
}
-----------------------------------------------------------------------------------------------------------------------
游戏菜单主界面截图
-----------------------------------------------------------------------------------------------------------------------
“1. 游戏说明” 选项页面截图
-----------------------------------------------------------------------------------------------------------------------
“2. 开始游戏” 选项页面截图
推进一个箱子以及得分
推进两个箱子以及得分
推进三个箱子以及得分
推进全部箱子以总得分及用时
-----------------------------------------------------------------------------------------------------------------------