简单的迷宫小游戏C语言程序源代码
- 格式:doc
- 大小:19.00 KB
- 文档页数:6
数据结构迷宫问题源代码#include<stdio.h> #include<malloc.h>#include<stdlib.h>#include <conio.h>#include"typedef.h"#include "ADTStack.h"#include"maze.h"#include"CONSTANT.h"#define MAXLEN 15#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define NULL 0PosType start;PosType end;MazeType maze;bool found;#define MAXLEN 15//迷宫包括外墙最大行列数目#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define STACK_INIT_SIZE 100#define STACKINCREMENT 10typedef int Status;// 坐标位置类型typedef struct{int r,c;}PosType;//迷宫中r行c列的位置//迷宫类型typedef struct{int step;PosType seat; //当前的坐标位置int di; //往下一坐标位置的方向}ElemType;//结点类型typedef struct{ ElemType *base;ElemType *top;int size;}Stack;Status FootPrint(MazeType maze,PosType curpos);Status MarkPrint(MazeType maze,PosType curpos);void PrintMaze(MazeType maze);Status MazePath(MazeType maze,PosType start,PosType end);void InitMaze(MazeType maze, char a[MAXLEN][MAXLEN], int row, int col);Status Pass(MazeType maze, PosType curpos);PosType NextPos(PosType curpos,int i);typedef struct NodeType{ElemType data;NodeType *next;}NodeType,*LinkType;//栈类型typedef struct{int r;int c;char arr[MAXLEN][MAXLEN];//可取' ','*','@','#' }MazeType;Status InitStack(Stack &S);//InitStackStatus Push(Stack &S,ElemType e) ;Status Pop(Stack &S, ElemType &e) ;Status DestroyStack(Stack &S);//DestroyStackvoid ClearStack(Stack &S);//ClearStackStatus StackEmpty(Stack S);//StackEmptyint StackLength(Stack S);void StackTraverse(Stack S, Status(*visit)(ElemType e));//创建栈void Initialization(){printf("\n*********************************************************"); printf("\n * CreatMaze--c MazePath--m PrintMaze Quit*"); printf("\n*****************************************************"); printf("\n * Operation: *");printf("\n************************************************");printf("\n\n enter a operation code:c,m,p,q:");}//读入操作命令符,显示提示信息void ReadCommand(char &cmd){do{cmd=getche();}while(!(cmd=='c'||cmd=='m'||cmd=='p'));}//解释ch--具体执行void Interpret(char cmd){switch(cmd){case 'c':{int rnum, cnum, i=0,m=1,n=1;char a2[MAXLEN][MAXLEN];char input[20];char data[1000];printf("\n请输入迷宫数据文件名!\n");scanf("%s",input);FILE *fp;fp=fopen(input,"r");if(!fp){printf("\n不能打开文件\n");break;while(!feof(fp)){fscanf(fp,"%s",&data[i]);if(i==0){rnum=(int)data[i]-(int)'0';}if(i==1){cnum=(int)data[i]-(int)'0';}if(i>=2){if(n>cnum){m++;n=1;}a2[m][n]=data[i];n++;}i++;}fclose(fp);InitMaze(maze, a2, rnum, cnum);printf("\n迷宫建立完成!!\n");break;}case 'm':{printf("\n请输入迷宫入口的坐标,以空格为间隔:--"); scanf("%d %d",&start.r,&start.c);printf("\n请输入迷宫出口的坐标,以空格为间隔:--"); scanf("%d %d",&end.r,&end.c);MazePath(maze, start, end);break;}case 'p':{if(found){printf("\n求解迷宫的结果如下--\n");PrintMaze(maze);}else printf("\n找不到路径!\n");}}void main(){char cmd;printf(" welcome to the game!!! "); Initialization();do{ReadCommand(cmd); //读入一个操作符命令Interpret(cmd); //解释执行命令操作符}while(cmd!='q');}#include "stdio.h"#include "malloc.h"#include"typedef.h"#include"CONSTANT.h"Status InitStack(Stack &S){ // 构造一个空栈SS.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));if (!S.base) return OVERFLOW; //存储分配失败S.top = S.base;S.size = STACK_INIT_SIZE;return OK;} //InitStackStatus Push(Stack &S,ElemType e){if (S.top - S.base >= S.size){//栈满,追加存储空间S.base = (ElemType*)realloc( S.base,(S.size + STACKINCREMENT)*sizeof (ElemType)); if (!S.base) return OVERFLOW; //存储分配失败S.top = S.base + S.size;S.size += STACKINCREMENT;}*S.top++ = e;return OK;}//PushStatus Pop(Stack &S, ElemType &e){// 若栈不空,则删除S的栈顶元素,// 用e返回其值,并返回OK;// 否则返回ERRORif (S.top == S.base) return ERROR;e = *--S.top;return OK;}//PopStatus DestroyStack(Stack &S){ //释放栈S所占据的存储空间if(!S.base) return ERROR;free(S.base);S.base=NULL;S.top= NULL;return OK;}//DestroyStackStatus ClearStack(Stack &S){ //将栈S清为空栈????S.top=S.base;return OK;}//ClearStackStatus StackEmpty(Stack S){//如果栈为空栈,则返回TRUE,否则返回FALSEif(S.top==S.base)return TRUE;else return FALSE;}//StackEmptyint StackLength(Stack S){ //返回栈S的长度,实际上是栈中元素的个数return S.top-S.base;}//StackLengthStatus StackTraverse(Stack S,Status (*visit)(ElemType e)){ int i;//从栈底到栈顶依次对栈中每个元素调用visit函数,如果visit失败,则操作失败if(S.top==S.base) return ERROR;for(i=0;i<S.top - S.base;i++)if(visit(S.base[i])==ERROR) return ERROR;return OK;} //StackTraverse#include<stdio.h>#include<malloc.h>#include<stdlib.h>#include"typedef.h"#include"CONSTANT.h"#include "ADTStack.h"Status MarkPrint(MazeType maze,PosType curpos){maze.arr[curpos.r][curpos.c]='@';//"@"表示曾走过但不通return OK;}//曾走过而且是通路标记并返回OKStatus FootPrint(MazeType maze,PosType curpos){maze.arr[curpos.r][curpos.c]='*';//"*"表示可通return OK;}PosType NextPos(PosType &curpos,int i){PosType cpos;cpos=curpos;scanf("%d",&i);switch(i){ //1.2.3.4分别表示东,南,西,北方向case 1 : cpos.c+=1;break;case 2 : cpos.r+=1;break;case 3 : cpos.c-=1;break;case 4 : cpos.r-=1;break;}return cpos;}//判断当前位置是否可通Status Pass(MazeType maze, PosType curpos){if(maze.arr[curpos.r][curpos.c]==' ')return TRUE;elsereturn FALSE;}//创建迷宫//按照用户输入的二维数组(或),设置迷宫maze的初值,包括加上边缘一圈的值void InitMaze(MazeType maze, char a[MAXLEN][MAXLEN], int row, int col){maze.r=row;maze.c=col;int i;for( i=0;i<=col+1;i++){a[0][i]='1';a[row+1][i]='1';}for(i=0;i<=row+1;i++){a[i][0]='1';a[i][col+1]='1';}for(i=0;i<=maze.r+2;i++){for(int j=0;j<maze.c+2;j++){if(a[i][j]=='1')maze.arr[i][j]='#';elsemaze.arr[i][j]=' ';}}}Status MazePath(MazeType maze,PosType start,PosType end){//求解迷宫maze中,从入口start到出口end的一条路径,若存在,返回TRUE,否则返回FALSE PosType curpos;int curstep=1;Stack S;bool found;ElemType e;InitStack(S);curpos=start;//设定"当前位置"为"入口位置"found=FALSE;do{if(Pass(maze,curpos)){//当前位置可以通过,即是未曾走到过的通道块留下足迹FootPrint(maze,curpos);//做可以通过的标识e.seat=curpos;e.di=1; //为栈顶元素赋值Push(S,e); //加入路径if(curpos.r==end.r && curpos.c==end.c) found=TRUE;//如果到达终点返回trueelse{curpos=NextPos(curpos,1);curstep++;//下一位置是当前位置的东邻}}else //当前位置不能通过if(!StackEmpty(S)){Pop(S,e);while(e.di==4 && !StackEmpty(S)){MarkPrint(maze,e.seat); //留下不能通过的标记Pop(S,e);curstep--;}if(e.di<4){e.di++; //换下个方向Push(S,e); //curpos=NextPos(e.seat,e.di); //进行探索}}}while(!StackEmpty(S)&&!found);//DestroyStack(S);return found;}//MazePath将标记路径信息的迷宫(字符型方阵)输出到终端(包括外墙) void PrintMaze(MazeType maze){for(int i=0;i<=maze.r+2;i++){for(int j=0;j<=maze.c+2;j++){printf(" %c",maze.arr[i][j]);//输出迷宫}printf("\n");}}。
⽤C语⾔解决迷宫问题#include <stdio.h>#include <stdlib.h>#define ROW 10#define COL 10/*迷宫中位置信息*/typedef struct position{int x;int y;}position;/*在迷宫中的当前位置的信息,也是⼊栈的基本元素*/typedef struct SElem{int di;position seat;}SElem;/*链式栈中节点的定义*/typedef struct position_stack{SElem p;struct position_stack *next;}*Stack_pNode,Stack_Node;void InitStack(Stack_pNode *Link){*Link = NULL;}void push(Stack_pNode *Link,SElem e){Stack_pNode new_SElem = (Stack_pNode)calloc(1,sizeof(Stack_Node));new_SElem->p = e;new_SElem->next = NULL;if (*Link == NULL)*Link = new_SElem;else{new_SElem->next = *Link;*Link = new_SElem;}}int pop(Stack_pNode *Link,SElem *e){if (*Link == NULL)return 0;*e = (*Link)->p;Stack_pNode q = *Link;*Link = (*Link)->next;free(q);return 1;}int top(Stack_pNode Link, SElem *e){if (Link == NULL)return 0;*e = Link->p;return 1;}int empty(Stack_pNode Link){if (Link == NULL)return 1;elsereturn 0;}int reverse(Stack_pNode *Link){Stack_pNode p, q, r;if (*Link == NULL || (*Link)->next == NULL)return 0;r = *Link;p = (*Link)->next;q = NULL;while (p){r->next = q;q = r;r = p;p = p->next;}r->next = q;*Link = r;}void print(Stack_pNode Link){Stack_pNode r = Link;while (r){printf("(%d,%d) -> ",r->p.seat.x,r->p.seat.y);r = r->next;}printf("exit\n");}int curstep = 1;/*纪录当前的⾜迹,填写在探索前进的每⼀步正确的路上*//*迷宫地图。
C语⾔实现数据结构迷宫实验本⽂实例为⼤家分享了C语⾔实现简单的数据结构迷宫实验,供⼤家参考,具体内容如下分析:迷宫实验主要有两部分操作,其⼀是对迷宫的⽣成,其⼆是寻路使⽤栈的操作。
步骤:⼀、.h⽂件1、⾸先是迷宫的⽣成,可以使⽤随机数种⼦⽣成,但主要逻辑部分并不在此,所以在这⾥直接写死,固定下来。
定义⼀个坐标类型的结构体,和⼆维数组迷宫:typedef struct {int x;int y;}Pos;//迷宫类型typedef struct {int square[10][10] ={{1,1,1,1,1,1,1,1,1,1},{1,0,0,0,0,0,0,0,0,1},{1,1,1,1,0,1,1,1,0,1},{1,0,0,0,0,1,0,1,0,1},{1,0,1,1,1,1,0,1,1,1},{1,0,0,0,0,1,0,0,0,1},{1,0,1,1,0,0,0,1,0,1},{1,0,1,1,1,0,1,1,1,1},{1,0,0,0,1,0,0,0,0,1},{1,1,1,1,1,1,1,1,1,1},};}Maze;typedef Pos SElemType;2、然后是对栈的声明,栈⾥储存的元素为坐标类型//顺序栈#define MAXSIZE 50typedef struct {SElemType *base;SElemType *top; //栈顶指针int stacksize;}SqStack;3、栈操作函数声明typedef int Status;#define OK 1;#define ERROR 0;//栈的相关操作//初始化栈Status initStack(SqStack &s);//压栈Status push(SqStack &s, SElemType e);//出栈SElemType pop(SqStack &s);//清空栈Status clearStack(SqStack &s);//摧毁栈void destroyStack(SqStack &s);//遍历栈Status stackTravel(SqStack s);4、迷宫操作函数声明//初始化迷宫(同时⽣成起始点和终点)void initMaze(Maze &maze);//寻找出路;传⼊⼀个迷宫和栈找出出路void findWay(Maze &maze,SqStack &s);//判断该点的四个⽅向是否有通路,有就前进Pos isExit(Pos p, Maze maze);⼆、.cpp⽂件1、导⼊所需头⽂件#include "pch.h"#include <iostream>#include<time.h>#include<stdlib.h>using namespace std;2、栈操作实现//构造空栈Status initStack(SqStack &s) {s.base = new SElemType[MAXSIZE];if (!s.base){exit(OVERFLOW);//分配失败}s.top = s.base;s.stacksize = MAXSIZE;return OK;}//⼊栈Status push(SqStack &s, SElemType e) {//判断栈满if (s.top-s.base == s.stacksize){return ERROR;}//存⼊元素,*为取指针的值s.top++;*s.top = e;return OK;}//出栈,⽤e返回栈顶值SElemType pop(SqStack &s) {SElemType e;//判断栈为空if (s.top == s.base){//若为空则返回⼀个(-1,-1)的点,判断由外部调⽤时进⾏ e.x = -1;e.y = -1;return e;}e = *s.top;s.top--;return e;}Status clearStack(SqStack &s) {s.top = s.base;return OK;}void destroyStack(SqStack &s) {s.top = NULL;s.stacksize = 0;free(s.base);}Status stackTravel(SqStack s) {while (s.top != s.base){s.base++;Pos p = *s.base;if ( p.x == 0 || p.y == 0|| p.x == 9 ||p.y == 9){//终点输出为“End”cout << "End";}}cout << endl;return 0;}3、迷宫操作实现///////////////////////////////////////迷宫操作//////////////////////////////////初始化函数,传⼊⼀个迷宫,随机⽣成起点和终点,由于起点有⼀定限制,所以这⾥起点也固定为⼏个最合适的点void initMaze(Maze &maze) {//⽣成随机数srand((unsigned)time(NULL));int index = rand() % 36 + 1;int start = index % 6 + 1;//⽣成起始点数值为‘s'switch (start){case 1:maze.square[1][1] = 's';break;case 2:maze.square[3][8] = 's';break;case 3:maze.square[3][6] = 's';break;case 4:maze.square[6][8] = 's';break;case 5:maze.square[8][3] = 's';break;case 6:maze.square[8][8] = 's';break;}//随机⽣成终点'e'表⽰while (index = rand()%36+1){//出⼝在顶部if (index >1 &&index<10 && maze.square[1][index-1]!='s'){maze.square[0][index-1] = 'e';break;}//出⼝在右侧else if (index>10 &&index <19){if (maze.square[index-10][8] != 1 && maze.square[index-10][8]!='s') {maze.square[index-10][9] = 'e';break;}}//底部出⼝else if (index >19&&index<28){if (maze.square[8][index - 19] != 's' && maze.square[8][index - 19] != 1) {maze.square[9][index - 19] = 'e';break;}}//左侧出⼝else if (index >28 && index <=36){if (maze.square[index-28][1] != 1 &&maze.square[index-28][1] != 's'){maze.square[index - 28][0] = 'e';break;}}}void showMaze(Maze maze) {for (int i = 0; i < 10; i++){for (int j = 0; j < 10; j++){if (maze.square[i][j] == 1){cout << "* ";}else if (maze.square[i][j] == 0){cout << " ";}else{cout << (char)maze.square[i][j]<<" ";}}cout << endl;}}//寻找迷宫路径void findWay(Maze &maze,SqStack &s) {//⾸先遍历找出起始点和终点并保存下来Pos start,end;for (int i = 0; i < 10; i++){for (int j = 0; j < 10; j++) {if (maze.square[i][j] == 's'){ //起点压⼊栈内start.x = i;start.y = j;push(s, start);}else if (maze.square[i][j] == 'e'){ //出⼝end.x = i;end.y = j;}}}//寻找路径Pos go = start;//直到找到出⼝才结束while ( s.top->x != end.x || s.top->y != end.y){//获得下⼀步坐标Pos path = isExit(go, maze);if (path.x != go.x || path.y != go.y){//前进maze.square[path.x][path.y] = 'p';push(s, path);go = path;}//如果所有放向都⾛不通(即返回的点是传⼊的点),则将其标为“@”,出栈到上⼀个点,继续判断else{//⾛不通popmaze.square[path.x][path.y] = '@';pop(s);go = *s.top;}}maze.square[end.x][end.y] = 'e';}//判断返回下⼀步路径(顺序:右下左上),传⼊所处位置,从右边开始判断是否⼜通路或者出⼝,有就返回哪个⽅向上的点Pos isExit(Pos p,Maze maze) {Pos tempP = p;if (maze.square[tempP.x][tempP.y+1] == 0 || maze.square[tempP.x][tempP.y + 1] == 'e'){tempP.y++;else if(maze.square[tempP.x+1][tempP.y] == 0 || maze.square[tempP.x +1][tempP.y] == 'e'){tempP.x++;}else if (maze.square[tempP.x][tempP.y - 1] == 0 || maze.square[tempP.x][tempP.y - 1] == 'e'){tempP.y--;}else if (maze.square[tempP.x - 1][tempP.y] == 0 || maze.square[tempP.x - 1][tempP.y] == 'e'){tempP.x--;}return tempP;}三、main函数调⽤int main(){while (true){//创建⼀个迷宫Maze maze;initMaze(maze);//初始化⼀个栈SqStack S;initStack(S);cout << "*****************************" << endl;cout << "* 1、⽣成迷宫 2、退出 *" << endl;cout << "*****************************" << endl;cout << "请输⼊你的选择:";int select = 0;cin >> select;if (select == 1){cout << "⽣成随机起点和出⼝迷宫:" << endl;showMaze(maze);cout << "⽣成迷宫路径:" << endl;findWay(maze, S);stackTravel(S);showMaze(maze);cout << endl;}if (select == 2){clearStack(S);break;}}return 0;}四、评价这是个叫简易的迷宫,但基本实现了迷宫的寻路逻辑,可改进的地⽅有:1、因为很多地⽅写死了,所以复⽤性不⾼,可以⽤循环遍历来随机⽣成起点,同理迷宫的⽣成也是这样2、判断路径可以⽤递归调⽤实现前进逻辑以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
本程序代码为C语言解决数据结构(严蔚敏)中关于迷宫的问题。
程序不仅实现迷宫路径查找,还实现文字描述路径功能可以直接粘贴到vc6.0中运行【代码如下】# include <stdio.h> # include <malloc.h> # define null 0typedef struct{int (*base)[2];int (*top)[2];int listlen;}sqlist;int topelem[2]; //栈顶元素void creatstack(sqlist *mazepath); //创建一个存储路径的栈void creatmap(int (*mazemap)[10]); //创建迷宫图纸void printmap(int (*mazemap)[10]);void footprint(int x,int y,int k,int (*mazemap)[10]);int position(int x,int y); //判断是否到终点int passroad(int x,int y,int (*mazemap)[10]);void findpath(int (*mazemap)[10],sqlist *mazepath); //在mazemap当中寻找mazepahtvoid printpath(sqlist *mazepath);void roadinwords(sqlist *mazepath); //文字叙述如何走迷宫void push(int x,int y,sqlist *mazepath); //栈操作void pop(sqlist *mazepath);void gettop(sqlist *mazepath);void main(){sqlist mazepath;creatstack(&mazepath); //创建一个存储路径的栈int mazemap[10][10]={1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,0,0,1,0,1,1,0,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,1,1,0,1,0,0,0,1,0,0,1,1,0,1,1,1,0,1,1,0,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1};// creatmap(mazemap); //创建迷宫图纸printf("迷宫原图为:\n");printmap(mazemap);findpath(mazemap,&mazepath); //在mazemap当中寻找mazepaht printf("走出迷宫图纸为:\n");printmap(mazemap);printf("走出迷宫文字叙述为:\n");roadinwords(&mazepath);// printpath(&mazepath);}void findpath(int (*mazemap)[10],sqlist *mazepath){int x,y,flag=0,k=0,next; //位置是否可通,flag=0通,1墙,2通但不可走x=1;y=1; //获取初始位置push(x,y,mazepath); //起点位置进栈footprint(x,y,6,mazemap);while(flag==0 && k!=162) //flag==1到达终点,0未到达终点{if(passroad(x,y+1,mazemap)==0)push(x,y+1,mazepath),y=y+1,footprint(x,y,6,mazemap);else if(passroad(x+1,y,mazemap)==0)push(x+1,y,mazepath),x=x+1,footprint(x,y,6,mazemap);else if(passroad(x,y-1,mazemap)==0)push(x,y-1,mazepath),y=y-1,footprint(x,y,6,mazemap);else if(passroad(x-1,y,mazemap)==0)push(x-1,y,mazepath),x=x-1,footprint(x,y,6,mazemap);elsefootprint(x,y,2,mazemap),pop(mazepath),gettop(mazepath),x=topelem[0],y= topelem[1];// printmap(mazemap);k++;flag=position(x,y); //判断是否到达终点// printf("flag==%d\n",flag);}}void creatstack(sqlist *mazepath){mazepath->base=(int (*)[2])malloc(120*sizeof(int (*)[2]));mazepath->top=mazepath->base;mazepath->listlen=120;}void push(int x,int y,sqlist *mazepath){**(mazepath->top)=x;*(*(mazepath->top)+1)=y;mazepath->top++;}void pop(sqlist *mazepath){if(mazepath->top!=mazepath->base)mazepath->top--;}void printmap(int (*mazemap)[10]){int (*p)[10];p=mazemap;int i,j;printf(" \n\n\n");for(i=0;i<10;i++){for(j=0;j<10;j++){if(j==0)printf(" ");if(*(*(p+i)+j)==0)printf("▇");else if(*(*(p+i)+j)==1)printf("□");else if(*(*(p+i)+j)==6)printf("★");elseprintf("▇");if(j==9)printf("\n");}}printf("\n\n");}void printpath(sqlist *mazepath){int (*p)[2];p=mazepath->base;while(p!=mazepath->top){printf("x=%d,y=%d\n",**p,*(*p+1));p++;}}void gettop(sqlist *mazepath){int (*p)[2];int (*q)[2];p=mazepath->base;while(p!=mazepath->top){q=p;p++;}topelem[0]=**q;topelem[1]=*(*q+1);}void footprint(int x,int y,int k,int (*mazemap)[10]){if(x<10 && y<10)*(*(mazemap+x)+y)=k;}int position(int x,int y){int flag;if(x==8 && y==8)flag=1;elseflag=0;return(flag);}int passroad(int x,int y,int (*mazemap)[10]) {int num=1;if(x<10 && y<10)num=*(*(mazemap+x)+y);return(num);}void roadinwords(sqlist *mazepath){int x=1,y=1,i=0;int (*p)[2];p=mazepath->base;p++;while(p!=mazepath->top){if(x==**p && y+1==*(*p+1))printf("向右走→→"),x=**p,y=*(*p+1);else if(x+1==**p && y==*(*p+1))printf("向下走→→"),x=**p,y=*(*p+1);else if(x==**p && y-1==*(*p+1))printf("向左走→→"),x=**p,y=*(*p+1);else if(x-1==**p && y==*(*p+1))printf("向上走→→"),x=**p,y=*(*p+1);i++;if(i%3==0)printf("\n");p++;}printf("\n");}。
简单的c语言迷宫小游戏一、内容:1、本游戏主要实现了人控制键盘方向键使小人(*)走出迷宫。
2、具有的功能: 1)、在游戏菜单里人可以选择不同难度的游戏进行游戏;2)、在游戏过程中,可以通过键盘方向键使小人移动,走出迷宫;3)、在游戏过程中,当人碰到墙壁(#)的时候小人过不去;4)、当人顺利完成游戏之后,输出“========you are win!======”字样,30秒钟后自动返回到游戏菜单;5)、在游戏过程中,人可以通过按Esc键返回游戏菜单;也可以可以按0直接退出游戏;6)、在游戏菜单里,按0键可以退出游戏。
3、具体应用: 1)、人主要同过键盘的1,2,3数字键来选择游戏难度;2)、在游戏中通过Esc键来返回菜单;3)、同过0键退出游戏。
二、上机环境操作系统:windows7 开发工具:VC6.0三、各函数功能说明main() 主函数;menu() 游戏菜单;roadcake() 消去小人路径;introduce() 游戏介绍;system(“cls”)消屏函数;exit(0) 退出游戏;drawmg1() 画初级难度迷宫;drawmg2() 画中级难度迷宫;drawmg3() 画高级难度迷宫;control1() 控制初级难度游戏;control2() 控制中级难度游戏;control3() 控制高级难度游戏;四、算法流程图首先定义三个全局数组mg1[20][20]、mg2[30][30]、mg3[30][30]用于画出迷宫的地图;1表示墙(#),0表示空地();Introduce( )函数里如果按Enter键,则调用menu( )函数,从键盘中输入相应的提示数字,进入难度不同的游戏;游戏的执行在此只初级难度进行描述,其余的难度与其类似;选了1后调用system(”cls”)进行清屏;drawmg1()函数进行迷宫的地图的绘制, for(i=0;i<20;i++){printf("\t\t\t");for(j=0;j<20;j++){ch=mg1[i][j];switch(ch){case 4: printf("*");break;case 0: printf(" ");break;case 1: printf("#");break;}if(num++%20==0) /*每行只能输出20个字符*/printf(”\n”);}}之后调用控制函数control1()进行控制小人移动路径,在control1()函数里用do—while()语句进行循环,while(1)进行死循环,再定义四个整型a,b,m,n即:for(n=0;n<30;n++)for(m=0;m<30;m++)if(mg3[n][m]==4){a=n; /*为后面调用roadcake()实现消除小人路径进行初始赋值*/b=m;break;}用switch()语句选择方向键,在调用roadcake()函数进行消除小人路径 void roadcake(int *i,int *j){int temp;temp=*i; /*进行值交换,即数组值为0和值为4进行交换*i=*j;*j=temp;}完成第一个控制之后进行清屏和画新的游戏状态图,若在游戏进行中要退出游戏,只需按0键,调用exit(0)函数结束;若要返回游戏菜单,按Esc键掉用menu()函数即可,重复以上步骤,直达游戏结束,此时掉用menu()函数自动返回菜单。
用C和SFML制作迷宫小游戏迷宫小游戏制作指南迷宫小游戏是一种经典的游戏类型,以其挑战性和趣味性而备受玩家喜爱。
这里将介绍使用C语言和SFML库来制作迷宫小游戏的步骤。
一、概述迷宫小游戏的基本原理是玩家通过键盘操作控制角色在迷宫中寻找出口。
玩家可以使用方向键或WASD键控制角色的移动,并避开迷宫中的障碍物。
游戏的难度可以根据迷宫的复杂程度和障碍物的设置来调整。
二、环境搭建1. 安装C编译器和SFML库:在开始制作游戏之前,需要安装C编译器(如GCC或Clang)以及SFML库。
GCC和Clang是常用的C语言编译器,在安装过程中会有相应的说明文档。
SFML是一个跨平台的多媒体库,提供了许多功能丰富的图形和音频接口。
2. 配置开发环境:在安装完成后,需要配置开发环境,包括设置编译器和库文件的路径。
具体操作请参考相关文档。
三、游戏设计在开始编写代码之前,我们需要先设计游戏的基本框架和功能。
1. 创建游戏窗口:使用SFML库可以方便地创建一个游戏窗口,并设置窗口的大小和标题。
2. 绘制迷宫地图:迷宫地图可以使用二维数组来表示,其中不同的数值代表不同的方块类型,比如墙壁、通道和出口。
在游戏开始时,需要根据地图数组来绘制迷宫。
3. 控制角色移动:通过监听键盘事件,可以让玩家使用方向键或WASD键来控制角色的移动。
需要注意的是,角色移动时需要检测是否与墙壁或边界发生碰撞。
4. 碰撞检测:在角色移动过程中,需要判断角色是否与墙壁或障碍物发生碰撞。
如果发生碰撞,则需要相应地处理角色的移动。
5. 胜利条件判断:游戏的胜利条件是角色到达迷宫的出口。
可以通过判断角色与出口的位置关系来判断玩家是否胜利。
四、编写代码在完成游戏设计之后,我们可以开始编写代码来实现游戏功能。
1. 引入SFML库和相关头文件:在代码文件的开头,引入所需的SFML库和相关头文件。
2. 创建游戏窗口:使用SFML库中的窗口类来创建游戏窗口,并设置窗口的大小和标题。
#include"stdio.h"#include"stdlib.h"#define M1 11#define N1 11 /*M1*N1为加上围墙后的迷宫大小*/#define MAX 100 /*定义栈的最大长度*/int M=M1-2;int N=N1-2; /*M*N为原迷宫大小*/typedef struct /*定义栈元素的类型*/{int x,y,dir;}elemtype;typedef struct /*定义顺序栈*/{elemtype stack[MAX];int top;}P;struct moved /*定义方向位移数组的类型*/{int dx;int dy;};void Newmg(int mg[M1][N1]) /*迷宫的初始化*/{int i,j,num;printf("迷宫:\n");for (i=1;i<=M;i++){for (j=1;j<=N;j++){num=(800*(i+j)+1500)%327; /*根据N和M值伪随机产生迷宫*/if((num<150)&&(i!=M||j!=N))mg[i][j]=1;elsemg[i][j]=0;printf("%3d",mg[i][j]);} /*输出迷宫*/printf("\n");}printf("\n");for(i=0;i<=M+1;i++) /*设置迷宫的围墙*/{mg[i][0]=1;mg[i][N+1]=1;}for(j=0;j<=N+1;j++)mg[0][j]=1;mg[N+1][j]=1;}}void Newmove(struct moved move[8]) /*定义存储坐标变量的方向位移*/ {move[0].dx=0;move[0].dy=1; /*寻找方向依次为:东,东南,南,move[1].dx=1;move[1].dy=1; 西南,西,西北,北,东北*/ move[2].dx=1;move[2].dy=0;move[3].dx=1;move[3].dy=-1;move[4].dx=0;move[4].dy=-1;move[5].dx=-1;move[5].dy=-1;move[6].dx=-1;move[6].dy=0;move[7].dx=-1;move[7].dy=1;}void Newstack(P *s) /*初始化栈*/{s->top=-1;}int RuZhan(P *s ,elemtype x) /*将数据元素x压入指针s所指的栈中*/ {if (s->top==MAX-1)return (0); /*如栈满,即压栈失败,则返回0*/ else{s->stack[++s->top]=x;return(1); /*压栈成功,则返回1*/}}elemtype ChuZhan(P *s) /*栈顶元素出栈*/{elemtype elem;if (s->top<0) /*如果栈空,返回空值*/{elem.x=NULL;elem.y=NULL;elem.dir=NULL;return(elem);}elses->top--;return(s->stack[s->top+1]); /*如果栈非空,返回栈顶元素*/}}void Search(int mg[M1][N1],struct moved move[8],P *s){ /*寻找迷宫的通路*/int i,j,dir,x,y,k;elemtype elem;i=1;j=1;dir=0;mg[1][1]=-1; /*设置(1,1)为入口处*/do{x=i+move[dir].dx; /*寻找下一步可行的到达点的坐标*/y=j+move[dir].dy;if(mg[x][y]==0){elem.x=i;elem.y=j;elem.dir=dir;k=RuZhan(s,elem); /*如果可通过,将此点数据压栈*/if(k==0)printf("栈长度太短\n"); /*如果入栈操作返回0,说明栈容量不够*/i=x;j=y;dir=0;mg[x][y]=-1;}else if(dir<7)dir++;else /*如果八个方向都不可行,就退回一步*/ {elem=ChuZhan(s);if (elem.x!=NULL){i=elem.x;j=elem.y;dir=elem.dir+1;}}}while (!((s->top==-1)&&(dir>=7)||(x==M)&&(y==N)));/*循环,直到入口处或出口处为止*/if(s->top==-1) /*如果最终是入口处,则迷宫无通路*/printf("此迷宫无通路\n");else{elem.x=x;elem.y=y;elem.dir=dir;k=RuZhan(s,elem); /*将最后出口的坐标压入栈中*/printf("迷宫通路:\n");printf (" 入口->");i=0;while (i<=s->top){printf("(%d,%d)->",s->stack[i].x,s->stack[i].y); /*显示迷宫通路*/ if(i!=s->top)if((i+1)%4==0)printf("\n");i++;}printf ("出口\n");}}void main() /*寻找迷宫通路程序*/{P *s;int mg[M1][N1];struct moved move[8];Newmg (mg); /*调用函数初始化迷宫*/s=(P*)malloc(sizeof(P));Newstack(s); /*调用函数初始化栈*/Newmove(move); /*调用函数初始化位移数组*/ Search (mg,move,s); /*调用函数寻找迷宫通路*/}。
《C 语言程序设计》题目走迷宫游戏程序设计一、内容本系统主要实现了走迷宫游戏,执行游戏的时候出现迷宫图案,每次各不相同,但是入口均在左上角,出口在右下角,出入口各有“出”、“入”提示。
人物为㊣,“█”表示墙,外围为一圈墙,空白部分为可行走的路,使用“上”、“下”、“左”、“右”键操作㊣,当遭遇“墙”时无法前进,操作“█”上下左右移动,直至走到出口,游戏胜利。
当无法走出迷宫时,按“ Esc”键即可退出游戏。
二、上机环境操作系统: windows XP开发工具: vc6.0三、函数调用关系图main 函数creat 函数paint 函数game 函数gotoxy 函数get_key函数gotox 函数图一:函数调用关系图四、各函数功能说明main 函数:主函数;create函数:随机生成迷宫;paint函数:画出迷宫;game函数:开始游戏;gotoxy 函数:在文本窗口设置光标;get_key函数:接受按键;五、算法描述或流程图开始游戏界面画长 33 宽 31迷宫玩家继续移动人物开始游戏N玩家移动人物是否到达口?出N Y是否遇到墙?游戏成功Y结束人物坐标位置不变图二:算法流程图六、程序运行效果图图三:游戏开始效果图图四:到达终点效果图七、总结课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节。
大学来说掌握计算机开发技术是十分重要的。
在程序设计的过程中,我遇到了不少的问题,请教过学姐或者学长,也请教了老师,最后将程序设计好了。
回顾起此次课程设计,我感慨良多,从拿到题目到完成整个编程,从理论到实践,在整整两个星期的日子里,我学到了很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且还学到了很多在书本上所没有学到过的知识,我发现 c 语言是一门有趣的课程,对它产生了很大的兴趣。
并且我明白了细心真的很重要,有时候就是因为一点点的小错误,而导致程序无法调试,并且需要花较长的时间去寻找错误。
迷宫非递归求解(c语言)源代码.txt51自信是永不枯竭的源泉,自信是奔腾不息的波涛,自信是急流奋进的渠道,自信是真正的成功之母。
#include <stdio.h>#include <stdlib.h>#define MaxSize 100#define StackIncrement 10struct Seat{ //定义坐标结构体int x;int y;};typedef struct { //定义入栈信息元素类型int ord;Seat seat;int di;}SElemType;struct Stack{ //定义栈元素类型SElemType *base;SElemType *top;int StackLength;};Stack S;bool Map[10][10]={{0},{0,1,1,0,1,1,1,0,1,0},{0,1,1,0,1,1,1,0,1,0},{0,1,1,1,1,0,0,1,1,0},{0,1,0,0,0,1,1,1,1,0},{0,1,1,1,0,1,1,1,1,0},{0,1,0,1,1,1,0,1,1,0},{0,1,0,0,0,1,0,0,1,0},{0,0,1,1,1,1,1,1,1,0},{0}};bool is_through[10][10]={0};bool InitStack(Stack &S){ //构建一个栈S.base=S.top=(SElemType*)malloc(MaxSize*sizeof(SElemType));if(!S.base)return false;S.StackLength=MaxSize;return true;}bool Push(Stack &S,SElemType e){ // 将信息e入栈if((S.top-S.base)/sizeof(SElemType)==S.StackLength){S.base=(SElemType*)realloc(S.base,(S.StackLength+StackIncrement)*sizeof(SEle mType));S.top=S.base+S.StackLength;S.StackLength += StackIncrement;}S.top->di=e.di; S.top->ord=e.ord; S.top->seat.x=e.seat.x; S.top->seat.y=e.seat.y;S.top++;return true;}bool Pop(Stack &S,SElemType &e){ //将栈顶元素取出,赋值给eif(S.base==S.top)return false;S.top--;e.di=S.top->di; e.ord=S.top->ord; e.seat.x=S.top->seat.x;e.seat.y=S.top->seat.y;return true;}bool StackEmpty(Stack s){ //判断栈是否为空return !(s.top-s.base);}bool Pass(Seat s){ //判断当前位置是否通return Map[s.x][s.y];}bool FootPrint(Seat s){ // 在此位置留下标记,表示已经经过is_through[s.x][s.y]=true;return true;}Seat NextPos(Seat s,int i){ // 将当前位置指向逻辑上的下个位置,指向的方向由i确定Seat ss;if(i==1){ss.x=s.x+1; ss.y=s.y;}elseif(i==2){ss.x=s.x; ss.y=s.y+1;}elseif(i==3){ss.x=s.x-1; ss.y=s.y;}else{ss.x=s.x; ss.y=s.y+1;}return ss;}bool MazePath(Seat start,Seat end){InitStack(S); //创建栈并且初始化Seat curpos; curpos.x=start.x; curpos.y=start.y; //设定当前位置为入口地址int curstep=1; // 探索第一步do{if(Pass(curpos)&&!is_through[curpos.x][curpos.y]){ // 当前位置通且没有来过FootPrint(curpos); // 留下痕迹SElemType e; // 构建入栈信息e.di=1; e.ord=curstep; e.seat.x=curpos.x; e.seat.y=curpos.y;Push(S,e); // 加入路径if((curpos.x==end.x)&&(curpos.y==end.y)) // 到达终点return true;curpos=NextPos(curpos,1); // 探索下一步curstep++;}else{ // 当前位置不通,将前面一个位置取出,改由其他方向在判断SElemType e;if(!StackEmpty(S)){Pop(S,e);while(e.di==4&&!StackEmpty(S)){FootPrint(e.seat); Pop(S,e); // 如果这个位置的其他四个方向都不满足,表示这个位置不可取,取出栈并且留下标识}if(e.di<4){ // 如果其他方向还没有探索完,继续探索下一个方向e.di++; Push(S,e);curpos=NextPos(e.seat,e.di);}}}}while(!StackEmpty(S));return false;}int main(){int i,j;Seat sta,end;sta.x=1; sta.y=1; end.x=8; end.y=8;MazePath(sta,end);SElemType *b=S.base;printf("迷宫地图为(1表示通,0表示不通):\n");for(i=0;i<10;i++){for(j=0;j<10;j++)printf("%d ",Map[i][j]);printf("\n");}printf("迷宫路径为:");while(b!=S.top){printf("(%d,%d) -> ",b->seat.x,b->seat.y);++b;}printf("出口\n");scanf("%d",i);return 0;}。
C语⾔实现⾛迷宫本⽂实例为⼤家分享了C语⾔实现⾛迷宫的具体代码,供⼤家参考,具体内容如下描述给⼀张个迷宫,问能否从起点⾛到终点,只能往上下左右⾛,不能斜着⾛输⼊多组测试数据,每组第⼀⾏两个正整数,分别为n和m表⽰n这个迷宫有n⾏m列(0<n,m<10)接着是n⾏m列,'#'表⽰路‘*'表⽰墙‘S'表⽰起点‘T'表⽰终点输出每组测试数据输出⼀个结果,如果能从S⾛到T,输出“YES”,否则输出“NO”输⼊样例:2 2S*#T3 3S*##T##输出样例:YESNO有两种⽅法可以解决这个问题第⼀种深度优先搜索:站在⼊⼝,考虑⾃⼰下⼀步可以⾛哪⾥,⾛到下⼀个位置后,再考虑下⼀步怎么⾛,⼀直⾛下去,直到没有路,然后再返回最近的⼀个岔路⼝,选其它任⼀条没试过的路,如果不能⾛,再尝试其他的路,直到这个岔路⼝的路全部试完,再回到上⼀个路⼝,看是否能⾛到出⼝,相当于⼀条路⾛到⿊#include<bits/stdc++.h>using namespace std;char a[20][20]; //存储迷宫字符数组int flag,m,n;int sdep_x[4]={-1,1,0,0},sdep_y[4]={0,0,-1,1};//控制上下左右⽅向int vis[20][20]; //标记⾛过的路void dfs(int x,int y){vis[x][y]=1; //代表被标记过了if(a[x][y]=='T') //找到出⼝{flag=1;return;}for(int i=0;i<4;i++) //搜索路径{int h=x+sdep_x[i];int l=y+sdep_y[i];if(a[h][l]!='*'&&!vis[h][l]&&h>=0&&h<n&&l>=0&&l<m)//搜索路径的条件{dfs(h,l);}}}int main(){while(cin>>n>>m){memset(vis,0,sizeof(vis));//初始化数组flag=0;int f,g;for(int i=0;i<n;i++)for(int j=0;j<m;j++)cin>>a[i][j];for(int i=0;i<n;i++)for(int j=0;j<m;j++){if(a[i][j]=='S')//先找到路⼝{f=i;g=j;}}dfs(f,g);if(flag)cout<<"YES"<<endl;elsecout<<"NO"<<endl;}return 0;}第⼆种⽅法⼴度优先搜索:这⼀步之后,把接下来⼀步的所有路都列出来,在之后的所有扩展之中,在以⼀个为下⼀步,再将所有的该步可以到达的下⼀步,全部列举出来,再将第⼆步的其他选择中的每⼀步,都⼀⼀做扩展,每次扩展,都要检查所扩展的地⽅有没有到达搜索的要求。
目录1、程序的功能 (2)2、游戏界面设计和图形函数的使用 (2)3、整体设计思路 (6)4、程序中的数据结构 (7)5、程序核心算法的流程图 (9)6、程序改进的设想 (10)7、总结 (10)8、参考文献 (12)1、程序的功能设计并实现一个类似于手机游戏“走迷宫”的程序。
一般设计迷宫为二维平面图,将迷宫的左上角作为入口,右下角作为出口。
一个点从入口通过键盘方向键的移动,走过通道,从出口成功走出。
迷宫随机生城,黄色代表可以通过,蓝色代表墙壁不能通过。
程序有两种运行方式:一种是由系统自动运行探索;一种是人工探索通路。
2、游戏界面设计和图形函数的使用Stack.h#include <iostream.h>#include <malloc.h>typedef struct {int r;int c;}PosType;typedef struct{int step; //当前位置在路径上的序号PosType seat; //当前位置的坐标int di; //往下一坐标的方向}ElemType;typedef struct NodeType{ElemType data;NodeType *next;}*NodeLink;typedef struct{NodeLink top;//指向栈顶int size;}Stack;////////////栈的基本操作void InitStack(Stack &S){//初始化栈,设S为空栈S.size=0;///cout<<"栈初始化成功"<<endl;S.top=NULL;}int LengthStack(Stack S){return S.size;}bool StackEmpty(Stack S){if(S.size==0)return true;else return false;}bool Push(Stack &S,ElemType e){//若分配空间成功,则在S的栈顶插入新的栈顶元素e,并返回true NodeType *p;if((p=(NodeType *)malloc(sizeof(NodeType)))==NULL)return false;p->data=e;p->next=S.top;S.top=p;S.size++;return true;}bool Pop(Stack &S,ElemType &e){//若栈不空,将栈S的栈顶元素删除并由e带回其值,且返回trueNodeType *p=S.top;if(p==NULL){cout<<"栈为kong,无法删除栈顶元素……\n";return false;}e=p->data;S.size--;S.top=p->next;free(p);return true;}bool StackTraveser(Stack S){NodeType *p;p=S.top;if(p==NULL){return false;}while(!p){cout<<S.top->data.di<<endl;p=p->next;}return true;}1.、main()主函数首先确定是人工探索还是系统自动探索,通过输入字符选定。
迷宫c语言#include<stdio.h>#include<conio.h>#include<windows.h>#include<time.h>#定义权31//迷宫的高度必须是奇数#定义的高度25//迷宫的宽度必须是奇数#定义的高度1#定义的高度0#定义的高度3#定义的高度5#定义的宽度1#定义的宽度2#定义的宽度3#定义的宽度4intmap[height+2][width+2];voidgotoxy(intx,inty)//移动坐标{合作社;库德。
x=x;库德。
y=y;setconsolecursorposition(getstdhandle(std_output_handle),coord);}Void hidden()//隐藏光标{handlehout=getstdhandle(std_output_handle);console_cursor_infocci;GetConsoleUrsorInfo(hout和cci);cci。
bvisible=0;//指定1显示,指定0隐藏设置控制台或信息(hout,&CCI);}voidcreate(intx,inty)//随机生成迷宫{intc[4][2]={0,1,1,0,0,-1,-1,0};//四个方向inti,J,t//分解(I=0;I<4;I++)的方向{j=rand()%4;t=c[i][0];c[i][0]=c[j][0];c[j][0]=t;t=c[i][1];c[i][1]=c[j][1];c[j][1]=t;}map[x][y]=road;for(i=0;i<4;i++)如果(映射[x+2*c[i][0][y+2*c[i][1]]==墙){map[x+c[i][0]][y+c[i][1]]=road;create(x+2*c[i][0],y+2*c[i][1]);}}intget_uokey()//接收密钥{charc;while(C=getch()){if(c==27)returnesc;//escif(c!=-32)continue;c=getch();如果(c==72)返回;//上if(C==80)returndown//下if(C==75)returneft//左if(c==77)returnright;//右}return0;}虚空绘制(intx,inty)//绘制迷宫{gotoxy(2*y-2,x-1);switch(map[x][y]){casestart:Printf(“in”);中断;//图纸输入框结束:printf("出");break;//画出口casewall:printf(“※”);中断;//画墙凯斯路:printf("");break;//画路}}虚空游戏(){intx=2,y=1;//玩家当前位置,刚开始在入口处intc;//接收键(1时){gotoxy(2*y-2,x-1);printf(“☆“”;//如果(map[x][y]==end)//判断是否到达出口,则绘制玩家的当前位置{gotoxy(30,24);Printf(“到达终点时,按任意键结束”);getch();打破;}c=get_key();if(c==esc){gotoxy(0,24);打破;}开关(c){caseup://向上走if(map[x-1][y]!=wall)。
C++实现简单⾛迷宫的代码本⽂实例为⼤家分享了C++实现⾛迷宫的具体代码,供⼤家参考,具体内容如下⽤n*n个⼩⽅格代表迷宫,每个⽅格上有⼀个字符0或1,0代表这个格⼦不能⾛,1代表这个格⼦可以⾛。
只能⼀个格⼦⼀个⾛,⽽且只能从⼀个格⼦向它的上、下、左、右四个⽅向⾛,且不能重复。
迷宫的⼊⼝和出⼝分别位于左上⾓和右下⾓,存在唯⼀的⼀条路径能够从⼊⼝到达出⼝,试着找出这条路径。
例如,下图是⼀个迷宫,红⾊表⽰⾛出迷宫的⼀条路径输⼊:⼊⼝坐标(startX,startY),出⼝坐标(endX,endY)输出:如果存在这样⼀条路径,则输出1,并输出路径(0,0)->(1,0)->(1,1)->(2,1)->(2,2)->(3,2)->(4,2)->(5,2)->(5,3)->(5,4)->(5,5)->(4,5)->(4,6)->(4,7)->(5,7)->(6,7)->(7,7)思路:利⽤回溯法求解。
⾸先,根据输⼊在矩阵中找到路径的起点。
假设矩阵中某个格⼦的字符为1,就往相邻的格⼦寻找字符为1的格⼦。
除了在矩阵边界上的格⼦之外,每个格⼦都有4个相邻的格⼦。
重复这个过程直到在矩阵中找到相应的出⼝位置。
当在矩阵中定位了路径上n个格⼦的位置后,在与第n个格⼦周围都没有找到第n+1个格⼦为1,则只好在路径上回到第n-1个格⼦,重新去寻找第n个字符为1的格⼦由于路径不能重复进⼊格⼦,我们需要定义⼀个字符矩阵⼀样⼤⼩的布尔值矩阵,⽤来标记路径是否已经进⼊了相应格⼦。
代码实现如下#include <iostream>#include <vector>using namespace std;class Solution {public:bool hasPath(char* matrix, int rows, int cols, int startX,int startY, int endX, int endY,vector<int>& Path){if (matrix == NULL || rows < 1 || cols < 1 || startX<0||startY<0||endX<0||endY<0||(startX==endX&&startY==endY))return false;bool* visited = new bool[rows*cols]; //定义⼀个辅助矩阵,⽤来标记路径是否已经进⼊了每个格⼦memset(visited, 0, rows*cols);int pathLength = 0;if (hasPathCore(matrix, rows, cols, startX, startY, endX, endY, visited, Path)){return true;}delete[] visited;return false;}/*此函数⽤来判断在当前路径满⾜条件下,相邻格⼦中是否存在⼀个格⼦满⾜条件*/bool hasPathCore(char* matrix, int rows, int cols, int row, int col, int endX, int endY, bool* visited, vector<int>& Path) {if ((row == endX) && (col == endY)&&(matrix[row*cols+col]=='1')){Path.push_back(endY);Path.push_back(endX);return true;}bool hasPath = false;if (row >= 0 && row < rows&&col >= 0 && col < cols&&matrix[row*cols + col] == '1' && !visited[row*cols + col]){// ++pathLength;visited[row*cols + col] = true;Path.push_back(col);Path.push_back(row);/*如果矩阵格⼦(row,col)字符为1时,从它的4个相邻格⼦中寻找下⼀个字符为1的格⼦*/hasPath = hasPathCore(matrix, rows, cols, row, col - 1, endX, endY, visited,Path) ||hasPathCore(matrix, rows, cols, row - 1, col, endX, endY, visited,Path) ||hasPathCore(matrix, rows, cols, row, col + 1, endX, endY, visited,Path) ||hasPathCore(matrix, rows, cols, row + 1, col, endX, endY, visited,Path);if (!hasPath) //如果没找到,则说明当前第n个格⼦定位不正确,返回上⼀个位置重新定位{visited[row*cols + col] = false;Path.pop_back();Path.pop_back();}}return hasPath;}};int main(){// char* matrix = "abcesfcsadee";char* matrix = "1000000110110001101000010111011110100000010000001"; //设置迷宫int startX, startY, endX, endY;cin >> startX >> startY >> endX >> endY; //输⼊起始结束坐标Solution s;vector<int> Path;bool re = s.hasPath(matrix, 7, 7, startX,startY,endX,endY,Path);cout << re << endl;for (int i = 0; i < Path.size();)cout << "(" << Path[i++] << ',' << Path[i++] << ")" << " ";cout << endl;return 0;}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
简单的迷宫小游戏C语言程序源代码
#include <stdio.h>
#include <conio.h>
#include <windows.h> #include <time.h>
#define Height 31 //迷宫的高度,必须为奇数 #define Width 25 //迷宫的
宽度,必须为奇数 #define Wall 1
#define Road 0
#define Start 2
#define End 3
#define Esc 5
#define Up 1
#define Down 2
#define Left 3
#define Right 4
int map[Height+2][Width+2]; void gotoxy(int x,int y) //移动坐标
{
COORD coord;
coord.X=x;
coord.Y=y;
SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord );
}
void hidden()//隐藏光标
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cci; GetConsoleCursorInfo(hOut,&cci);
cci.bVisible=0;//赋1为显示,赋0为隐藏SetConsoleCursorInfo(hOut,&cci);
}
void create(int x,int y) //随机生成迷宫 {
int c[4][2]={0,1,1,0,0,-1,-1,0}; //四个方向 int i,j,t;
//将方向打乱
for(i=0;i<4;i++)
{
j=rand()%4;
t=c[i][0];c[i][0]=c[j][0];c[j][0]=t;
t=c[i][1];c[i][1]=c[j][1];c[j][1]=t;
}
map[x][y]=Road;
for(i=0;i<4;i++)
if(map[x+2*c[i][0]][y+2*c[i][1]]==Wall)
{
map[x+c[i][0]][y+c[i][1]]=Road;
create(x+2*c[i][0],y+2*c[i][1]);
}
}
int get_key() //接收按键
{
char c;
while(c=getch()) {
if(c==27) return Esc; //Esc
if(c!=-32)continue; c=getch();
if(c==72) return Up; //上
if(c==80) return Down; //下
if(c==75) return Left; //左
if(c==77) return Right; //右
}
return 0;
}
void paint(int x,int y) //画迷宫 { gotoxy(2*y-2,x-1); switch(map[x][y]) { case Start:
printf("入");break; //画入口
case End:
printf("出");break; //画出口
case Wall:
printf("※");break; //画墙
case Road:
printf(" ");break; //画路
}
}
void game()
{
int x=2,y=1; //玩家当前位置,刚开始在入口处 int c; //用来接收按键while(1)
{
gotoxy(2*y-2,x-1); printf("?"); //画出玩家当前位置
if(map[x][y]==End) //判断是否到达出口
{
gotoxy(30,24); printf("到达终点,按任意键结束");
getch();
break;
}
c=get_key(); if(c==Esc)
{
gotoxy(0,24); break;
}
switch(c)
{
case Up: //向上走
if(map[x-1][y]!=Wall)
{
paint(x,y); x--;
}
break;
case Down: //向下走
if(map[x+1][y]!=Wall)
{
paint(x,y); x++;
}
break;
case Left: //向左走
if(map[x][y-1]!=Wall)
{
paint(x,y); y--;
}
break;
case Right: //向右走
if(map[x][y+1]!=Wall)
{
paint(x,y); y++;
}
break;
}
}
}
int main()
{
int i,j;
srand((unsigned)time(NULL)); //初始化随即种子 hidden(); //隐藏光标
for(i=0;i<=Height+1;i++) for(j=0;j<=Width+1;j++)
if(i==0||i==Height+1||j==0||j==Width+1) //初始化迷宫 map[i][j]=Road;
else map[i][j]=Wall;
create(2*(rand()%(Height/2)+1),2*(rand()%(Width/2)+1)); //从随机一个点开始生成迷
宫,该点行列都为偶数
for(i=0;i<=Height+1;i++) //边界处理 {
map[i][0]=Wall;
map[i][Width+1]=Wall; }
for(j=0;j<=Width+1;j++) //边界处理
{
map[0][j]=Wall;
map[Height+1][j]=Wall; }
map[2][1]=Start; //给定入口
map[Height-1][Width]=End; //给定出口 for(i=1;i<=Height;i++)
for(j=1;j<=Width;j++) //画出迷宫
paint(i,j);
game(); //开始游戏
getch();
return 0;
}。