c++迷宫游戏

#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#define Height 27 //迷宫的高度,必须为奇数
#define Width 27 //迷宫的宽度,必须为奇数
#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);
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
		printf("▇▇"); //画出玩家当前位置
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN);

		if (map[x][y] == End) { //判断是否到达出口
			gotoxy(30, 24);
			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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值