基于C语言实现简单的走迷宫游戏

本文实例讲述了C语言实现简单的走迷宫游戏的方法,代码完整,便于读者理解。

学数据结构时用“栈”写的一个走迷宫程序,实际上用到双向队列,方便在运行完毕后输出经过的点。

#include <cstdio>
#include <deque>
#include <windows.h>
using namespace std;
class node
{
public:
  int x,y;
  int lastOpt;
};
deque<node> sta;
int x,y;
int endx,endy;
int mapW,mapH;
int steps;
int xopt[5]= {0,0,1,0,-1};
int yopt[5]= {0,1,0,-1,0};
int map[100][100]=
{

};
void init()
{
  x = 1;
  y = 1;
  endx = 1;
  endy = 9;
  mapH = 10;
  mapW = 10;
  for(int i=0; i<=mapH; i++)
    for(int j=0; j<=mapW; j++)
    {
      if(i==0 ||j==0 ||i==mapH||j==mapW)
        map[i][j]=-1;
    }

  steps=0;
  map[1][2]=-1;
  map[2][2]=-1;
  map[3][2]=-1;
  map[4][2]=-1;

  map[6][2]=-1;
  map[7][2]=-1;
  map[8][2]=-1;
  map[9][2]=-1;
  map[9][3]=-1;
  map[8][3]=-1;
  map[1][4]=-1;
  map[3][4]=-1;
  map[4][4]=-1;
  map[5][4]=-1;
  map[6][4]=-1;
  map[7][4]=-1;
  map[1][6]=-1;
  map[2][6]=-1;
  map[3][6]=-1;
  map[4][6]=-1;
  map[5][6]=-1;
  map[6][6]=-1;
  map[7][6]=-1;
  map[8][6]=-1;
  map[8][7]=-1;
  map[8][8]=-1;
  map[7][8]=-1;
  map[6][8]=-1;
  map[5][8]=-1;
  map[4][8]=-1;
  map[3][8]=-1;
  map[2][8]=-1;
  map[1][8]=-1;

  map[endx][endy]=5;
}

void dis()
{
  system("cls");
  int ori = map[x][y];
  map[x][y]=1;
  for(int i=0; i<=mapH; ++i)
  {
    for(int j=0; j<=mapW; ++j)
    {
      if(map[i][j]==0)
        printf(" ");
      else if(map[i][j]==-1)
        printf(" #");
      else if(map[i][j]==1)
        printf(" @");
      else if(map[i][j]==2)
        printf(" .");
      else if(map[i][j]==5)
        printf(" !");
    }
    cout<<i<<endl;
  }
  for(int j=0; j<=mapW; ++j)
    cout<<j<<" ";
  printf("\n\n > steps:%d Exit:(%d,%d)\n",steps,endx,endy);
  map[x][y] = ori;
}
int can(int n)
{
  if(map[x+xopt[n]][y+yopt[n]] == 0 || map[x+xopt[n]][y+yopt[n]] == 5)
    return 1;
  return 0;

}
void visit(int n)
{
  map[x][y]=2;
  x+=xopt[n];
  y+=yopt[n];
  node tem;
  tem.x = x;
  tem.y = y;
  tem.lastOpt = n;
  sta.push_back(tem);
  steps++;
}
int main()
{
  init();
  node tem;
  while( x != endx || y!=endy)
  {

    int cans = 0;
    for(int i=1; i<=4; i++)
    {
      if(can(i))
      {
        cans = 1;
        visit(i);
        break;
      }
    }
    if(!cans)
    {
      if(!sta.empty())
      {
        tem = sta.back();
        map[tem.x][tem.y]=0;
        sta.pop_back();
      }
      else
      {
        map[x][y]=2;
        x+=xopt[tem.lastOpt];
        x+=yopt[tem.lastOpt];
        dis();
        break;
      }

    }

    dis();
    Sleep(500);

  }
  if(x==endx && y == endy)
  cout<<"\n > i am finished....\n";
  else
  cout<<"\n > i am finished...but i can't find the right way\n";
  return 0;
}

效果图:

以上就是本文的全部内容,希望对大家学习C语言有所帮助。

(0)

