C语言课程设计迷宫游戏.docx

上传人:b****6 文档编号:7405388 上传时间:2023-01-23 格式:DOCX 页数:12 大小:35.11KB
下载 相关 举报
C语言课程设计迷宫游戏.docx_第1页
第1页 / 共12页
C语言课程设计迷宫游戏.docx_第2页
第2页 / 共12页
C语言课程设计迷宫游戏.docx_第3页
第3页 / 共12页
C语言课程设计迷宫游戏.docx_第4页
第4页 / 共12页
C语言课程设计迷宫游戏.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

C语言课程设计迷宫游戏.docx

《C语言课程设计迷宫游戏.docx》由会员分享,可在线阅读,更多相关《C语言课程设计迷宫游戏.docx(12页珍藏版)》请在冰豆网上搜索。

C语言课程设计迷宫游戏.docx

C语言课程设计迷宫游戏

C语言课程设计-迷宫游戏

设计报告

题目:

完整的二维迷宫游戏

学院:

工商管理学院

专业:

信息系统与信息管理

班级:

050507

姓名:

孙月

指导教师:

张首伟

设计日期:

2004年12月10日

题目:

完整的二维迷宫游戏

一、选题背景:

问题的提出:

我们在玩迷宫游戏的时候,常常在过了一关之后就结束了~这里设计的迷宫游戏足够多~难以程度也不尽相同~可以过瘾的玩。

模仿的有那么一点意思~还请多多指教:

二、设计思想:

1,.问题描述

用一个m行n列的二维数组来表示迷宫。

数组中每个元素的取值为0或1~其中值0表示通路~值1表示阻塞~入口在左上方,1~1,处~出口在右下方,m,n,处~如图所示。

要求求出从迷宫入口到出口有无通路~若有通路则指出其中一条通路的路径~即输出找到通路的迷宫数组~其中通路上的“0”用另一数字,例如8,替换~同时打印出所走通路径上每一步的位置坐标及下一步的方向。

