欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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++程序,可以通過修改宏定義 M 和 N 的值來修改迷宮的長(zhǎng)度和寬度,運(yùn)行程序后 按1開始游戲 按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); //開始游戲
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.開始游戲****************\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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C/C++ Qt ToolBar菜單組件的具體使用

    C/C++ Qt ToolBar菜單組件的具體使用

    ToolBar工具欄在所有窗體應(yīng)用程序中都廣泛被使用,使用ToolBar可以很好的規(guī)范菜單功能分類,本文就詳細(xì)的介紹一下ToolBar組件的應(yīng)用,感興趣的可以了解一下
    2021-11-11
  • C/C++實(shí)現(xiàn)發(fā)送與接收HTTP/S請(qǐng)求的示例代碼

    C/C++實(shí)現(xiàn)發(fā)送與接收HTTP/S請(qǐng)求的示例代碼

    HTTP(Hypertext Transfer Protocol)是一種用于傳輸超文本的協(xié)議,它是一種無(wú)狀態(tài)的、應(yīng)用層的協(xié)議,用于在計(jì)算機(jī)之間傳輸超文本文檔,通常在 Web 瀏覽器和 Web 服務(wù)器之間進(jìn)行數(shù)據(jù)通信,本文給大家介紹了C/C++發(fā)送與接收HTTP/S請(qǐng)求,需要的朋友可以參考下
    2023-11-11
  • c++使用正則表達(dá)式提取關(guān)鍵字的方法

    c++使用正則表達(dá)式提取關(guān)鍵字的方法

    這篇文章給大家介紹了c++使用正則表達(dá)式提取關(guān)鍵字的方法,相對(duì)來說比較簡(jiǎn)單,同時(shí)給大家提到了c++通過正則表達(dá)式提取匹配到的字符串的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-08-08
  • VS2019+Opencv4.0+Win10配置詳解

    VS2019+Opencv4.0+Win10配置詳解

    這篇文章主要介紹了VS2019+Opencv4.0+Win10配置詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 學(xué)習(xí) C++能帶給我們什么

    學(xué)習(xí) C++能帶給我們什么

    這篇文章主要介紹了學(xué)習(xí) C++能帶給我們什么的相關(guān)總結(jié),主要來自于前輩們,這里匯總給大家,需要的朋友可以參考下
    2016-03-03
  • 基于OpenCV實(shí)現(xiàn)圖像分割

    基于OpenCV實(shí)現(xiàn)圖像分割

    這篇文章主要為大家詳細(xì)介紹了基于OpenCV實(shí)現(xiàn)圖像分割,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C#將Unicode編碼轉(zhuǎn)換為漢字字符串的簡(jiǎn)單方法

    C#將Unicode編碼轉(zhuǎn)換為漢字字符串的簡(jiǎn)單方法

    下面小編就為大家?guī)硪黄狢#將Unicode編碼轉(zhuǎn)換為漢字字符串的簡(jiǎn)單方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • C++?pthread入門指南

    C++?pthread入門指南

    pthread是C++98接口且只支持Linux,使用時(shí)需要包含頭文件#include?<pthread.h>,編譯時(shí)需要鏈接pthread庫(kù),其中p是POSIX的縮寫,而POSIX是Portable?Operating?System?Interface的縮寫,這篇文章主要介紹了C++?pthread簡(jiǎn)介,需要的朋友可以參考下
    2024-05-05
  • C++讀取訪問權(quán)限沖突引發(fā)異常問題的原因分析

    C++讀取訪問權(quán)限沖突引發(fā)異常問題的原因分析

    C語(yǔ)言是一門通用計(jì)算機(jī)編程語(yǔ)言,廣泛應(yīng)用于底層開發(fā),最近在用C++寫代碼時(shí)經(jīng)常會(huì)遇到“引發(fā)了異常: 讀取訪問權(quán)限沖突,所以這篇文章主要給大家介紹了關(guān)于C++讀取訪問權(quán)限沖突引發(fā)異常問題的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • Qt使用QWT繪制柱狀圖詳解

    Qt使用QWT繪制柱狀圖詳解

    QT中提供了一個(gè)叫做QWT的庫(kù)。QWT,全稱是Qt?Widgets?for?Technical?Applications,是一個(gè)基于LGPL版權(quán)協(xié)議的開源項(xiàng)目,可生成各種統(tǒng)計(jì)圖。本文將通過它繪制柱狀圖,需要的可以參考一下
    2022-01-01

最新評(píng)論