大噶猴,我是鱼子酱(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++游戏,我们下期再见!