C++游戏——迷宫

大噶猴,我是鱼子酱(o)/~,作为一个爱好C++游戏的博主肯定发有关游戏的博客啦(也不一定)。
今天给大家带来C++迷宫!

迷宫!

作为一个好的游戏,一定要有一个难度选择啦。
咱们只需要写一个if语句再进行判断就好了,如下


	std::cout << "选择难度:1.和平 2.简单 3.中等 4.困难 5.噩梦 6.地狱" << std::endl;
	int ch;
	std::cin >> ch;

你们不会连这个都看不懂吧
我们再想个问题,说是迷宫,很多人就得创建很多关卡就可以了嘛。但是大家有没有想过,创建那么多关卡,倒不如进行随机迷宫呢,是吧。那么我们建一个create函数来随机一个迷宫,注意一定要保证有一条道走的出去。下面是代码:

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]);
		}
}

在输出东西的时候,你会不会因为有个小光标而烦恼?只需要隐藏即可,如下:

void hidden() { //隐藏光标
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO cci;
	GetConsoleCursorInfo(hOut, &cci);
	cci.bVisible = 0; //赋1为显示,赋0为隐藏
	SetConsoleCursorInfo(hOut, &cci);
}

走迷宫嘛,不得移动(方向键)?用一个switch就可以了,由于这属于正在游戏的时候,所以咱们还要判断玩家是否到达终点,创造一个game函数即可:

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);
			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;
		}
	}
}

最后就是我们亲爱的全代码啦:

#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#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[10101][10101];
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);
			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(); //隐藏光标
	system("cls");
	std::cout << "选择难度:1.和平 2.简单 3.中等 4.困难 5.噩梦 6.地狱" << std::endl;
	int ch;
	std::cin >> ch;
	system("cls");
	if (ch == 1) {
		const int Height = 11;
		const int Width = 11;
		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();
		printf("是否再来一局?(y/n)");
		char yn;
		std::cin >> yn;
		if (yn == 'y') main();
	} else if (ch == 2) {
		const int Height = 21;
		const int Width = 13;
		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();
		printf("是否再来一局?(y/n)");
		char yn;
		std::cin >> yn;
		if (yn == 'y') main();
	} else if (ch == 3) {
		const int Height = 31;
		const int Width = 21;
		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();
		printf("是否再来一局?(y/n)");
		char yn;
		std::cin >> yn;
		if (yn == 'y') main();
	} else if (ch == 4) {
		const int Height = 51;
		const int Width = 23;
		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();
		printf("是否再来一局?(y/n)");
		char yn;
		std::cin >> yn;
		if (yn == 'y') main();
	} else if (ch == 5) {
		const int Height = 81;
		const int Width = 31;
		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();
		printf("是否再来一局?(y/n)");
		char yn;
		std::cin >> yn;
		if (yn == 'y') main();
	} else if (ch == 6) {
		const int Height = 101;
		const int Width = 31;
		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();
		printf("是否再来一局?(y/n)");
		char yn;
		std::cin >> yn;
		if (yn == 'y') main();
	}
	return 0;
}

关注我看更多c++游戏,我们下期再见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值