问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

跪求老鼠走迷宫游戏,必须用C++编写,用栈来实现,因为是数据结构课程设计所以只要现成代码,越快越好。

发布网友 发布时间:2022-05-12 00:28

我来回答

4个回答

懂视网 时间:2022-05-12 04:50

这篇文章主要介绍了关于使用canvas实现迷宫游戏,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

前言

(最近设计模式看的有点头大,一直面对纯js实在是有些枯燥-_-。所以写一点有趣的东西调剂一下)
现在canvas已经不算新鲜了,不过由于日常业务中并不常用,所以实践并不多,今天分享一下,如何实现简单canvas迷宫。这个例子来源于《html5秘籍》第二版,代码有稍微做了点调整。

由于中间有一步使用canvas获取图片信息的时候,必须使用服务器环境。所以我先写了一个样例扔在服务器上,大家可以先体验一下效果(用成就感作为驱动力哈哈哈)

正文

实现这个小游戏也不难,让我们想想,一个迷宫游戏有哪些基本要素。

首先当然得有个地图,然后得有个移动的小人,这两个我们利用cavans来绘制;

接下来是物体移动的程序,这个程序主要包括2个方面:

1.让物体跟我们指定的指令来移动;
2.检测物体是否碰到墙体或者出口。

绘制迷宫的地图和移动的小人

绘制地图的主要步骤是:

  1. 获取一张地图的图片

  2. 利用cavans绘制图像。

迷宫地图的生成,可以借助谷歌的一个迷宫在线生成器来获得。

绘制小人也是一样直接找一个小人的图片即可,不过这里要注意的是,要找正方形的图片,因为一会我们需要做移动的碰撞检测,方形比较好判断。

接下来就要写绘制迷宫和小人的主要函数

function drawMaze(mazeFile, startingX, startingY) {
 var imgMaze = new Image()
 imgMaze.onload = function () {
 // 画布大小调整
 canvas.width = imgMaze.width
 canvas.height = imgMaze.height

 // 绘制笑脸
 var imgFace = document.getElementById("face")
 context.drawImage(imgMaze, 0, 0)

 x = startingX
 y = startingY
 context.drawImage(imgFace, x, y)
 context.stroke()
 }
 imgMaze.src = mazeFile
}

mazeFile是迷宫的图片地址,startingXstartingY,是起始点的坐标。在这里图片引入的方式用了2种,原因是小人的图片我不经常更换,就直接写在页面里,迷宫的地图打算做成可变的,所以在js里引入,你想把图片都直接用js引入也没有问题。其他部分比较简单,不再赘述。

移动函数

移动的主要原理是:
接受指定的用户输入(在这里是响应方向键),转换成对应的移动指令。然后周期性的检查移动指令,绘制对应的目标位置。举个简单的例子:

比如每按下一次方向键上,就记录下应该往上移动,然后每隔100毫秒检查当前的移动指令,绘制应该移动的目标地点,重复这个过程。代码也比较简单:

// 移动函数
function processKey(e) {
 dx = 0
 dy = 0
 // 上下左右方向键检测
 if (e.keyCode === 38) {
 dy = -1
 }
 if (e.keyCode === 40) {
 dy = 1
 }
 if (e.keyCode === 37) {
 dx = -1
 }
 if (e.keyCode === 39) {
 dx = 1
 }
}

// 绘制帧
function drawFrame() {
 if (dx != 0 || dy != 0) {
 // context.clearRect(x,y,canvas.width,canvas.height)
 // 绘制移动轨迹
 context.beginPath();
 context.fillStyle = "rgb(254,244,207)"
 context.rect(x, y, 15, 15)
 context.fill()
 x += dx
 y += dy
 // 碰撞检测
 if (checkForCollision()) {
 x -= dx
 y -= dy
 dx = 0
 dy = 0
 }
 
 //绘制小人应该移动的地点
 var imgFace = document.getElementById('face')
 context.drawImage(imgFace, x, y)

 if (canvas.height - y < 17) {
 // isFirst = false
 alert('恭喜你通关 游戏结束')
 return false
 }
 // 这里如果重置的话变成非自动移动,也就是每按下一次方向键只前进一步,由于目前体验不好所以先不做重置
 // dx = 0
 // dy = 0
 }
 setTimeout(drawFrame, 20)
}

