基于C語(yǔ)言實(shí)現(xiàn)的迷宮游戲代碼
本文實(shí)例講述了基于C語(yǔ)言實(shí)現(xiàn)迷宮游戲的方法,代碼備有較為詳盡的注釋,便于讀者理解。通過(guò)該游戲代碼可以很好的復(fù)習(xí)C語(yǔ)言的遞歸算法與流程控制等知識(shí),相信對(duì)于學(xué)習(xí)游戲開(kāi)發(fā)的朋友有一定的借鑒價(jià)值。
完整的實(shí)例代碼如下:
#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <dos.h> #define N 20/*迷宮的大小,可改變*/ int oldmap[N][N];/*遞歸用的數(shù)組,用全局變量節(jié)約時(shí)間*/ int yes=0;/*yes是判斷是否找到路的標(biāo)志,1找到,0沒(méi)找到*/ int way[100][2],wayn=0;/*way數(shù)組是顯示路線用的,wayn是統(tǒng)計(jì)走了幾個(gè)格子*/ void Init(void);/*圖形初始化*/ void Close(void);/*圖形關(guān)閉*/ void DrawPeople(int *x,int *y,int n);/*畫人工探索物圖*/ void PeopleFind(int (*x)[N]);/*人工探索*/ void WayCopy(int (*x)[N],int (*y)[N]);/*為了8個(gè)方向的遞歸,把舊迷宮圖拷貝給新數(shù)組*/ int FindWay(int (*x)[N],int i,int j);/*自動(dòng)探索函數(shù)*/ void MapRand(int (*x)[N]);/*隨機(jī)生成迷宮函數(shù)*/ void PrMap(int (*x)[N]);/*輸出迷宮圖函數(shù)*/ void Result(void);/*輸出結(jié)果處理*/ void Find(void);/*成功處理*/ void NotFind(void);/*失敗處理*/ void main(void)/*主函數(shù)*/ { int map[N][N]; /*迷宮數(shù)組*/ char ch; clrscr(); printf("\n Please select hand(1) else auto\n");/*選擇探索方式*/ scanf("%c",&ch); Init(); /*初始化*/ MapRand(map);/*生成迷宮*/ PrMap(map);/*顯示迷宮圖*/ if(ch=='1') PeopleFind(map);/*人工探索*/ else FindWay(map,1,1);/*系統(tǒng)自動(dòng)從下標(biāo)1,1的地方開(kāi)始探索*/ Result();/*輸出結(jié)果*/ Close(); } void Init(void)/*圖形初始化*/ { int gd=DETECT,gm; initgraph(&gd,&gm,"c:\\tc"); } void DrawPeople(int *x,int *y,int n)/*畫人工控制圖*/ {/*如果將以下兩句注釋掉,則顯示人工走過(guò)的路徑,*/ setfillstyle(SOLID_FILL,WHITE); /*設(shè)置白色實(shí)體填充樣式*/ bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)*15+6,50+(*x)*15+6); /*恢復(fù)原通路*/ switch(n)/*判斷x,y的變化,8個(gè)方向的變化*/ { case 1: (*x)--;break; /*上*/ case 2: (*x)--;(*y)++;break ;/*右上*/ case 3: (*y)++;break; /*右*/ case 4: (*x)++;(*y)++;break; /*右下*/ case 5: (*x)++;break; /*下*/ case 6: (*x)++;(*y)--;break; /*左下*/ case 7: (*y)--;break; /*左*/ case 8: (*x)--;(*y)--;break; /*左上*/ } setfillstyle(SOLID_FILL,RED);/*新位置顯示探索物*/ bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)*15+6,50+(*x)*15+6); } void PeopleFind(int (*map)[N])/*人工手動(dòng)查找*/ { int x,y; char c=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個(gè)方向的控制介紹*/ setcolor(YELLOW); outtextxy(420,290,"Press 'Enter' to end");/*壓回車鍵結(jié)束*/ 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();/*接收字符后開(kāi)始各個(gè)方向的探索*/ 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); /*左*/ else if(c=='q'&&map[x-1][y-1]!=1) DrawPeople(&x,&y,8); /*左上*/ } setfillstyle(SOLID_FILL,WHITE); /*消去紅色探索物,恢復(fù)原迷宮圖*/ 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; /*如果成功標(biāo)志為1*/ } void WayCopy(int (*oldmap)[N],int (*map)[N])/*拷貝迷宮數(shù)組 */ { int i,j; for(i=0;i<N;i++) for(j=0;j<N;j++) oldmap[i][j]=map[i][j]; } int FindWay(int (*map)[N],int i,int j)/*遞歸找路*/ { if(i==N-2&&j==N-2)/*走到出口*/ { yes=1;/*標(biāo)志為1,表示成功*/ return; } map[i][j]=1;/*走過(guò)的地方變?yōu)?*/ WayCopy(oldmap,map); /*拷貝迷宮圖*/ if(oldmap[i+1][j+1]==0&&!yes)/*判斷右下方是否可走*/ { FindWay(oldmap,i+1,j+1); if(yes)/*如果到達(dá)出口了,再把值賦給顯示路線的way數(shù)組,也正是這個(gè)原因,所以具體路線是從最后開(kāi)始保存*/ { way[wayn][0]=i; way[wayn++][1]=j; return; } } WayCopy(oldmap,map); if(oldmap[i+1][j]==0&&!yes)/*判斷下方是否可以走,如果標(biāo)志yes已經(jīng)是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; } void MapRand(int (*map)[N])/*開(kāi)始的隨機(jī)迷宮圖*/ { int i,j; cleardevice();/*清屏*/ randomize(); /*隨機(jī)數(shù)發(fā)生器*/ for(i=0;i<N;i++) { for(j=0;j<N;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)/*出發(fā)點(diǎn)與終點(diǎn)表示為可走的*/ map[i][j]=0; else map[i][j]=random(2);/*其它的隨機(jī)生成0或1*/ } } } void PrMap(int (*map)[N])/*輸出迷宮圖*/ { int i,j; for(i=0;i<N;i++) for(j=0;j<N;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);/*藍(lán)色為墻壁*/ bar(100+j*15-6,50+i*15-6,100+j*15+6,50+i*15+6); } } void Find(void)/*找到通路*/ { int i; 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);/*控制顯示時(shí)間*/ } bar(100+(N-2)*15-6,50+(N-2)*15-6,100+ (N-2)*15+6,50+(N-2)*15+6); /*在目標(biāo)點(diǎn)標(biāo)紅色*/ setcolor(GREEN); settextstyle(0,0,2);/*設(shè)置字體大小*/ outtextxy(130,400,"Find a way!"); } void NotFind(void)/*沒(méi)找到通路*/ { setcolor(GREEN); settextstyle(0,0,2);/*設(shè)置字體大小*/ outtextxy(130,400,"Not find a way!"); } void Result(void)/*結(jié)果處理*/ { if(yes)/*如果找到*/ Find(); else/*沒(méi)找到路*/ NotFind(); getch(); } void Close(void)/*圖形關(guān)閉*/ { closegraph(); }
欄 目:C語(yǔ)言
下一篇:C++ Vector用法深入剖析
本文標(biāo)題:基于C語(yǔ)言實(shí)現(xiàn)的迷宮游戲代碼
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3531.html
您可能感興趣的文章
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用函數(shù)刪除字符
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)式函數(shù)庫(kù)
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)數(shù)怎么表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段函數(shù)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排序法函數(shù)
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段函數(shù)
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎么打出三角函數(shù)的值
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求階乘


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 04-02jquery與jsp,用jquery
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開(kāi)原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什