最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++控制臺(tái)實(shí)現(xiàn)隨機(jī)生成路徑迷宮游戲

 更新時(shí)間:2020年03月19日 15:19:25   作者:qq125480341  
這篇文章主要為大家詳細(xì)介紹了C++控制臺(tái)實(shí)現(xiàn)隨機(jī)生成路徑迷宮游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本程序是在控制臺(tái)下隨機(jī)生成迷宮路徑的一個(gè)C++程序,可以通過(guò)修改宏定義 M 和 N 的值來(lái)修改迷宮的長(zhǎng)度和寬度,運(yùn)行程序后 按1開(kāi)始游戲 按2退出游戲,游戲入口在左上角,出口在右下角,人物(星星)到達(dá)右下角出口提示成功闖關(guān)。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<iostream.h>
#include<ctime>
#include <windows.h>

#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77

#define M 40 //迷宮長(zhǎng)度
#define N 82 //迷宮寬度

char maze[M/2][N/2]; //定義迷宮數(shù)組
char path[M-1][N-1]; //定義路徑數(shù)組

void setview(void); //設(shè)置控制臺(tái)窗口信息
int menu_maze(void); //主目錄
void startgame(void); //開(kāi)始游戲
void init_maze(void); //初始化迷宮
void gotoxy(int x, int y); //移動(dòng)光標(biāo)
void path_up(int *x, int *y); //上構(gòu)路徑
void path_down(int *x, int *y); //下構(gòu)路徑
void path_left(int *x, int *y); //左構(gòu)路徑
void path_right(int *x, int *y); //右構(gòu)路徑
void setxy(int x, int y); //指定位打通路徑
void path_local(int x, int y); //本置路徑
void go_up(int *x,int *y); //向上移動(dòng)
void go_down(int *x,int *y); //向下移動(dòng)
void go_left(int *x,int *y); //向左移動(dòng)
void go_right(int *x,int *y); //向右移動(dòng)
void HideCursor(void); //隱藏光標(biāo)
void win(void);

int T;
int F;
int m;
int n;
int x;
int target;
int flag;
int local_x;
int local_y;

void main()
{
 setview();
 while(1)
 {
 switch(menu_maze())
 {
 case 49:
 system("cls");
 startgame();
 continue;
 case 50:exit(0);
 }
 }
}

void setview()
{
 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); // 獲取標(biāo)準(zhǔn)輸出設(shè)備句柄
 COORD size = {N*2+167, M*2+43};
 SetConsoleScreenBufferSize(hOut,size); //設(shè)置控制臺(tái)窗口緩沖區(qū)大小 
 SMALL_RECT rc = {0,0,167,43};
 SetConsoleWindowInfo(hOut,true ,&rc); //設(shè)置窗口位置和大小

 SetConsoleTitle("迷宮"); //設(shè)置窗口標(biāo)題

 HideCursor(); //隱藏光標(biāo)
}

int menu_maze(void)
{
 char c;
 while(!(c>48&&c<51))
 {
 system("cls");
 printf("\n\n\n\n\n\n\n\n");
 printf("  ………………^歡迎使用DOS迷宮游戲^……………\n");
 printf("  *******************************************\n");
 printf("  **************** 1.開(kāi)始游戲****************\n");
 printf("  **************** 2.退出游戲****************\n");
 printf("  *******************************************\n");
 c=getch();
 }
 return c;    
}

void startgame()    
{ 
 char key;
 local_x=0;
 local_y=0;
 system("cls");
 init_maze();
 gotoxy(2,2);
 printf("★");
 while(path[M-2][N-2]!='o')
 {
 key=getch();
 if(key==-32)
 {
 key=getch();
 switch(key)
 {
 case UP:
 if(path[local_x-1][local_y]!='t'&&path[local_x-1][local_y]!='o'||local_x-1<0) break; //路徑不通或越界
 go_up(&local_x,&local_y);
 break;
 case DOWN:
 if(path[local_x+1][local_y]!='t'&&path[local_x+1][local_y]!='o'||local_x+1>M-2) break;
 go_down(&local_x,&local_y);
 break;
 case LEFT:
 if(path[local_x][local_y-1]!='t'&&path[local_x][local_y-1]!='o'||local_y-1<0) break;
 go_left(&local_x,&local_y);
 break;
 case RIGHT:
 if(path[local_x][local_y+1]!='t'&&path[local_x][local_y+1]!='o'||local_y+1>N-2) break;
 go_right(&local_x,&local_y);
 break;
 }
 }
 }
 system("cls");
 win();
}