上述代码中,移动函数比较简单,绘制帧的函数里面比较重要的就是碰撞检测函数,在下面详细解释。

碰撞检测

要检测物体与墙体是否碰撞,通常情况是要先把地图信息保存到内存里,然后在移动物体时检测是否与当前的某个墙体碰撞,但是由于我们的地图背景是黑白迷宫,所以可以使用颜色来检测碰撞。具体的做法是:

获取当前物体的坐标位置,利用canvas检测当前地图上这个位置的颜色是否为黑色,如果是,说是是墙体,不应该执行移动,下面就是代码:

function checkForCollision() {
 var imageData = context.getImageData(x - 1, y - 1, 15 + 2, 15 + 2)
 var pixels = imageData.data

 for (var i = 0, len = pixels.length; i < len; i++) {
 var red = pixels[i],
 green = pixels[i + 1]
 blue = pixels[i + 2]
 alpha = pixels[i + 3]

 // 检测是否碰到黑色的墙
 if (red === 0 && green === 0 && blue === 0) {
 return true
 }
 }
 return false
}

在这里,15是小人的宽度,我们检测小人两侧各1px范围(对应代码中的getImageData(x - 1, y - 1, 15 + 2, 15 + 2)可以稍微思考下这里为什么是+2),如果是黑色,说明检测到碰撞。

其余

在代码里,我加了一些其他的功能,比如提示答案等。至于更换地图也比较简单:把地图对应的文件地址,起点坐标,答案图片路径等存在一个对象里,然后设置一个地图数组,点击的时候切换地图并重新渲染就可以了。还有一些值得优化的地方,比如:

  1. 碰撞检测在拐弯的地方体验不佳;

  2. 当前情况运行时有轨迹,在答案模式下应该如何去掉轨迹?

有兴趣的同学可以试着自己实现下。

小结

这个例子相对比较简单,对js的要求不高,拿来玩一下还是挺不错的。

热心网友 时间:2022-05-12 01:58

#include "stdafx.h"

#include <stack>

using namespace std;

const int rows = 8,cols = 8;

HINSTANCE hInst;

HBITMAP ball;

HDChdc,mdc,bufdc;

HWNDhWnd;

DWORDtPre,tNow;

char*str;

intnowPos,prePos;

boolfind;

stack<int> path;


int mapIndex[rows*cols] = { 0,2,0,0,0,0,0,0,   //材1&#59049;

0,1,0,1,1,1,1,0,   //材2&#59049;

0,1,0,1,0,1,1,0,   //材3&#59049;

0,1,0,0,0,1,1,0,   //材4&#59049;

0,1,1,1,1,1,1,0,   //材5&#59049;

0,1,0,0,0,0,1,0,   //材6&#59049;

0,0,1,1,1,1,1,0,   //材7&#59049;

0,0,0,0,0,0,3,0 }; //材8&#59049;

int  record[rows*cols];

ATOMMyRegisterClass(HINSTANCE hInstance);

BOOLInitInstance(HINSTANCE, int);

LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM);

voidMyPaint(HDC hdc);


int APIENTRY WinMain(HINSTANCE hInstance,

                     HINSTANCE hPrevInstance,

                     LPSTR     lpCmdLine,

                     int       nCmdShow)

{

MSG msg;


MyRegisterClass(hInstance);



if (!InitInstance (hInstance, nCmdShow)) 

{

return FALSE;

}


    while( msg.message!=WM_QUIT )

    {

        if( PeekMessage( &msg, NULL, 0,0 ,PM_REMOVE) )

        {

            TranslateMessage( &msg );

            DispatchMessage( &msg );

        }

else

{

tNow = GetTickCount();

if(tNow-tPre >= 100)

MyPaint(hdc);

}

    }

return msg.wParam;

}


//****注册窗口*************************

ATOM MyRegisterClass(HINSTANCE hInstance)

