黑白世界之寻找老婆【迷宫一】



//迷宫游戏,这个可在CodeBlock和TurborC上直接编译运行,因为gotoxy()在visualstudio上不支持。

//迷宫游戏
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#define Height 31 //迷宫的高度,必须为奇数
#define Width 31 //迷宫的宽度,必须为奇数
#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("A"); 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值