void init_maze()
{
 int i,j;

 T=1;
 F=1;
 m=0;
 n=0;
 x=0;
 flag=0;

 srand((unsigned)time(NULL));

 for(i=0;i<M/2;i++) //初始化迷宮數(shù)組
 {
 for(j=0;j<N/2;j++)
 maze[i][j]='f';
 }

 for(i=0;i<M-1;i++) //初始化路徑數(shù)組
 {
 for(j=0;j<N-1;j++)
 path[i][j]='f';
 }
 path[0][0]='t';

 for(i=0;i<N+1;i++) //邊框
 cout<<"**";
 cout<<endl;
 for(i=0;i<M+1;i++)
 {
 for(j=0;j<N+1;j++)
 {
 cout<<"■";
 }
 cout<<endl;
 
 }
 for(i=0;i<N+1;i++)
 cout<<"**";
 cout<<endl;

 while(F)//構(gòu)建迷宮
 {
 if(T==0)
 {
 for(j=0;j<N/2;j++)
 {
 for(i=0;i<M/2;i++)
 {
 if(maze[i][j]=='f')
 {
 m=i;
 n=j;
 maze[m][n]='t';
 path_local(m,n);
 if(maze[m-1][n]==maze[0][0]) //向上有未打通路徑
 {
 path_up(&m,&n);
 m=i;
 n=j;
 flag--;
 break;
 }
 if(maze[m+1][n]==maze[0][0]) //向下有未打通路徑
 {
 path_down(&m,&n);
 m=i;
 n=j;
 flag--;
 break;
 }
 if(maze[m][n-1]==maze[0][0]) //向左有未打通路徑
 {
 path_left(&m,&n);
 m=i;
 n=j;
 flag--;
 break;
 }
 if(maze[m][n+1]==maze[0][0]) //向右有未打通路徑
 {
 path_right(&m,&n);
 m=i;
 n=j;
 flag--;
 break;
 }
 }
 }
 if(m==i&&n==j)
 break;
 }
 }
 T=1;
 while(T)
 {
 x++;
 if(m==0&&n==0)//光標(biāo)在起始位置
 {
 maze[m][n]='t';
 path_local(m,n);
 switch(rand()%2)
 {
 case 0://向下
 path_down(&m,&n);
 break;
 case 1://向右
 path_right(&m,&n);
 }
 }
 if(m==M/2-1&&n==0)//光標(biāo)在左下角
 {
 switch(rand()%2)
 {
 case 0://向上
 if(maze[m-1][n]==maze[0][0]) break; //已打通路徑
 path_up(&m,&n);
 break;
 case 1://向右
 if(maze[m][n+1]==maze[0][0]) break;
 path_right(&m,&n);
 }
 }
 if(m==0&&n==N/2-1)//光標(biāo)在右上角
 {
 switch(rand()%2)
 {
 case 0://向下
 if(maze[m+1][n]==maze[0][0]) break;
 path_down(&m,&n);
 break;
 case 1://向左
 if(maze[m][n-1]==maze[0][0]) break;
 path_left(&m,&n);
 break;
 }
 }
 if(m==M/2-1&&n==N/2-1)//光標(biāo)在右下角
 {
 switch(rand()%2)
 {
 case 0://向上
 if(maze[m-1][n]==maze[0][0]) break;
 path_up(&m,&n);
 break;
 case 1://向左
 if(maze[m][n-1]==maze[0][0]) break;
 path_left(&m,&n);
 break;
 }
 }
 if(m==0&&n!=0&&n!=N/2-1)//光標(biāo)在第一行
 {
 switch(rand()%3)
 {
 case 0://向下
 if(maze[m+1][n]==maze[0][0]) break;
 path_down(&m,&n);
 break;
 case 1://向左
 if(maze[m][n-1]==maze[0][0]) break;
 path_left(&m,&n);
 break;
 case 2://向右
 if(maze[m][n+1]==maze[0][0]) break;
 path_right(&m,&n);
 }
 }
 if(m!=0&&m!=M/2-1&&n==0)//光標(biāo)在第一列
 {
 switch(rand()%3)
 {
 
 case 0://向上
 if(maze[m-1][n]==maze[0][0]) break;
 path_up(&m,&n);
 break;
 case 1://向下
 if(maze[m+1][n]==maze[0][0]) break;
 path_down(&m,&n);
 break;
 case 2://向右
 if(maze[m][n+1]==maze[0][0]) break;
 path_right(&m,&n);
 }
 }
 if(m==M/2-1&&n!=0&&n!=N/2-1)//光標(biāo)在最后一行
 {
 switch(rand()%3)
 {
 case 0://向上
 if(maze[m-1][n]==maze[0][0]) break;
 path_up(&m,&n);
 break;
 case 1://向左
 if(maze[m][n-1]==maze[0][0]) break;
 path_left(&m,&n);
 break;
 case 2://向右
 if(maze[m][n+1]==maze[0][0]) break;
 path_right(&m,&n);
 }
 }
 if(m!=0&&m!=M/2-1&&n==N/2-1)//光標(biāo)在最后一列
 {
 switch(rand()%3)
 {
 case 0://向上
 if(maze[m-1][n]==maze[0][0]) break;
 path_up(&m,&n);
 break;
 case 1://向下
 if(maze[m+1][n]==maze[0][0]) break;
 path_down(&m,&n);
 break;
 case 2://向左
 if(maze[m][n-1]==maze[0][0]) break;
 path_left(&m,&n);
 }
 }
 if(m!=0&&m!=M/2-1&&n!=0&&n!=N/2-1)//光標(biāo)在中間部分
 {
 switch(rand()%4)
 {
 case 0://向上
 if(maze[m-1][n]==maze[0][0]) break;
 path_up(&m,&n);
 break;
 case 1://向下
 if(maze[m+1][n]==maze[0][0]) break;
 path_down(&m,&n);
 break;
 case 2://向左
 if(maze[m][n-1]==maze[0][0]) break;
 path_left(&m,&n);
 break;
 case 3://向右
 if(maze[m][n+1]==maze[0][0]) break;
 path_right(&m,&n);
 }
 }
 if(x>M*N/4)
 {
 x=0;
 if(m==0&&n==0&&maze[m][n+1]==maze[0][0]&&maze[m+1][n]==maze[0][0]) T=0;//初始位置死路
 if(m==0&&n==N/2-1&&maze[m][n-1]==maze[0][0]&&maze[m+1][n]==maze[0][0]) T=0;//右上角死路
 if(m==M/2-1&&n==0&&maze[m][n+1]==maze[0][0]&&maze[m-1][n]==maze[0][0]) T=0;//左下角死路
 if(m==M/2-1&&n==N/2-1&&maze[m][n-1]==maze[0][0]&&maze[m-1][n]==maze[0][0]) T=0;//終點(diǎn)死路
 if(m==0&&n!=0&&n!=N/2-1&&maze[m][n-1]==maze[0][0]&&maze[m][n+1]==maze[0][0]&&maze[m+1][n]==maze[0][0]) T=0;//第一行死路
 if(m!=0&&m!=M/2-1&&n==0&&maze[m-1][n]==maze[0][0]&&maze[m][n+1]==maze[0][0]&&maze[m+1][n]==maze[0][0]) T=0;//第一列死路
 if(m!=0&&m!=M/2-1&&n==N/2-1&&maze[m-1][n]==maze[0][0]&&maze[m][n-1]==maze[0][0]&&maze[m+1][n]==maze[0][0]) T=0;//最后一列死路
 if(m==M/2-1&&n!=0&&n!=N/2-1&&maze[m-1][n]==maze[0][0]&&maze[m][n+1]==maze[0][0]&&maze[m][n-1]==maze[0][0]) T=0;//最后一行死路
 if(m>0&&m<M/2-1&&n>0&&n<N/2-1&&maze[m+1][n]==maze[0][0]&&maze[m-1][n]==maze[0][0]&&maze[m][n+1]==maze[0][0]&&maze[m][n-1]==maze[0][0]) T=0;//中間部分死路
 }
 }
 if(flag==M*N/4)
 F=0;
 }
/* i=M+3;
 gotoxy(0,i);
 for(i=0;i<M-1;i++)
 {
 for(j=0;j<N-1;j++)
 {
 if(path[i][j]=='f')
 printf("1");
 if(path[i][j]=='t')
 printf("0");
 }
 printf("\n");
 }
 getch();*/
}