{

WNDCLASSEX wcex;


wcex.cbSize = sizeof(WNDCLASSEX); 

wcex.style= CS_HREDRAW | CS_VREDRAW;

wcex.lpfnWndProc= (WNDPROC)WndProc;

wcex.cbClsExtra= 0;

wcex.cbWndExtra= 0;

wcex.hInstance= hInstance;

wcex.hIcon= NULL;

wcex.hCursor= NULL;

wcex.hCursor= LoadCursor(NULL, IDC_ARROW);

wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);

wcex.lpszMenuName= NULL;

wcex.lpszClassName= "canvas";

wcex.hIconSm= NULL;


return RegisterClassEx(&wcex);

}


//****初始化*************************************


BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

HBITMAP bmp;

hInst = hInstance;


hWnd = CreateWindow("canvas", "迷宫" , WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);


if (!hWnd)

{

return FALSE;

}


MoveWindow(hWnd,10,10,430,450,true);

ShowWindow(hWnd, nCmdShow);

UpdateWindow(hWnd);

hdc = GetDC(hWnd);

mdc = CreateCompatibleDC(hdc);

bufdc = CreateCompatibleDC(hdc);


bmp = CreateCompatibleBitmap(hdc,cols*50,rows*50);

SelectObject(mdc,bmp);


HBITMAP tile;

int rowNum,colNum;

int i,x,y;


tile = (HBITMAP)LoadImage(NULL,"tile.bmp",IMAGE_BITMAP,50,50,LR_LOADFROMFILE);

ball = (HBITMAP)LoadImage(NULL,"ball.bmp",IMAGE_BITMAP,50,50,LR_LOADFROMFILE);


for (i=0;i<rows*cols;i++)

{

record[i] = mapIndex[i];


rowNum = i / cols;

colNum = i % cols;

x = colNum * 50;

y = rowNum * 50;

SelectObject(bufdc,tile);


if(!mapIndex[i])

BitBlt(mdc,x,y,50,50,bufdc,0,0,SRCCOPY);

else

{

  if(mapIndex[i] == 2)

{

nowPos = i;

path.push(i);

record[i] = 0;

}

BitBlt(mdc,x,y,50,50,bufdc,0,0,WHITENESS);

}

}

prePos = cols * rows + 1;


MyPaint(hdc);


return TRUE;

}


//****核心代码*********************************

void MyPaint(HDC hdc)

{

int rowNum,colNum;

int x,y;

int up,down,left,right;



rowNum = prePos / cols;

colNum = prePos % cols;

x = colNum * 50;

y = rowNum * 50;


SelectObject(bufdc,ball);

BitBlt(mdc,x,y,50,50,bufdc,0,0,WHITENESS);



rowNum = nowPos / cols;

colNum = nowPos % cols;

x = colNum * 50;

y = rowNum * 50;


SelectObject(bufdc,ball);

BitBlt(mdc,x,y,50,50,bufdc,0,0,SRCCOPY);


if(!find)

{

str = "迷宫入口";


up    = nowPos - cols;

down  = nowPos + cols;

left  = nowPos - 1;

right = nowPos + 1;


if(up>=0 && record[up])

{

path.push(up);

record[up] = 0;

prePos = nowPos;

nowPos = up;


        if(mapIndex[nowPos] == 3)

find = true;

}

else if(down<=cols*rows-1 && record[down]) 

{

path.push(down);

record[down] = 0;

prePos = nowPos;

nowPos = down;


if(mapIndex[nowPos] == 3)

find = true;

}

else if(left>=rowNum*cols && record[left])  

{

path.push(left);

record[left] = 0;

prePos = nowPos;

nowPos = left;


if(mapIndex[nowPos] == 3)

find = true;

}

else if(right<=(rowNum+1)*cols-1 && record[right])  

{

path.push(right);

record[right] = 0;

prePos = nowPos;

nowPos = right;


if(mapIndex[nowPos] == 3)

find = true;

}

else

{

if(path.size() <= 1)//&#59076;&#59343;&#58864;&#58892;

str = "xxxxx";

else

{

path.pop();

prePos = nowPos;

nowPos = path.top();

}

}

}

else

{

str = "找到出口";

}


TextOut(mdc,0,0,str,strlen(str));

BitBlt(hdc,10,10,cols*50,rows*50,mdc,0,0,SRCCOPY);


tPre = GetTickCount();

}