2,(求解方法说明:

1(为使问题一般化~假设以二维数组maze(1:

m,1:

n)表示迷宫~并设maze(i,j)表示任一位置。

2(对每个位置maze(i,j)~可移动的八个方向从正东起顺时

针方向顺序为:

E~SE~S~SW~W~NW~N~NE。

再用一个二维数组move表示这八个方向上坐标的增量~如下表所示~move(v,1)表示第v个方向上i的增量,move(v,2)表示第v个方向上j的增量。

三、程序流程图

四、程序清单:

一、

二、

#include

#include

#include

#include

#include

#defineN20/*迷宫的大小~可改变*/

intoldmap[N][N];/*递归用的数组,用全局变量节约时间*/intyes=0;/*yes是判断是否找到路的标志,1找到~0没找到*/intway[100][2],wayn=0;/*way数组是显示路线用的,wayn是统计走了几个格子*/

voidInit(void);/*图形初始化*/

voidClose(void);/*图形关闭*/

voidDrawPeople(int*x,int*y,intn);/*画人工探索物图*/voidPeopleFind(int(*x)[N]);/*人工探索*/

voidWayCopy(int(*x)[N],int(*y)[N]);/*为了8个方向的递归~把旧迷宫图拷贝给新数组*/

intFindWay(int(*x)[N],inti,intj);/*自动探索函数*/voidMapRand(int(*x)[N]);/*随机生成迷宫函数*/

voidPrMap(int(*x)[N]);/*输出迷宫图函数*/voidResult(void);/*输出结果处理*/

voidFind(void);/*成功处理*/

voidNotFind(void);/*失败处理*/

voidmain(void)/*主函数*/

{

intmap[N][N];/*迷宫数组*/

charch;

clrscr();

printf("\nPleaseselecthand

(1)elseauto\n");/*选择探索方式*/

scanf("%c",&ch);

Init();/*初始化*/

MapRand(map);/*生成迷宫*/

PrMap(map);/*显示迷宫图*/

if(ch=='1')

PeopleFind(map);/*人工探索*/

else

FindWay(map,1,1);/*系统自动从下标1,1的地方开始探索*/

Result();/*输出结果*/

Close();

}

voidInit(void)/*图形初始化*/

{

intgd=DETECT,gm;

initgraph(&gd,&gm,"c:

\\tc");}

voidDrawPeople(int*x,int*y,intn)/*画人工控制图*/{/*如果将以下两句注释掉~则显示人工走过的路径~*/

setfillstyle(SOLID_FILL,WHITE);/*设置白色实体填充样式*/

bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)*15+6,50+(*x)*15+6);

/*恢复原通路*/

switch(n)/*判断x,y的变化~8个方向的变化*/

{

case1:

(*x)--;break;/*上*/

case2:

(*x)--;(*y)++;break;/*右上*/

case3:

(*y)++;break;/*右*/

case4:

(*x)++;(*y)++;break;/*右下*/

case5:

(*x)++;break;/*下*/

case6:

(*x)++;(*y)--;break;/*左下*/

case7:

(*y)--;break;/*左*/

case8:

(*x)--;(*y)--;break;/*左上*/

}

setfillstyle(SOLID_FILL,RED);/*新位置显示探索物*/

bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)*15+6,50+(*x)*15+6);

}

voidPeopleFind(int(*map)[N])/*人工手动查找*/{

intx,y;

charc=0;/*接收按键的变量*/

x=y=1;/*人工查找的初始位置*/

setcolor(11);

line(500,200,550,200);

outtextxy(570,197,"d");

line(500,200,450,200);

outtextxy(430,197,"a");

line(500,200,500,150);

outtextxy(497,130,"w");

line(500,200,500,250);

outtextxy(497,270,"x");

line(500,200,450,150);

outtextxy(445,130,"q");

line(500,200,550,150);

outtextxy(550,130,"e");

line(500,200,450,250);

outtextxy(445,270,"z");

line(500,200,550,250);

outtextxy(550,270,"c");/*以上是画8个方向的控制介绍*/

setcolor(YELLOW);

outtextxy(420,290,"Press'Enter'toend");/*压回车键结束*/

setfillstyle(SOLID_FILL,RED);

bar(100+y*15-6,50+x*15-6,100+y*15+6,50+x*15+6);/*入口位置显示*/

while(c!

=13)/*如果按下的不是回车键*/

{

c=getch();/*接收字符后开始各个方向的探索*/

if(c=='w'&&map[x-1][y]!

=1)

DrawPeople(&x,&y,1);/*上*/

else

if(c=='e'&&map[x-1][y+1]!

=1)

DrawPeople(&x,&y,2);/*右上*/

else

if(c=='d'&&map[x][y+1]!

=1)

DrawPeople(&x,&y,3);/*右*/

else

if(c=='c'&&map[x+1][y+1]!

=1)

DrawPeople(&x,&y,4);/*右下*/

else

if(c=='x'&&map[x+1][y]!

=1)

DrawPeople(&x,&y,5);/*下*/

else

if(c=='z'&&map[x+1][y-1]!

=1)

DrawPeople(&x,&y,6);/*左下*/

else

if(c=='a'&&map[x][y-1]!

=1)

DrawPeople(&x,&y,7);/*左*/

elseif(c=='q'&&map[x-1][y-1]!

=1)

DrawPeople(&x,&y,8);/*左上*/

}

setfillstyle(SOLID_FILL,WHITE);/*消去红色探索物~恢复原迷宫图*/

bar(100+y*15-6,50+x*15-6,100+y*15+6,50+x*15+6);

if(x==N-2&&y==N-2)/*人工控制找成功的话*/

yes=1;/*如果成功标志为1*/

}

voidWayCopy(int(*oldmap)[N],int(*map)[N])/*拷贝迷宫数组*/{

inti,j;

for(i=0;i

for(j=0;j

oldmap[i][j]=map[i][j];}

intFindWay(int(*map)[N],inti,intj)/*递归找路*/

{

if(i==N-2&&j==N-2)/*走到出口*/

{

yes=1;/*标志为1,表示成功*/

return;

}

map[i][j]=1;/*走过的地方变为1*/

WayCopy(oldmap,map);/*拷贝迷宫图*/

if(oldmap[i+1][j+1]==0&&!

yes)/*判断右下方是否可走*/

{

FindWay(oldmap,i+1,j+1);

if(yes)/*如果到达出口了~再把值赋给显示路线的way数组,也正是这个

原因,所以具体路线是从最后开始保存*/

{

way[wayn][0]=i;

way[wayn++][1]=j;

return;

}

}

WayCopy(oldmap,map);

if(oldmap[i+1][j]==0&&!

yes)/*判断下方是否可以走,如果标志yes已经是

1也不用找下去了*/

{

FindWay(oldmap,i+1,j);

if(yes)

{

way[wayn][0]=i;

way[wayn++][1]=j;

return;

}

}

WayCopy(oldmap,map);

if(oldmap[i][j+1]==0&&!

yes)/*判断右方是否可以走*/

{

FindWay(oldmap,i,j+1);

if(yes)

{

way[wayn][0]=i;

way[wayn++][1]=j;

return;

}

}

WayCopy(oldmap,map);

if(oldmap[i-1][j]==0&&!

yes)/*判断上方是否可以走*/

{

FindWay(oldmap,i-1,j);

if(yes)

{

way[wayn][0]=i;

way[wayn++][1]=j;

return;

}

}

WayCopy(oldmap,map);

if(oldmap[i-1][j+1]==0&&!

yes)/*判断右上方是否可以走*/

{

FindWay(oldmap,i-1,j+1);

if(yes)

{

way[wayn][0]=i;

way[wayn++][1]=j;

return;

}

}

WayCopy(oldmap,map);

if(oldmap[i+1][j-1]==0&&!

yes)/*判断左下方是否可以走*/

{

FindWay(oldmap,i+1,j-1);

if(yes)

{

way[wayn][0]=i;

way[wayn++][1]=j;

return;

}

}

WayCopy(oldmap,map);

if(oldmap[i][j-1]==0&&!

yes)/*判断左方是否可以走*/

{

FindWay(oldmap,i,j-1);

if(yes)

{

way[wayn][0]=i;

way[wayn++][1]=j;

return;

}

}

WayCopy(oldmap,map);

if(oldmap[i-1][j-1]==0&&!

yes)/*判断左上方是否可以走*/

{

FindWay(oldmap,i-1,j-1);

if(yes)

{

way[wayn][0]=i;

way[wayn++][1]=j;

return;

}

}

return;

}

voidMapRand(int(*map)[N])/*开始的随机迷宫图*/{

inti,j;

cleardevice();/*清屏*/

randomize();/*随机数发生器*/

for(i=0;i

{

for(j=0;j

{

if(i==0||i==N-1||j==0||j==N-1)/*最外面一圈为墙壁*/

map[i][j]=1;

else

if(i==1&&j==1||i==N-2&&j==N-2)/*出发点与终点表示为可走的

*/

map[i][j]=0;

else

map[i][j]=random

(2);/*其它的随机生成0或1*/

}

}

}

voidPrMap(int(*map)[N])/*输出迷宫图*/{

inti,j;

for(i=0;i

for(j=0;j

if(map[i][j]==0)

{

setfillstyle(SOLID_FILL,WHITE);/*白色为可走的路*/

bar(100+j*15-6,50+i*15-6,100+j*15+6,50+i*15+6);

}

else

{

setfillstyle(SOLID_FILL,BLUE);/*蓝色为墙壁*/

bar(100+j*15-6,50+i*15-6,100+j*15+6,50+i*15+6);

}

}

voidFind(void)/*找到通路*/

{

inti;

setfillstyle(SOLID_FILL,RED);/*红色输出走的具体路线*/

wayn--;

for(i=wayn;i>=0;i--)

{

bar(100+way[i][1]*15-6,50+way[i][0]*15-6,100+

way[i][1]*15+6,50+way[i][0]*15+6);

sleep

(1);/*控制显示时间*/

}

bar(100+(N-2)*15-6,50+(N-2)*15-6,100+

(N-2)*15+6,50+(N-2)*15+6);/*在目标点标红色*/

setcolor(GREEN);

settextstyle(0,0,2);/*设置字体大小*/

outtextxy(130,400,"Findaway!

");

}

voidNotFind(void)/*没找到通路*/{

setcolor(GREEN);

settextstyle(0,0,2);/*设置字体大小*/

outtextxy(130,400,"Notfindaway!

");

}

voidResult(void)/*结果处理*/{

if(yes)/*如果找到*/

Find();

else/*没找到路*/

NotFind();

getch();

}

voidClose(void)/*图形关闭*/{

closegraph();}

五、主要解决问题的方法及技术关键1、主要问题及解决方法

路径实现问题

用函数实现路径光标的移动~是随系统设计可行性而走

的.

光标的移动处理问题

光标的移动处理是通过intkey(intkey,intcount)

函数定义~再通过up,down等函数对光标实行移动!

2、技术关键

迷宫路线的制作

移动轨迹光标的实现

路径走向的决定键的选择与编译

六、设计结果说明

1,设计优点:

本程序简单明了~应用方便~运用了简单的C语言~用户可以很容易的进行游戏。

而且游戏难易程度由简单到高难~有很好的娱乐性。

2,设计缺点:

程序过于冗长繁琐~游戏内容比较单一。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1