中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

迷宮游戲控制臺版C++代碼

發布時間:2020-09-19 02:21:14 來源:腳本之家 閱讀:214 作者:夢里茶 欄目:編程語言

本文實例分享了C++設計的一個可以調整大小的迷宮游戲,給定迷宮的入口。如果存在出口,程序能夠顯示行走的路徑,并最終到達出口,并輸出“成功走出迷宮”;如果不存在出口,程序也能夠顯示行走的過程,并最終回退到入口,并輸出“回退到入口”。

//這是一個迷宮游戲
#include<iostream>
#include<ctime>
#include<cstdlib>/*用于生成隨機數,形成隨機變化的迷宮*/
#include<iomanip>/*用于輸出格式控制,使得生成的迷宮外觀規則*/
using namespace std;
/*生成迷宮的函數mazegenerator*/
char*mazegenerator(int m,int n)
{
 int i,j,k;/*計數器*/
 char *p=new char[m*n];/*用長度為m*n的數組存放mxn大小的迷宮*/
 srand(int(time(0)));/*用于生成隨機數*/
 if(m<10||n<10)//階數小的時候密一點,增加趣味
 for(i=0;i<m*n;i++)
 {
 if(rand()%3==0)p[i]='.';//隨機數為三的倍數時,把迷宮中該點定義為通路
 else p[i]='#';
 }
 else
 for(i=0;i<m*n;i++)
 {
 if(rand()%2==0)p[i]='.';/*隨機數為偶數時,把迷宮中該點定義為通路*/
 else p[i]='#';
 }
 /*把左邊界和上邊界全部封住,只留一個入口,只能從右邊界和下邊界走出,
 讓走出迷宮更有挑戰性*/
 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階構造為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';
 /*迷宮是隨機的,需要構造一條通路*/
 /*這是一條每三格轉一次的通路*/
 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是那個點在數組中的序號*/
 for(i=0;i<n;i++)
 {
 for(j=0;j<m;j++)
 cout<<setw(2)<<p[i*m+j];/*每個字符占兩個使得迷宮方正*/
 cout<<endl;
 }
}
/*走迷宮函數mazetraverse*/
void mazetraverse(char*p,int m,int n)
{
 int x,y,z;/*y是當前位置,x是前一步,z是后一步,t用于輸入繼續走迷宮的指令*/
 /*初始化x,y,即迷宮入口的位置*/
 x=m;
 y=m+1;
 p[y]='x';/*這是迷宮的第一步*/
 cout<<"請按回車鍵移動:";/*讓用戶控制走迷宮的進程*/
 cin.get();
 cout<<endl;
 showmaze(p,m,n);/*輸出走后的迷宮*/
 cout<<endl;
 cout<<"請按回車鍵移動: ";
 cin.get();
 /*關鍵在于用x,y確定z的值*/
 while(!((y>m*(n-1))||(((y+1)%m)==0)))/*到達邊界之前執行循環走迷宮*/
 {
 /*判斷右的方向,如果右為'.',則向右走*/
 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;
 /*右不為'.'時,向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<<"請按回車鍵移動: ";
 cin.get();
 cout<<endl;
 /*替換x,y實現當前位置的移動*/
 x=y;
 y=z;
 }
}
int main()
{
 int m,n;/*n是迷宮的階數,由于輸出窗口大小的限制,
 n不能大于每行所能顯示的字符個數*/
 cout<<" 陳偉航的迷宮游戲\n我的迷宮可是很整潔的哦!^_^\n"<<endl;
 cout<<"這是一個可任意選擇大小的迷宮,"<<endl;
 cout<<"每次生成的迷宮都不同。\n"<<endl;
 cout<<"因為屏幕一次最多顯示80個字符,\n這里每個字符又占兩格,"<<endl
 <<"所以輸入超過40階就不好看啦,\n雖然它還是對的。哈哈\n"<<endl;
 cout<<"請依次輸入迷宮的寬度m和高度n(m>2,n>2):"<<endl;
 /*可以進行多組數據的測試*/
 while(cin>>m>>n)
 {
 char*a=mazegenerator(m,n);
 showmaze(a,m,n);
 cout<<endl;
 cout<<"萬里長征第一步:\n"<<endl;
 mazetraverse(a,m,n);
 cout<<"恭喜你!你已成功走出迷宮!"<<endl<<endl;
 cout<<"如要嘗試新的迷宮,請輸入新迷宮的階數n(n>2),\n否則,按ctrl+z,再按enter結束"<<endl;
 }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长春市| 鄱阳县| 武安市| 清远市| 和田市| 云浮市| 全州县| 彭阳县| 卓资县| 西安市| 柞水县| 颍上县| 美姑县| 姚安县| 白水县| 抚远县| 甘孜| 莲花县| 云龙县| 姚安县| 凤翔县| 留坝县| 盐源县| 太湖县| 登封市| 吴桥县| 乌兰浩特市| 建昌县| 汤原县| 永登县| 临泽县| 九龙县| 绥化市| 仁寿县| 绥芬河市| 邯郸市| 鹤壁市| 阿荣旗| 余江县| 丰都县| 三门县|