相关推荐

  • C语言实现魔方阵算法(幻方阵 奇魔方 单偶魔方实现)

    例如三阶魔方阵为: 魔方阵有什么的规律呢? 魔方阵分为奇幻方和偶幻方.而偶幻方又分为是4的倍数(如4,8,12--)和不是4的倍数(如6,10,14--)两种.下面分别进行介绍. 2 奇魔方的算法 2.1 奇魔方的规律与算法 奇魔方(阶数n = 2 * m + 1,m =1,2,3--)规律如下: 数字1位于方阵中的第一行中间一列:数字a(1 < a  ≤ n2)所在行数比a-1行数少1,若a-1的行数为1,则a的行数为n:数字a(1 < a  ≤ n2)所在列数比a-1列数大1,若a-1的列

  • C语言使用广度优先搜索算法解决迷宫问题(队列)

    本文实例讲述了C语言使用广度优先搜索算法解决迷宫问题.分享给大家供大家参考,具体如下: 变量 head 和 tail 是队头和队尾指针, head 总是指向队头, tail 总是指向队尾的下一个元素.每个点的 predecessor 成员也是一个指针,指向它的前趋在 queue 数组中的位置.如下图所示: 广度优先是一种步步为营的策略,每次都从各个方向探索一步,将前线推进一步,图中的虚线就表示这个前线,队列中的元素总是由前线的点组成的,可见正是队列先进先出的性质使这个算法具有了广度优先的特点.广

  • C语言经典算法例题求100-999之间的“水仙花数

    题目:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身. 例如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方. 实现代码如下 #include <iostream> #include <Cmath> using namespace std; /* 求100-999之间的水仙花数 */ int main() { int number,hun,ten

  • 详解约瑟夫环问题及其相关的C语言算法实现

    约瑟夫环问题 N个人围成一圈顺序编号,从1号开始按1.2.3......顺序报数,报p者退出圈外,其余的人再从1.2.3开始报数,报p的人再退出圈外,以此类推.   请按退出顺序输出每个退出人的原序号 算法思想 用数学归纳法递推. 无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(nm),若nm非常大,无法在短时间内计算出结果.我们注意到原问题仅仅是要求出最后的胜利者的序号,而不是要读者模拟整个过程.因此如果要追求效率,就要打破常规,实

  • 基于C语言实现的迷宫算法示例

    本文实例讲述了基于C语言实现的迷宫算法.分享给大家供大家参考,具体如下: 利用c语言实现迷宫算法,环境是vc++6.0. #include<stdio.h> #include<time.h> #include<cstdlib> int visit(int,int); void setmaze(); int maze[11][11]= { {0,0,2,2,2,2,2,2,2,2}, {2,0,2,2,0,2,0,2,0,2}, {2,0,2,0,0,0,0,0,0,2}

  • C语言 数据结构中求解迷宫问题实现方法

    C语言 数据结构中求解迷宫问题实现方法 在学习数据结构栈的这一节遇到了求迷宫这个问题,拿来分享一下~ 首先求迷宫问题通常用的是"穷举求解" 即从入口出发,顺某一方向试探,若能走通,则继续往前走,否则原路返回,换另一个方向继续试探,直至走出去. 我们可以先建立一个8*8的迷宫其中最外侧为1的是墙 int mg[M+2][N+2]={ {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,

  • 基于C语言实现的迷宫游戏代码

    本文实例讲述了基于C语言实现迷宫游戏的方法,代码备有较为详尽的注释,便于读者理解.通过该游戏代码可以很好的复习C语言的递归算法与流程控制等知识,相信对于学习游戏开发的朋友有一定的借鉴价值. 完整的实例代码如下: #include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <dos.h> #define N 20/*迷宫的大小,可改

  • C语言使用深度优先搜索算法解决迷宫问题(堆栈)

    本文实例讲述了C语言使用深度优先搜索算法解决迷宫问题.分享给大家供大家参考,具体如下: 深度优先搜索 伪代码 (Pseudocode)如下: 将起点标记为已走过并压栈; while (栈非空) { 从栈顶弹出一个点p; if (p这个点是终点) break; 否则沿右.下.左.上四个方向探索相邻的点 if (和p相邻的点有路可走,并且还没走过) 将相邻的点标记为已走过并压栈,它的前趋就是p点; } if (p点是终点) { 打印p点的坐标; while (p点有前趋) { p点 = p点的前趋;

  • c语言 汉诺塔算法代码

    复制代码 代码如下: #include<stdio.h> void move(char a,char b) {     printf("%c->%c\n",a,b); } void han(int n,char a,char b,char c) {     if(n>0)     {         han(n-1,a,c,b);         move(a,b);         han(n-1,c,b,a);     } } int main() {   

  • C语言位图算法详解

    本文详细讲述了位图算法的定义与C语言实现方法,分享给大家供大家参考之用.具体如下: 位图法定义: 位图法就是bitmap的缩写,所谓bitmap,是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况.通常是用来判断某个数据存不存在的. 例如,要判断一千万个人的状态,每个人只有两种状态:男人,女人,可以用0,1表示.那么就可以开一个int数组,一个int有32个位,就可以表示32个人.操作的时候可以使用位操作.   数据结构: unsigned int bit[N]; 在这个数组

  • c语言实现冒泡排序、希尔排序等多种算法示例

    实现以下排序 插入排序O(n^2) 冒泡排序 O(n^2) 选择排序 O(n^2) 快速排序 O(n log n) 堆排序 O(n log n) 归并排序 O(n log n) 希尔排序 O(n^1.25) 1.插入排序 O(n^2) 一般来说,插入排序都采用in-place在数组上实现.具体算法描述如下:⒈ 从第一个元素开始,该元素可以认为已经被排序⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置⒋ 重复步骤3,直到找到已排序的元素

随机推荐