void gotoxy(int x, int y)
{
COORD pos = {x,y};
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOut, pos);
}

void path_up(int *x, int *y)
{
 int i,j;
 maze[--(*x)][*y]=maze[0][0];
 path[2*(*x+1)-1][2*(*y)]=path[0][0];
 path_local(*x,*y);
 i=4*(*y)+2;
 j=2*(*x)+3;
 gotoxy(i,j);
 printf(" ");
}

void path_down(int *x, int *y)
{
 int i,j;
 maze[++(*x)][*y]=maze[0][0];
 path[2*(*x-1)+1][2*(*y)]=path[0][0];
 path_local(*x,*y);
 i=4*(*y)+2;
 j=2*(*x)+1;
 gotoxy(i,j);
 printf(" ");
}
 
void path_left(int *x, int *y)
{
 int i,j;
 maze[*x][--(*y)]=maze[0][0];
 path[2*(*x)][2*(*y+1)-1]=path[0][0];
 path_local(*x,*y);
 i=4*(*y)+4;
 j=2*(*x)+2;
 gotoxy(i,j);
 printf(" ");
}

void path_right(int *x, int *y)
{
 int i,j;
 maze[*x][++(*y)]=maze[0][0];
 path[2*(*x)][2*(*y-1)+1]=path[0][0];
 path_local(*x,*y);
 i=4*(*y);
 j=2*(*x)+2;
 gotoxy(i,j);
 printf(" ");
}

