資源簡介
我當初做的C語言的迷宮小游戲,借鑒了一些網友的算法,整體來說感覺還可以,其中實現了簡單的卷屏功能,迷宮的圖隨機產生并用稀疏矩陣的方式存入文件,便于觀察修改,并可提示從當前位置到出口的最短路徑,迷宮地圖大小為300*300,希望對大家有幫助。文件中包括源代碼和課程設計論文。
代碼片段和文件信息
#include?“stdio.h“
#include?“stdlib.h“
#include?“conio.h“
#define?N?300
#define?P?149
#define?Q?149
#define?Max?100000
#define?MAZE_MAX?300
FILE?*?fp;
char?map_in[MAZE_MAX+2][MAZE_MAX+2];
void?Map(int?(*map)[]);
void?PrMap(int?mint?nint?(*map)[]);
void?RuMap(int?(*map)[]);
int?mgpath(int?xiint?yiint?xeint?yeint?(*map)[]);
int?search(int?xint?y);
void?Make_Maze(int?xint?y);
void?FileInMap();
struct
{
??????int?ij;??????????????
??????int?pre;??????????????
}Qu[Max];
/*生成地圖文件*/
/*采用深度優先搜索的方法產生迷宮地圖*/
int?search(int?xint?y)
{
????static?int?d[4][2]={01100-1-10};
????int?zx=x*2zy=y*2nextturni;
????map_in[zx][zy]=0;?turn=rand()%2??1:3;
????for(i=0next=rand()%4;i<4;i++next=(next+turn)%4)
????????if(map_in[zx+2*d[next][0]][zy+2*d[next][1]]==1)???
????????????map_in[zx+d[next][0]][zy+d[next][1]]=0???????
????????????search(x+d[next][0]y+d[next][1]);?????????
????return?0;
}
void?Make_Maze(int?xint?y)
{
????int?z1z2;
????for(z1=0z2=2*y+2;z1<=2*x+2;z1++)?
????????map_in[z1][0]=0map_in[z1][z2]=0;
????
????for(z1=0z2=2*x+2;z1<=2*y+2;z1++)
????????map_in[0][z1]=0map_in[z2][z1]=0;
????????
????map_in[1][2]=0;map_in[2*x+1][2*y]=0;?????
????srand((unsigned)time(NULL));
????search(rand()%x+1rand()%y+1);
}
/*將產生的地圖用稀疏矩陣的方式將可走的坐標存入文件中*/?
void?FileInMap()
{
?????int?xyz1z2;?
?????x?=?P;
?????y?=?Q;
????int?ij;
????for(i=0;?i<=x*2+2;?++i)
????????for(j=0;?j<=y*2+2;?++j)
????????????map_in[i][j]?=?1;
????Make_Maze(x?y);
????if((fp?=?fopen(“map.txt““w“))?==?NULL)
{
printf(“Can?not?write!!\n“);
exit(0);;
}
????for(z2=1;?z2<=y*2+1;?z2++)
????{
????????for(z1=1;z1<=x*2+1;z1++)?
??????{??
?????????? if(map_in[z2][z1]?==?0)
???????????? {
???????????????????????fprintf(fp“%d?%d\n“z2z1);
????????????????}
??????}
????}
????fclose(fp);
}
/*讀入通路坐標并初始化地圖數組*/
void?Map(int?(*map)[N])
{
?????int?ij;
?????FileInMap();
?????for(i?=?0;i?????{
??????????for(j?=?0;j???????????{
????????????????map[i][j]?=?1;
??????????}
????}
????
if((fp?=?fopen(“map.txt““r“))?==?NULL)
{
printf(“Can?not?read?file!!\n“);
system(“pause“);
exit(0);
}
while(!feof(fp))
{
fscanf(fp“%d?%d\n“&i&j);
map[i][j]?=?0;
}
map[1][1]?=?2;??
fclose(fp);
}
/*打印地圖*/
/*實現簡單的卷屏判斷*/
void?PrMap(int?mint?nint?(*map)[N])
{
?????int?m1n1m2n2;
?????int?ij;
?????
?????if(?m?>=?0?&&?m?30){m1?=?0;m2?=?30;}
?????else?if(m?>=?30?&&?m?60){m1?=?30;m2?=?60;}
?????else?if(m?>=?60?&&?m?90){m1?=?60;m2?=?90;}
?????else?if(m?>=?90?&&?m?120){m1?=?90;m2?=?120;}
?????else?if(m?>=?120?&&?m?150){m1?=?120;m2?=?150;}
?????else?if(m?>=?150?&&?m?180){m1?=?150;m2?=?180;}
?????else?if(m?>=?180?&&?m?210){m1?=?180;m2?=?210;}
?????else?if(m?>=?210?&&?m?240){m1?=?210;m2?=?240;}
?????else?if(m?>=?240?&&?m?270){m1?=?240;m2?=?270;}
?????else?if(m?>=?270?&&?m?300){m1?=?270;m2?=?300;}
?????if(?n?>=?0?&&?n?30){n1?=
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????36084??2011-08-16?17:09??09033322王傳寶\開始界面.png
?????文件??????41481??2011-08-16?17:11??09033322王傳寶\提示最短路徑界面.png
?????文件??????54042??2011-08-18?17:07??09033322王傳寶\游戲成功.png
?????文件??????48776??2011-08-16?17:10??09033322王傳寶\游戲界面.png
????I.A....????501822??2011-08-27?08:17??09033322王傳寶\課程設計文檔.doc
?????文件?????367879??2011-08-27?08:17??09033322王傳寶\迷宮游戲程序\map.txt
?????文件???????8788??2011-08-21?12:23??09033322王傳寶\迷宮游戲程序\MiGong.c
?????文件??????22703??2011-08-27?08:17??09033322王傳寶\迷宮游戲程序\MiGong.exe
?????目錄??????????0??2011-08-27?08:17??09033322王傳寶\迷宮游戲程序
?????目錄??????????0??2011-08-27?08:17??09033322王傳寶
-----------?---------??----------?-----??----
??????????????1081575????????????????????10
評論
共有 條評論