//****消息函数***********************************

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

switch (message)

{

case WM_KEYDOWN:

if(wParam==VK_ESCAPE)

PostQuitMessage(0);

break;

case WM_DESTROY:

DeleteDC(mdc);

DeleteDC(bufdc);

DeleteObject(ball);


ReleaseDC(hWnd,hdc);


PostQuitMessage(0);

break;

default:

return DefWindowProc(hWnd, message, wParam, lParam);

   }

   return 0;

}



//  可以运行   请采纳   

有不懂的可以联系我

这个可是标准c++的   这是结果

这是源代码 

热心网友 时间:2022-05-12 03:16

当你进入地图:1表示无法通行,0代表差强人意,自动增加边框(墙),网格的左侧和左上角到右下角的右侧的一个网格入口出口
编译的代码如下:
 
#包括 
#包括 
#N 50 
 
数组的迷宫; 
诠释行; 
整数关口; 
 
 int的堆栈[50] ;/ /堆栈
 
无效CreateMaze存储路径()/ /动态创建的迷宫
 {
 INT I,J; 
 printf的(“请输入的迷宫的行数:”); <BR / scanf函数(“%d”,&行); 
 
 printf的(“请输入迷宫的列数:”); 
 scanf的(“%d”,&COL) 
 
(行<= 0 | | COL <= 0)
 {
 printf的(“请输入行或列的数量是不符合规则的! \ n“); 
出口(1); 

 
 / /动态地创建一个二维数组的指针的指针
迷宫=(INT *)malloc的((2行)*表示sizeof(int *)); 
为(i = 0;我行+2,我+ +)
 {
迷宫[ ] =(*)malloc的((山坳+2)*表示sizeof(int)); 

 / /添加侧壁
(i = 0;我行+2;我+ +)
 
 {
迷宫[I] [0] = 1; 
迷宫[I] [COL +1] = 1; 
} <BR / (i = 0; <山坳+2;我+ +)
 {
(== 1)
 {
迷宫[0] [] = 0; 

其他迷宫[0] [I] = 1; 
(== COL)
 {
迷宫[行+1] [COL ] = 0; 

其他迷宫行+1]在[i] = 1; 

 
(i = 1; <=行; + +)
 {
 
为(J = 1; <=山坳; + +)
 {
 printf(“请输入第%d行%d号:\ n“,I,J); 
 scanf的(”%d“,&迷宫[I] [J]); 

 
}  BR /> 
 / /输入电流和侧壁的迷宫,以验证输入的是正确
 printf的(“请输入完毕!电流和侧壁的迷宫:\ n”); />(i = 0;我行+2,我+ +)
 {
为(J = 0,J <山坳+2; J + +)
 { />输出(“%d”,迷宫[I] [J]); 

 printf的(“\ n”); 


  BR />的无效ShowMaze()/ /输出迷宫
 {
 INT I,J; 
(i = 1; <=行,我+ +)
 { BR />(J = 1; <=山坳; + +)
 {
 printf的(“%d”,迷宫[I] [J]); 

 printf(“请\ n”); 


 
 / /释放的迷宫阵列
无效DestroyMaze()
 {
 >; 
为(i = 0;我行+2,我+ +)
(迷宫[I]); 
免费(迷宫); 

 
 / /的DFS方法来实现回溯找到迷宫路径的解决方案
 
 FindPath()
 {
 INT I,J,K ,计数,X,Y,方向; 
 
计数= 0; 
 X = 1,Y = 1; 
方向= 0; 
 J = 0,K表= 0; 
 
为(i = 0; <N; + +)
 {
堆栈[I] = 0; 

 i = 0; 
(1)
 {
计数= 0 ;/ /计算,以确定是否有很长的路要走
 {
(X = 
迷宫= 1 && Y == 1)[X] [Y] = 2; 
(迷宫[X] [Y +1] == 0)/ /东
 { 
计数+ +; 
迷宫[X] [Y +1] = 2; 
 Y = Y +1; 
栈[我] = -1; 
 i + +; 
(X =行&& Y == COL)
返回1; 

其他(迷宫[+1] [Y] == 0)/ /南
 {
(迷宫[+1] [Y] == 0)
计数+ +; 
 {
迷宫[X + 1] [Y] = 2; 
 X = X +1; 
栈[I] = -2; 
我+ +; 
(X =行&&? == COL)返回1 
 


其他(迷宫[X] [Y-1] == 0)/ /西
 { BR />数+ +; 
(迷宫[X] [Y-1] == 0)
 {
迷宫[X] [Y-1] = 2; 
 > Y = Y-1; 
栈[I] = -3; 
 + +; 
(X =行&& Y == COL)
返回1; 


其他(迷宫[-1] [Y] == 0)/ /北
 {
数+ +; 
如果(迷宫〔x-1] [Y] == 0)
 {
迷宫〔x-1] [] = 2; 
 = x-1的; 
栈[我] = -4; 
 + +; 
(X =行&& Y == COL)返回1 
 

}  BR />} 
(数== 0)
 {
(<0)
返回0; 
方向=堆栈[ - ]; BR />开关(方向)
 {
情况下,-1:Y = Y-1;突破; 
情况下,-2:X = X-1;突破; 
情况下 - 3:Y = Y +1;突破; 
情况下-4:X = X +1;突破; 
默认值:打破; 


}  BR />} 
 
廉政的main()
 {
 CreateMaze(); 
(FindPath())
 
 { BR /> printf的(“已找到了一条路径,如下所示:\ n”); 
 ShowMaze(); 

其他
 {
 printf的(“不在正确的道路上走出迷宫!\ n“); 
 
}} 
 DestroyMaze();
 //没啥区别 把printf改成cout scanf改成cin

追问乱七八糟的,你学过C++和数据结构吗,麻烦问一句你到百度上搜过了吗???

追答

帮你找到 不行也别喷我 一片好意 谢谢

热心网友 时间:2022-05-12 04:50

#include <stdio.h>
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <time.h>
using namespace std;
#define Height 25//高度,必须为奇数
#define Width 25 //宽度,必须为奇数
#define Wall 1 //用1表示墙
#define Road 0 //用0表示路
#define Start 2
#define End 3
#define up 72
#define down 80
#define left 75
#define right 78
#define flag 5
int map[Height+2][Width+2];
int x=2,y=1; //玩家当前位置,刚开始在入口处

class Migong
{
public:
void gotoxy(int x,int y); //移动坐标的函数声明
void shengcheng(int x,int y); //随机生成迷宫的函数声明
void display(int x,int y); //显示迷宫的函数声明
void chushi(); //初始化迷宫的函数声明
};

class Wanjia:public Migong //玩家类由迷宫类派生来
{
public:

void gonglue(int x,int y);
void shang(int x,int y);
void xia(int x,int y);
void zuo(int x,int y);
void you(int x,int y);
void game(); //游戏运行包括移动的函数声明
};

void Migong::gotoxy(int x,int y) //移动坐标 这是使光标 到(x,y)这个位置的函数.调用 COORD 需要#include.
{
COORD coord;
coord.X=x;
coord.Y=y;
SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord );
}

void Migong::shengcheng(int x,int y) //随机生成迷宫
{
int c[4][2]={0,1,1,0,0,-1,-1,0}; //四个方向 //数组c 0 1 向右
// 1 0 向下
// -1 0 向上
// 0 -1 向左

int i,j,t;
//将方向打乱
for(i=0;i<4;i++)
{
j=rand()%4; //随机生成j
t=c[i][0];c[i][0]=c[j][0];c[j][0]=t; //将c[i][0]和c[j][0]交换
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) //沿c[i][0]、c[i][1]方向前2步如果是墙
{
map[x+c[i][0]][y+c[i][1]]=Road; //让该方向前一步设为路
shengcheng(x+2*c[i][0],y+2*c[i][1]); //在该方向前两步继续生成地图 因为这里是递归函数,当执行到最后一点发现都不能走的时候,
//会返回到上一个函数,也就是上一个点,再次判断是否可以产生地图 ,知道地图上所有点被遍历完。
}
}
void Migong::display(int x,int y) //显示迷宫
{
gotoxy(2*y-2,x-1);
switch(map[x][y])
{
case Start:
cout<<"入";break; //显示入口
case End:
cout<<"出";break; //显示出口
case Wall:
cout<<"■";break; //显示墙
case Road:
cout<<" ";break; //显示路
case up:
cout<<"↑";break; //在攻略中的标记 下同
case down:
cout<<"↓";break;
case left:
cout<<"←";break;
case right:
cout<<"→";break;
case flag:
cout<<" ";break; //标记,防止攻略遍历时候无线循环
}
}

void Migong::chushi()
{
int i,j;
srand((unsigned)time(NULL)); //初始化随机种子
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;
shengcheng(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++) //i初始为1,结束为height,以免画出外围
for(j=1;j<=Width;j++) //画出迷宫 同上
display(i,j);
}

void Wanjia::game()
{
int x=2,y=1; //玩家当前位置,刚开始在入口处
int c; //用来接收按键
while(1)
{
gotoxy(2*y-2,x-1);
cout<<"☆"; //画出玩家当前位置
if(map[x][y]==End) //判断是否到达出口
{
gotoxy(30,24); //到达此坐标
cout<<"到达终点,按任意键结束";

getch();
break;
c=getch();
}
if(c!=-32)
{
c=getch();
switch(c)
{
case 72: //向上走
if(map[x-1][y]!=Wall)
{
display(x,y);
x--;

}
break;
case 80: //向下走
if(map[x+1][y]!=Wall)
{
display(x,y);
x++;

}
break;
case 75: //向左走
if(map[x][y-1]!=Wall)
{
display(x,y);
y--;

}
break;
case 77: //向右走
if(map[x][y+1]!=Wall)
{

display(x,y);
y++;

}
break;
case 112: //按下P
gonglue(2,1);break; //如果按下P执行攻略函数
}
}
}
}
void Wanjia::shang(int x,int y)
{
if(map[x][y]==End) //判断是否到达出口
{
gotoxy(52,20); //到达此坐标
cout<<"到达终点,按任意键结束";

getch();
exit(0);
}
if(map[x-1][y]!=Wall&&map[x-1][y]!=up&&map[x-1][y]!=down&&map[x-1][y]!=left&&map[x-1][y]!=right&&map[x-1][y]!=flag)
{ //当移动后的下一个位置没有被走过且不是墙

map[x][y]=up;
display(x,y);
x--;
gonglue(x,y); //递归,攻略下一个点
}
}
void Wanjia::xia(int x,int y)
{
if(map[x][y]==End) //判断是否到达出口
{
gotoxy(52,20); //到达此坐标
cout<<"到达终点,按任意键结束";

getch();
exit(0);
}
if(map[x+1][y]!=Wall&&map[x+1][y]!=up&&map[x+1][y]!=down&&map[x+1][y]!=left&&map[x+1][y]!=right&&map[x+1][y]!=flag) //当移动后的下一个位置没有被走过且不是墙
{

map[x][y]=down;
display(x,y);
x++;
gonglue(x,y); //递归,攻略下一个点
}
}
void Wanjia::zuo(int x,int y)
{
if(map[x][y]==End) //判断是否到达出口
{
gotoxy(52,20); //到达此坐标
cout<<"到达终点,按任意键结束";
getch();
exit(0);
}
if(map[x][y-1]!=Wall&&map[x][y-1]!=up&&map[x][y-1]!=down&&map[x][y-1]!=left&&map[x][y-1]!=right&&map[x][y-1]!=flag) //当移动后的下一个位置没有被走过且不是墙
{

map[x][y]=left;
display(x,y);
y--;

gonglue(x,y); //递归,攻略下一个点
}
}
void Wanjia::you(int x,int y)
{
if(map[x][y]==End) //判断是否到达出口
{
gotoxy(52,20); //到达此坐标
cout<<"到达终点,按任意键结束";
getch();
exit(0);
}
if(map[x][y+1]!=Wall&&map[x][y+1]!=up&&map[x][y+1]!=down&&map[x][y+1]!=left&&map[x][y+1]!=right&&map[x][y+1]!=flag) //当移动后的下一个位置没有被走过且不是墙
{

map[x][y]=right;
display(x,y);
y++;
gonglue(x,y); //递归,攻略下一个点
}
}
void Wanjia::gonglue (int x,int y)
{
gotoxy(2*y-2,x-1);
cout<<"☆"; //画出玩家当前位置
if(map[x][y]==End) //判断是否到达出口
{
gotoxy(52,20); //到达此坐标
cout<<"到达终点,按任意键结束";
getch();
exit(0);
}
shang(x,y); //上下左右
xia(x,y);
zuo(x,y);
you(x,y);
map[x][y]=flag; //当上下左右都无法走的时候,即为死路,因为递归函数开始向后,所以讲死路点值置为flag,变成无形之墙。
display(x,y);
}

int main()
{
cout<<" 移动迷宫 "<<endl;
cout<<"--------------------"<<endl;
cout<<"欢迎来到移动迷宫游戏"<<endl;
cout<<"--------------------"<<endl;
cout<<"游戏说明:给定一出口和入口"<<endl;
cout<<"玩家控制一个五角星(☆)从入口走到出口"<<endl;
cout<<"系统会记录你所走的步数"<<endl;
cout<<"按回车进入游戏";
cout<<"(按下P键可以获得攻略。)";
getch();
system("cls"); //清屏函数 ,清除开始界面
Wanjia w1;
w1.chushi();
w1.game(); //开始游戏
// w1.gonglue(2,1); //功略显示
getch();
return 0;
}

————————————————
版权声明:本文为CSDN博主「失落之风」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41572774/java/article/details/84035598
对不起,本人能力有限,希望大家能支持
...编写,用栈来实现,因为是数据结构课程设计所以只要现成代码,越快越好...

hWnd = CreateWindow("canvas", "迷宫" , WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);if (!hWnd)

C++设计一个迷宫并走出来

栈结构用一个类(CPointStack)实现,声明如下:class CPointStack { public:void ClearStack();//清空栈 void InitStack();//初始化栈 bool Pop(POINT &amp;pt);//弹出顶端元素,并给出该点的坐标,返回是否弹出成功 bool Push(POINT pt);//将pt点的信息压入栈,返回是否压入成功 CPointStack()...

关于数据结构的问题,用C语言描述

1.设一函数f(x,y)=(1+A*(e^B/cosθ)*(1+C*(cosψ)^2),其中θ=(π*x)/180,ψ=(π*y)/180,参数A=-0.5,B=-0.4,C=-0.1。x从0变化到89,步长为1,y从0变化到359,步长为1。采用一种数据结... 1. 设一函数 f(x,y)=(1+A*(e^B/cosθ)*(1+C*(cosψ)^2),其中θ=(π*x)/18...

《数据结构 课程设计》表达式求值 实验报告

数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。在这次的课程设计中我选择的题目是算术表达式求值演示。表达式计算是实现程序设计语言...

现在常用编程最简单的语言(简单编程语言有哪几种)

一、C\C++\C#(ASP.NET) 二、JAVA(J2SE\J2EE\J2ME\JSP) 走这两条路都必学的:数据结构、数据库(SQL或Oracle) 选学:计算机应用基础、网络基础、硬件基础。 C是学习高级语言的基础;C++主要用于编写大型软件核心代码和汇编一样,比较难学,不过学好了后,很有前途;C#主要用于编写一些系统软件,比如游戏引擎核心代码,...

少儿编程需要学什么语言?

因为太难的孩子根本就不可能彻底理解!就比如我孩子,现在五年级,给他学算法、数据结构,孩子理解起来确实是有难度的。别说这些了,就算是编程语言语法部分的比如指针、堆栈等等孩子也是一头雾水!学的时候貌似都听“明白”了,但是实际上根本就不会用!但是年龄大点之后接受起来就会容易很多。 因此我认为,不差钱而且孩子...

求数据结构(用面向对象方法与C++语言描述)第二版 殷人昆主编 课后答案...

(2)C (3)C17、对,错,对数据结构课程设计指导书 一、设计内容 1.飞机订票系统(限1 人完成)【问题描述】设计一个飞机订票系统,可以模拟处理飞机订票过程中的各种操作。【基本要求】通过此系统可以实现如下功能: 1)录入 可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)。 2)查询 可以查...

JAVA是什么软件,有什么用?

要称作一个通用的计算机语言,Java是最适合不过的,这意味着它可以在所有的计算机上运行,(尽管需要为各种机器编写Java虚拟机软件),可以根据需要提供软部件,并且具有内在的安全机制。用Java编写的操作系统,称为JavaOS,是个基于语言的操作系统,它看起来似乎没有机会来占据PC市场。但是它为Microsoft ...

学编程到底是学C语言、C++、VB、jave中的哪种比较好?

走这两条路都必学的:数据结构、数据库(SQL或Oracle) 选学:计算机应用基础、网络基础、硬件基础。C是学习高级语言的基础;C++主要用于编写大型软件核心代码和汇编一样,比较难学,不过学好了后,很有前途;C#主要用于编写一些系统软件,比如游戏引擎核心代码,编写比较简单,界面比较友好;ASP.NET主要是用C#语言编写开发网站(...

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
福州樱花国际日语学校的外教、中教老师好吗?教学能力怎么样? 大连樱花国际日语学校怎么样? 最近想学日语,大连樱花日语国际学校怎么样啊? 大连中山樱花学校怎么样?听说他们的老师经常换?还打着樱花国际的名字招... 板栗在冬天怎么种植冬天怎么种植板栗 板栗每年浇水在什么季节? 继续教育是一指什么 三更擒小贼是什么意思 什么是我国经济发展的基本立足点和长期战略方针 齐武帝萧赜:南朝齐第二位皇帝,他的一生经历了什么? 30度太阳天可以移栽玉米苗吗? 瑜伽到底减不减肥啊~~ 交强险中的被保险人是什么意思 水中瑜伽减肥怎么练? 夏季天气炎热玉米苗管理很重要,夏季玉米苗要注意哪些? 练瑜珈真的能瘦身吗? 交强险中的“本车人员和被保险人”如何理解? 玉米苗不长是怎么回事,怎样治疗? 《英雄联盟》定位赛第一把多重要? 相机滤镜上有f-pro的是啥滤镜? ps如何添加mask pro滤镜 OPPO Find X3 Pro的大师滤镜怎么使用? 滤镜上的缩写 pro 是什么意思 菜板颜色与切菜有什么关系 哥弟AMASS 阿玛施的男士皮带一般价位是多少? 的做法,葱花手撕饼怎么做好吃,葱花手撕饼的家常做法 手撕饼怎样做才能层次分明,香软好吃,这里有诀窍 东莞长安哪里最繁荣? 东莞南城最繁华的地方是哪一地区? 小米手机MIUI8系统怎么把软件移到sd卡上 请问小米手机的原生安卓系统安装包在哪里下啊? 张家港哪家面馆最好吃 江南巧面馆 花园路店怎么样 泰兴哪里的面食,最好吃? 娥娥的详细解释 嫦娥的’娥’ .可以怎么组词 四季养生谚语 嫦娥奔月的故事是怎样的? 月亮上真的有嫦娥吗? 故事‘嫦娥奔月’的故事 有关她的故事如嫦娥奔月等 《回眸》盈盈楼上女 皎皎当窗。。 娥娥红粉妆 纤纤出素手 描写的是那位女子?是不是杨玉环 喉咙痛适宜喝热水还是凉水? 喉咙发炎喝热水好还是冷水好 手机短信货到付款骗人的东西 我可以拒收么 淘宝短信货到付款和现金支付的区别是什么? 手机不知道怎么回事收到那么多京东货到付款的短信通知,怎么办? 手机短信老是收到快件到别的城市货到付款,怎么回事?不会被盗取信息了吧? 你们有没有收到过这种诈骗短信 用我的手机号去空间变换货到付款买东西而且还不止一次 在毒上面买了双鞋,已经在网上付了钱,但他却发短信来说货到付款?这是怎么回事?