void setxy(int x, int y)
{
 gotoxy(x,y);
 printf(" ");
}

void path_local(int x, int y)
{
 int i,j;
 i=4*y+2;
 j=2*x+2;
 gotoxy(i,j);
 printf(" ");
 path[2*x][2*y]=path[0][0];
 flag++;
}

void go_up(int *x,int *y)
{
 int i,j;
 i=2*(*y)+2;
 j=(*x)+2;
 gotoxy(i,j);
 printf(" ");
 j-=1;
 gotoxy(i,j);
 printf("★");
 (*x)--;
 path[*x][*y]='o';
}

void go_down(int *x,int *y)
{
 int i,j;
 i=2*(*y)+2;
 j=(*x)+2;
 gotoxy(i,j);
 printf(" ");
 j+=1;
 gotoxy(i,j);
 printf("★");
 (*x)++;
 path[*x][*y]='o';
}
void go_left(int *x,int *y)
{
 int i,j;
 i=2*(*y)+2;
 j=(*x)+2;
 gotoxy(i,j);
 printf(" ");
 i-=2;
 gotoxy(i,j);
 printf("★");
 (*y)--;
 path[*x][*y]='o';
}

void go_right(int *x,int *y)
{
 int i,j;
 i=2*(*y)+2;
 j=(*x)+2;
 gotoxy(i,j);
 printf(" ");
 i+=2;
 gotoxy(i,j);
 printf("★");
 (*y)++;
 path[*x][*y]='o';
}

void HideCursor()
{
CONSOLE_CURSOR_INFO cursor_info = {1, 0}; 
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

void win()
{
 printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
 "          恭喜你,成功了!");
 getch();
}


