迷宮游戲控制臺(tái)版C++代碼
本文實(shí)例分享了C++設(shè)計(jì)的一個(gè)可以調(diào)整大小的迷宮游戲,給定迷宮的入口。如果存在出口,程序能夠顯示行走的路徑,并最終到達(dá)出口,并輸出“成功走出迷宮”;如果不存在出口,程序也能夠顯示行走的過程,并最終回退到入口,并輸出“回退到入口”。
//這是一個(gè)迷宮游戲
#include<iostream>
#include<ctime>
#include<cstdlib>/*用于生成隨機(jī)數(shù),形成隨機(jī)變化的迷宮*/
#include<iomanip>/*用于輸出格式控制,使得生成的迷宮外觀規(guī)則*/
using namespace std;
/*生成迷宮的函數(shù)mazegenerator*/
char*mazegenerator(int m,int n)
{
int i,j,k;/*計(jì)數(shù)器*/
char *p=new char[m*n];/*用長(zhǎng)度為m*n的數(shù)組存放mxn大小的迷宮*/
srand(int(time(0)));/*用于生成隨機(jī)數(shù)*/
if(m<10||n<10)//階數(shù)小的時(shí)候密一點(diǎn),增加趣味
for(i=0;i<m*n;i++)
{
if(rand()%3==0)p[i]='.';//隨機(jī)數(shù)為三的倍數(shù)時(shí),把迷宮中該點(diǎn)定義為通路
else p[i]='#';
}
else
for(i=0;i<m*n;i++)
{
if(rand()%2==0)p[i]='.';/*隨機(jī)數(shù)為偶數(shù)時(shí),把迷宮中該點(diǎn)定義為通路*/
else p[i]='#';
}
/*把左邊界和上邊界全部封住,只留一個(gè)入口,只能從右邊界和下邊界走出,
讓走出迷宮更有挑戰(zhàn)性*/
for(i=0;i<m;i++)
p[i]='#';
for(i=0;i<m*n;i+=m)
p[i]='#';
for(i=m-1;i<m*n;i+=m)
p[i]='#';
for(i=m*(n-1);i<m*n;i++)
p[i]='#';
/*接下來把前3階構(gòu)造為T字型*/
p[0]=p[1]=p[2]=p[2*m]=p[2*m+2]='#';
p[m+1]=p[m+2]=p[2*m+1]='.';
/*迷宮入口定義為'x'*/
p[m]='x';
/*迷宮是隨機(jī)的,需要構(gòu)造一條通路*/
/*這是一條每三格轉(zhuǎn)一次的通路*/
for(j=3;j<m;j+=3)
{
for(k=0;k<3;k++)
{
i=(j-3)+k+1;
if(i*m+j<m*n)
p[i*m+j]='.';
}
}
for(i=4;i<m;i+=3)
for(k=0;k<3;k++)
{
j=(i-3)+k+2;
if(i*m+j<m*n)
p[i*m+j]='.';
}
return p;
}
/*生成或修改迷宮后都需要輸出新的迷宮*/
void showmaze(char*p,int m,int n)
{
int i,j;/*i代表行,j代表列,i*n+j是那個(gè)點(diǎn)在數(shù)組中的序號(hào)*/
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
cout<<setw(2)<<p[i*m+j];/*每個(gè)字符占兩個(gè)使得迷宮方正*/
cout<<endl;
}
}
/*走迷宮函數(shù)mazetraverse*/
void mazetraverse(char*p,int m,int n)
{
int x,y,z;/*y是當(dāng)前位置,x是前一步,z是后一步,t用于輸入繼續(xù)走迷宮的指令*/
/*初始化x,y,即迷宮入口的位置*/
x=m;
y=m+1;
p[y]='x';/*這是迷宮的第一步*/
cout<<"請(qǐng)按回車鍵移動(dòng):";/*讓用戶控制走迷宮的進(jìn)程*/
cin.get();
cout<<endl;
showmaze(p,m,n);/*輸出走后的迷宮*/
cout<<endl;
cout<<"請(qǐng)按回車鍵移動(dòng): ";
cin.get();
/*關(guān)鍵在于用x,y確定z的值*/
while(!((y>m*(n-1))||(((y+1)%m)==0)))/*到達(dá)邊界之前執(zhí)行循環(huán)走迷宮*/
{
/*判斷右的方向,如果右為'.',則向右走*/
if(y-x==1)z=y+m;
if(y-x==m)z=y-1;
if(y-x==-m)z=y+1;
if(y-x==-1)z=y-m;
/*右不為'.'時(shí),向y的前方走*/
if(p[z]=='#')
{
/*判斷y的前方,如果前為'.',則向前走*/
if(y-x==1)z=y+1;
if(y-x==m)z=y+m;
if(y-x==-m)z=y-m;
if(y-x==-1)z=y-1;
/*如果前方為'#',要向左走*/
if(p[z]=='#')
{
/*判斷左的位置*/
if(y-x==1)z=y-m;
if(y-x==m)z=y+1;
if(y-x==-m)z=y-1;
if(y-x==-1)z=y+m;
/*如果左為'#',為死路,需要向后走*/
if(p[z]=='#')z=x;
}
}
p[z]='x';/*最后都要讓z的位置為'x',表示走過的痕跡*/
showmaze(p,m,n);
cout<<endl;
cout<<"請(qǐng)按回車鍵移動(dòng): ";
cin.get();
cout<<endl;
/*替換x,y實(shí)現(xiàn)當(dāng)前位置的移動(dòng)*/
x=y;
y=z;
}
}
int main()
{
int m,n;/*n是迷宮的階數(shù),由于輸出窗口大小的限制,
n不能大于每行所能顯示的字符個(gè)數(shù)*/
cout<<" 陳偉航的迷宮游戲\n我的迷宮可是很整潔的哦!^_^\n"<<endl;
cout<<"這是一個(gè)可任意選擇大小的迷宮,"<<endl;
cout<<"每次生成的迷宮都不同。\n"<<endl;
cout<<"因?yàn)槠聊灰淮巫疃囡@示80個(gè)字符,\n這里每個(gè)字符又占兩格,"<<endl
<<"所以輸入超過40階就不好看啦,\n雖然它還是對(duì)的。哈哈\n"<<endl;
cout<<"請(qǐng)依次輸入迷宮的寬度m和高度n(m>2,n>2):"<<endl;
/*可以進(jìn)行多組數(shù)據(jù)的測(cè)試*/
while(cin>>m>>n)
{
char*a=mazegenerator(m,n);
showmaze(a,m,n);
cout<<endl;
cout<<"萬(wàn)里長(zhǎng)征第一步:\n"<<endl;
mazetraverse(a,m,n);
cout<<"恭喜你!你已成功走出迷宮!"<<endl<<endl;
cout<<"如要嘗試新的迷宮,請(qǐng)輸入新迷宮的階數(shù)n(n>2),\n否則,按ctrl+z,再按enter結(jié)束"<<endl;
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:c語(yǔ)言 sscanf,scanf,fscanf正則表達(dá)式用法
欄 目:C語(yǔ)言
下一篇:C++設(shè)計(jì)模式之備忘錄模式(Memento)
本文標(biāo)題:迷宮游戲控制臺(tái)版C++代碼
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/820.html
您可能感興趣的文章
- 01-10C語(yǔ)言游戲必備:光標(biāo)定位與顏色設(shè)置的實(shí)現(xiàn)方法
- 01-10c語(yǔ)言在控制臺(tái)判定鼠標(biāo)左鍵的小例子
- 01-10Eclipse對(duì)printf()不能輸出到控制臺(tái)的快速解決方法
- 01-10vc6.0中c語(yǔ)言控制臺(tái)程序中的定時(shí)技術(shù)(定時(shí)器)
- 01-10C語(yǔ)言的數(shù)字游戲算法效率問題探討實(shí)例
- 01-10linux下實(shí)現(xiàn)的2048游戲示例分享
- 01-10win32 api實(shí)現(xiàn)2048游戲示例
- 01-10C語(yǔ)言借助EasyX實(shí)現(xiàn)的生命游戲源碼
- 01-10C++ 實(shí)現(xiàn)2048游戲示例
- 01-10C++實(shí)現(xiàn)迷宮算法實(shí)例解析


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dā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ǔ)言沒有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ī)閱讀
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 04-02jquery與jsp,用jquery
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文


