一. 实验目的及实验环境
1、实验目的:理解和掌握C语言中函数的定义,参数的使用,函数调用的方法;学习通过功能分解来设计和编写较复杂程序的方法。
2、实验环境:Windows 8.1,Visual C++
二. 实验内容
设计并编写一个走迷宫的游戏,从入口进入寻找通路走到出口,判定胜利。
三.方案设计
该游戏具有的一些特点:
游戏界面
1. 游戏有简洁,美观的界面,界面间可以切换
2. 界面菜单中项目的可以按键选择进入,游戏有多种模式可供玩家选择。
3. 迷宫的地图可以电脑随机生成,并且道路尽可能的复杂。
4. 玩家也可以选择根据自己的想法手动建造迷宫,建造完成后可以让好友进行试走,增强游戏的可玩性
四.数据测试
1.随机地图:
电脑随机给出一个迷宫地图,让迷宫尽可能的复杂,使地图更加神秘,吸引玩家的兴趣,让玩家全身心的投入其中去探索,进而发现其中的乐趣。
但是随机地图会存在一个不容忽视的问题,那就是产生的地图可能无法走通,因为对于随机地图,系统不会检查它产生的一些错误,这可能会给玩家增加难度,让玩家失去耐心。
2.手动建造地图:
手动建造地图可以最大限度的发挥玩家的想象力,然玩家自己深入游戏中,增强玩家的思维能力。
最主要的是,手动建造迷宫避免了随机产生地图存在的不能走通的问题,避免了BUG的产生。
五.总结
1.实验过程中遇到的问题
实验过程中遇到的主要问题是如何实现迷宫地图的随机生成,以及如何让星号移动。
2.对设计及调试过程的心得体会
a. 当程序过长,或需要多个功能时,可以针对每个功能自定义函数,最后需要时,只要主函数直接调用即可,很方便,而且易于读写,容易修改,并且大大减少了变量的数据,程序易于控制。
b. 体会到了各种头文件的用处,以及全局变量和局部变量在程序中的作用。
六. 附 录
核心源代码:
int a=0;b=1;
char s[21][47];
Inputs()
{
int i,j,n;
srand((unsigned)time(NULL));
for(i=0;i<21;i++)
{
for(j=0;j<46;j++)
s[i][j]=' ';
s[i][j]=0;
}
for(n=0;n<470;n++)
{
i=rand()%100;
j=rand()%100;
if(i>20||j>=46)
{
n--;
continue;
}
s[i][j]='X';
}
for(i=0;i<21;i++)
{
s[i][0]=' ';
s[i][45]=' ';
}
s[a][b]=2;
s[0][0]=26;
s[20][45]=26;
}
Outputs()
{
int i,j;
printf("\n");
for(i=0;i<21;i++)
{
for(j=0;j<46;j++)
printf("%c",s[i][j]);
printf("\n");
}
}
Madeit()
{
int i,j;
for(i=0;i<21;i++)
{
for(j=0;j<46;j++)
s[i][j]='X';
s[i][j]=0;
}
for(i=0;i<21;i++)
{
s[i][0]=' ';
s[i][45]=' ';
}
s[a][b]=2;
s[0][0]=26;
s[20][45]=26;
}
fun()
{
printf("*********************\n");
}
main()
{
int a1,b1,e;
char c,d;
printf("欢迎进入迷宫游戏!\n");
fun();
printf(" 1.开始游戏\n");
printf(" 2.退出游戏\n");
fun();
printf("【直接按相应序号选择功能】\n");
scanf("%d",&a1);
system("cls");
switch(a1)
{
case 1:fun();
printf("1.随机生成迷宫地图\n");
printf("2.手动建造迷宫地图\n");
fun();
scanf("%d",&b1);
system("cls");
switch(b1)
{
case 1:
Inputs();
Outputs();
while(a!=20 || b!=45)
{
printf("\n\n\npress w to up\npress a to left\npress s to down\npress d to right\n");
c=getch();
switch(c)
{
case 'w':a--;
if(a<0)
a=0;
else
{
if(s[a][b]!='X')
{
s[a][b]=2;
s[a+1][b]=' ';
}
else
a++;
}
break;
case 'a':b--;
if(b<0)
b=0;
else
{
if(s[a][b]!='X')
{
s[a][b]=2;
s[a][b+1]=' ';
}
else
b++;
}
break;
case 's':a++;
if(a>20)
a=20;
else
{
if(s[a][b]!='X')
{
s[a][b]=2;
s[a-1][b]=' ';
}
else
a--;
}
break;
case 'd':b++;
if(b>45)
b=45;
else
{
if(s[a][b]!='X')
{
s[a][b]=2;
s[a][b-1]=' ';
}
else
b--;
}
break;
}
system("cls");
Outputs();
}
printf("\n You win\n");
break;
case 2:
Madeit();
Outputs();
while(a!=20||b!=45)
{
printf("\n\n\npress w to up\npress a to left\npress s to down\npress d to right\n");
c=getch();
switch(c)
{
case 'w':a--;
if(a<0)
a=0;
else
{
s[a][b]=2;
s[a+1][b]=' ';
}
break;
case 'a':b--;
if(b<0)
b=0;
else
{
s[a][b]=2;
s[a][b+1]=' ';
}
break;
case 's':a++;
if(a>20)
a=20;
else
{
s[a][b]=2;
s[a-1][b]=' ';
}
break;
case 'd':b++;
if(b>45)
b=45;
else
{
s[a][b]=2;
s[a][b-1]=' ';
}
break;
}
system("cls");
Outputs();
}
printf("\n\n 建造完成!\n\n");
fun();
printf(" 1.重走迷宫\n");
printf(" 2.退出游戏\n");
fun();
scanf("%d",&e);
system("cls");
switch(e)
{
case 1:a=0,b=1;
s[a][b]=2;
s[0][0]=26;
s[20][45]=26;
Outputs();
while(a!=20 || b!=45)
{
printf("\n\n\npress w to up\npress a to left\npress s to down\npress d to right\n");
d=getch();
switch(d)
{
case 'w':a--;
if(a<0)
a=0;
else
{
if(s[a][b]!='X')
{
s[a][b]=2;
s[a+1][b]=' ';
}
else
a++;
}
break;
case 'a':b--;
if(b<0)
b=0;
else
{
if(s[a][b]!='X')
{
s[a][b]=2;
s[a][b+1]=' ';
}
else
b++;
}
break;
case 's':a++;
if(a>20)
a=20;
else
{
if(s[a][b]!='X')
{
s[a][b]=2;
s[a-1][b]=' ';
}
else
a--;
}
break;
case'd':b++;
if(b>45)
b=45;
else
{
if(s[a][b]!='X')
{
s[a][b]=2;
s[a][b-1]=' ';
}
else
b--;
}
break;
}
system("cls");
Outputs();
}
printf("\n You win\n");
break;
case 2:
return 0;
}
}
case 2:
return 0;
}
return 0;
}