以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

  • C++實(shí)現(xiàn)LeetCode(121.買(mǎi)賣(mài)股票的最佳時(shí)間)

    C++實(shí)現(xiàn)LeetCode(121.買(mǎi)賣(mài)股票的最佳時(shí)間)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(121.買(mǎi)賣(mài)股票的最佳時(shí)間),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語(yǔ)言以數(shù)據(jù)塊的形式讀寫(xiě)文件實(shí)例代碼

    C語(yǔ)言以數(shù)據(jù)塊的形式讀寫(xiě)文件實(shí)例代碼

    本文主要介紹C語(yǔ)言中以數(shù)據(jù)塊的形式讀寫(xiě)文件,這里提供了實(shí)例代碼舉例說(shuō)明,有需要的小伙伴可以參考下
    2016-07-07
  • C++中繼承與多態(tài)的基礎(chǔ)虛函數(shù)類(lèi)詳解

    C++中繼承與多態(tài)的基礎(chǔ)虛函數(shù)類(lèi)詳解

    這篇文章主要給大家介紹了關(guān)于C++中繼承與多態(tài)的基礎(chǔ)虛函數(shù)類(lèi)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • C++中的三種繼承public,protected,private詳細(xì)解析

    C++中的三種繼承public,protected,private詳細(xì)解析

    我們已經(jīng)知道,在基類(lèi)以private方式被繼承時(shí),其public和protected成員在子類(lèi)中變?yōu)閜rivate成員。然而某些情況下,需要在子類(lèi)中將一個(gè)或多個(gè)繼承的成員恢復(fù)其在基類(lèi)中的訪問(wèn)權(quán)限
    2013-09-09
  • C語(yǔ)言超詳細(xì)講解函數(shù)指針的運(yùn)用

    C語(yǔ)言超詳細(xì)講解函數(shù)指針的運(yùn)用

    函數(shù)指針是一個(gè)指針變量,它可以存儲(chǔ)函數(shù)的地址,然后使用函數(shù)指針,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言進(jìn)階教程之函數(shù)指針的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • 你真的知道C++對(duì)象大小嗎?

    你真的知道C++對(duì)象大小嗎?

    這篇文章主要給大家介紹了關(guān)于C++對(duì)象大小的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • C++實(shí)現(xiàn)矩陣原地轉(zhuǎn)置算法

    C++實(shí)現(xiàn)矩陣原地轉(zhuǎn)置算法

    這篇文章主要介紹了C++實(shí)現(xiàn)矩陣原地轉(zhuǎn)置算法,非常經(jīng)典的算法,需要的朋友可以參考下
    2014-08-08
  • C/C++ 宏詳細(xì)解析

    C/C++ 宏詳細(xì)解析

    關(guān)于宏的一些語(yǔ)法問(wèn)題,可以在google上找到。相信我,你對(duì)于宏的了解絕對(duì)沒(méi)你想象的那么多。如果你還不知道#和##,也不知道prescan,那么你肯定對(duì)宏的了解不夠
    2013-09-09
  • C語(yǔ)言函數(shù)指針數(shù)組實(shí)現(xiàn)計(jì)算器功能

    C語(yǔ)言函數(shù)指針數(shù)組實(shí)現(xiàn)計(jì)算器功能

    這篇文章主要通過(guò)C語(yǔ)言函數(shù)指針數(shù)組實(shí)現(xiàn)了計(jì)算器的功能,是一個(gè)很好而且流程詳細(xì)的小例子,感興趣的新手朋友們可以自己動(dòng)手也寫(xiě)一遍
    2022-04-04
  • 最新評(píng)論

    达州市| 色达县| 湄潭县| 乌审旗| 南雄市| 宁远县| 隆化县| 潍坊市| 宝山区| 五台县| 博湖县| 清水县| 会泽县| 保靖县| 成武县| 罗山县| 祁连县| 呼伦贝尔市| 綦江县| 衡东县| 镇赉县| 伊吾县| 东兰县| 桂东县| 丽水市| 清水县| 淮阳县| 赤城县| 高清| 大渡口区| 丰县| 广南县| 兴国县| 中卫市| 会昌县| 格尔木市| 沙坪坝区| 宝山区| 云安县| 峨山| 静安区|