C++掉血迷宫

目录

开头

大家好,我叫这是我58

程序

cpp 复制代码
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
enum RBYG {
	R = 1,
	B = 2,
	Y = 4,
	G = 7,
};
struct heal {
	int ix;
	int iy;
	enum RBYG rbyg;
	int HOrD;
};
void printmaze(const char strmaze[11][11], const int ihea, heal healarr[54]) {
	int i = 0;
	int ia = 0;
	int ib = 0;
	string str = "0";
	for (; i < 11; i++) {
		for (ia = 0; ia < 11; ia++) {
			for (ib = 0; ib < 54; ib++) {
				if (healarr[ib].ix == i && healarr[ib].iy == ia) {
					if (2 == healarr[ib].HOrD || -2 == healarr[ib].HOrD) {
						str = "35;1";
					}
					else {
						switch (healarr[ib].rbyg) {
						case R:
							str = "31;1";
							break;
						case B:
							str = "36";
							break;
						case Y:
							str = "33";
							break;
						case G:
							str = "32;1";
							break;
						default:
							break;
						}
					}
					break;
				}
			}
			cout << "\033[" << ('P' != strmaze[i][ia] ? 'G' == strmaze[i][ia] ? "32;1" : str : "0") << "m" << strmaze[i][ia] << "\033[0m";
			str = "0";
		}
		cout << "|" << endl;
	}
	cout << "-----------@" << endl << "\033[3" << (ihea > 6 ? "2;1" : ihea > 3 ? "3" : "1") << "m你现在的生命值为:" << ihea << endl << "\033[0m";
}
int main() {
	char str[9] = "color 0";
	char strmaze[11][11] = {
		'P','X','O',' ',' ',' ',' ','X','X','O','O',
		'*','*','*','*',' ','X',' ',' ','X','O','O',
		'O','X','X','X',' ',' ','X',' ',' ','*','*',
		'*','*','*','*','O',' ','*','*','X','O','O',
		' ','X',' ','*','*','*','*',' ',' ','X','O',
		' ','X','X','*','X','O','*',' ',' ',' ','X',
		'X','*',' ','O',' ','X','*',' ',' ','X','O',
		' ','*','X',' ','X',' ',' ','*',' ',' ','X',
		'O','*','X','*',' ',' ',' ','*',' ','X','X',
		'X','O','X','*','X',' ',' ',' ','X','X','X',
		'O','X','O','*','O','X',' ','X','X','X','G',
	};
	char strmazer[11][11] = { 0 };
	char* cp = &strmaze[0][0];
	char ch = 0;
	int ihea = 10;
	int i = 0;
	heal healarr[54] = { {0,1,R,-1},{0,2,R,1},{0,7,R,-1},{0,8,B,-1},{0,9,R,1},{0,10,R,1},{1,5,G,-1},{1,8,Y,-1},{1,9,R,1},{1,10,B,1},{2,0,G,1},{2,1,R,-1},{2,2,R,-1},{2,3,R,-1},{2,6,B,-1},{3,4,Y,1},{3,8,Y,-1},{3,9,R,1},{3,10,R,1},{4,1,B,-1},{4,9,B,-1},{4,10,Y,1},{5,1,R,-1},{5,2,R,-1},{5,4,R,1},{5,5,R,-1},{5,10,B,-1},{6,0,Y,-1},{6,3,G,1},{6,5,Y,-1},{6,9,Y,-1},{6,10,Y,2},{7,2,R,-1},{7,4,G,-1},{7,10,B,-1},{8,0,Y,1},{8,2,B,-1},{8,9,R,-1},{8,10,G,-1},{9,0,R,-1},{9,1,G,1},{9,2,Y,-1},{9,4,B,1},{9,8,R,-1},{9,9,G,-2},{9,10,G,-2},{10,0,Y,1},{10,1,B,-1},{10,2,G,1},{10,4,B,1},{10,5,R,-1},{10,7,B,-1},{10,8,G,-1},{10,9,G,-2} };
	heal healarrR[54] = { 0 };
	memcpy(healarrR, healarr, sizeof healarr);
	memcpy(strmazer, strmaze, sizeof strmaze);
	cout << "欢迎你来玩这个\033[31m掉血迷宫\033[0m,在这个迷宫中,"P"是你,"*"是墙,空格是你可以走的地方,而\033[32;1m"G"\033[0m是\033[32;1m终点\033[0m,走到这能让你\033[32;1m胜利\033[0m,并且,按"w"使你上移,按"a"使你左移,按"s"使你下移,按"d"使你右移,按"r"重置这个迷宫,\033[31;1m"X"\033[0m是\033[31;1m陷阱\033[0m,你如果踩了他,就会根据它的\033[31;1m颜\033[0;36m色\033[31m扣掉相应的血\033[0m,其中,\033[31;1m红色扣1血\033[0m,\033[36m蓝色扣2血\033[0m,\033[33m黄色扣4血\033[0m,\033[32;1m绿色扣7血\033[0m,而\033[35;1m紫色扣14血\033[0m,\033[4m并且会\033[31m永远出现在这个迷宫中\033[0m,而\033[32;1m"O"\033[0m是\033[32;1m血瓶\033[0m。到这就会使你用\033[32;1m血瓶加血\033[0m,\033[4m但\033[32;1;4m血瓶\033[0;4m用完之后就不能再使用了\033[0m,其中,\033[31;1m红色加1血\033[0m,\033[36m蓝色加2血\033[0m,\033[33m黄色加4血\033[0m,\033[32;1m绿色加7血\033[0m,\033[35;1m紫色加14血\033[0m。这就是这迷宫的规则,你听明白了吗?" << endl << endl;
	system("pause");
	system("cls");
	while ('G' == strmaze[10][10] && ihea >= 1) {
		int ix = (cp - &strmaze[0][0]) / 11;
		int iy = (cp - &strmaze[0][0]) % 11;
		for (i = 0; i < 54; i++) {
			healarr[i].HOrD < 0 && ('P' == strmaze[healarr[i].ix][healarr[i].iy] && (ihea += healarr[i].rbyg * healarr[i].HOrD), ' ' == strmaze[healarr[i].ix][healarr[i].iy] && (strmaze[healarr[i].ix][healarr[i].iy] = 'X'));
			healarr[i].HOrD > 0 && ('P' == strmaze[healarr[i].ix][healarr[i].iy] && (ihea += healarr[i].rbyg * healarr[i].HOrD), 'O' != strmaze[healarr[i].ix][healarr[i].iy] && (healarr[i].HOrD = 0));
		}
		printmaze(strmaze, ihea, healarr);
		cin >> ch;
		rewind(stdin);
		*cp = ' ';
		switch (ch) {
		case 'w':
			ix && '*' != *(cp - 11) && (cp -= 11);
			break;
		case 'a':
			iy && '*' != *(cp - 1) && (cp--);
			break;
		case 's':
			10 != ix && '*' != *(cp + 11) && (cp += 11);
			break;
		case 'd':
			10 != iy && '*' != *(cp + 1) && (cp++);
			break;
		case 'r':
			memcpy(healarr, healarrR, sizeof healarr);
			memcpy(strmaze, strmazer, sizeof strmaze);
			ihea = 10;
			cp = &strmaze[0][0];
			break; 
		default:
			break;
		}
		*cp = 'P';
		system("cls");
	}
	ihea >= 1 && (str[7] = 'A'), ihea >= 1 || (str[7] = '4');
	system(str);
	cout << (ihea >= 1 ? "恭喜你,你赢了" : "很遗憾,你输了") << endl;
	return 0;
}

程序的流程图

开始 导入io流 导入string 导入cstring头文件 释放std命名空间的所有东西 定义枚举RBYG里的R,B,Y和G,其中,R为1,B为2,Y为4,G为7 定义结构体heal,里面有整型ix,整型iy,类型为枚举RBYG的变量rbyg和整型HOrD 定义printmaze函数 把有9个字符的字符串str初始化为"color 0" 把有11行11列的字符二维数组strmaze初始化为下面的图片


等待玩家按下任意一个键,按下后就清屏 是 是 是 是 是 是 是 是 否 是 是 break 清屏 否 是 是 否 是 是 break 否 是 是 break 否 是 是 break 否 是 break 否(break) 否(break) 否(break) 否(break) 否(break) 否 否 否 否 否 否 否 否 把有11行11列的二维字符数组strmazer里的元素全都初始化为0 定义字符指针cp为二维字符数组strmaze第0行第0列的地址 定义字符ch为0 定义整型ihea为10 定义整型i为0 把有54个元素的结构体heal数组healarr里的元素分别初始化为{0,1,R,-1},{0,2,R,1},{0,7,R,-1},{0,8,B,-1},{0,9,R,1},{0,10,R,1},{1,5,G,-1},{1,8,Y,-1},{1,9,R,1},{1,10,B,1},{2,0,G,1},{2,1,R,-1},{2,2,R,-1},{2,3,R,-1},{2,6,B,-1},{3,4,Y,1},{3,8,Y,-1},{3,9,R,1},{3,10,R,1},{4,1,B,-1},{4,9,B,-1},{4,10,Y,1},{5,1,R,-1},{5,2,R,-1},{5,4,R,1},{5,5,R,-1},{5,10,B,-1},{6,0,Y,-1},{6,3,G,1},{6,5,Y,-1},{6,9,Y,-1},{6,10,Y,2},{7,2,R,-1},{7,4,G,-1},{7,10,B,-1},{8,0,Y,1},{8,2,B,-1},{8,9,R,-1},{8,10,G,-1},{9,0,R,-1},{9,1,G,1},{9,2,Y,-1},{9,4,B,1},{9,8,R,-1},{9,9,G,-2},{9,10,G,-2},{10,0,Y,1},{10,1,B,-1},{10,2,G,1},{10,4,B,1},{10,5,R,-1},{10,7,B,-1},{10,8,G,-1}和{10,9,G,-2} 把有54个元素的结构体heal数组healarrR里的元素全都初始化为0 把结构体heal数组healarr里的全部内容都拷贝到结构体heal数组healarrR的里面去 把二维字符数组strmaze里的全部内容都拷贝到二维字符数组strmazer的里面去 输出"欢迎你来玩这个[31m掉血迷宫\033[0m,在这个迷宫中,"P"是你,"*"是墙,空格是你可以走的地方,而\033[32;1m"G"\033[0m是\033[32;1m终点\033[0m,走到这能让你\033[32;1m胜利\033[0m,并且,按"w"使你上移,按"a"使你左移,按"s"使你下移,按"d"使你右移,按"r"重置这个迷宫,\033[31;1m"X"\033[0m是\033[31;1m陷阱\033[0m,你如果踩了他,就会根据它的\033[31;1m颜\033[0;36m色\033[31m扣掉相应的血\033[0m,其中,\033[31;1m红色扣1血\033[0m,\033[36m蓝色扣2血\033[0m,\033[33m黄色扣4血\033[0m,\033[32;1m绿色扣7血\033[0m,而\033[35;1m紫色扣14血\033[0m,\033[4m并且会\033[31m永远出现在这个迷宫中\033[0m,而\033[32;1m"O"\033[0m是\033[32;1m血瓶\033[0m。到这就会使你用\033[32;1m血瓶加血\033[0m,\033[4m但\033[32;1;4m血瓶\033[0;4m用完之后就不能再使用了\033[0m,其中,\033[31;1m红色加1血\033[0m,\033[36m蓝色加2血\033[0m,\033[33m黄色加4血\033[0m,\033[32;1m绿色加7血\033[0m,\033[35;1m紫色加14血\033[0m。这就是这迷宫的规则,你听明白了吗?\n\n" 'G' == strmaze[10][10] && ihea >= 1? 定义整型ix为cp与二维字符数组strmaze第0行第0列的地址之间的元素个数除以11的结果 定义整型iy为cp与二维字符数组strmaze第0行第0列的地址之间的元素个数模上11的结果 设i为0 i < 54? healarr[i].HOrD < 0? 'P' == strmaze[healarr[i].ix][healarr[i].iy]? 把ihea自增结构体heal数组healarr的第i项的成员变量rbyg的值乘以结构体heal数组healarr的第i项的成员变量HOrD的值的结果 ' ' == strmaze[healarr[i].ix][healarr[i].iy]? 把二维字符数组strmaze第结构体heal数组healarr的第i项的成员变量ix的值行第结构体heal数组healarr的第i项的成员变量iy的值列的元素设为字符"X" healarr[i].HOrD > 0? 'P' == strmaze[healarr[i].ix][healarr[i].iy]? 把ihea自增结构体heal数组healarr的第i项的成员变量rbyg的值乘以结构体heal数组healarr的第i项的成员变量HOrD的值的结果 'O' != strmaze[healarr[i].ix][healarr[i].iy]? 把结构体heal数组healarr的第i项的成员变量HOrD设为0 i自增1 执行printmaze函数,参数有二维字符数组strmaze,整型ihea和结构体heal数组healarr 把ch设为你输入的字符 清空缓冲区 把解引用的cp设为空格 'w' == ch? ix && '*' != *(cp - 11)? 把cp向左移动11位 把解引用的cp设为字符"P" ihea >= 1? 把字符串str的第7项设为字符"A" ihea >= 1? 执行系统命令,命令为字符串str 如果ihea大于等于1,那么就输出"恭喜你,你赢了\n",否则就输出"很遗憾,你输了\n" 结束 'a' == ch? iy && '*' != *(cp - 1)? 把cp向左移动一位 's' == ch? 10 != ix && '*' != *(cp + 11)? 把cp向右移动11位 'd' == ch? 10 != iy && '*' != *(cp + 1)? 把cp向右移动一位 'r' == ch? 把结构体heal数组healarrR里的全部内容都拷贝到结构体heal数组healarr的里面去 把二维字符数组strmazer里的全部内容都拷贝到二维字符数组strmaze的里面去 设ihea为10 设cp为二维字符数组strmaze第0行第0列的地址 把字符串str的第7项设为字符"4"
printmaze函数 是 是 是 是 是 break 否 否 否 是 break*2 否 是 break*2 否 是 break*2 否 是 break*2 否(break*2) 否 否 结束 开始 定义整型i为0 定义整型ia为0 定义整型ib为0 定义字符串str为"0" i < 11? 设ia为0 ia < 11? 设ib为0 ib < 54? healarr[ib].ix == i && healarr[ib].iy == ia? 2 == healarr[ib].HOrD || -2 == healarr[ib].HOrD? 把字符串str设为"35;1" 前面输出"\033[",如果"P"不为二维字符数组strmaze第i行第ib列的元素,那么如果"G"为二维字符数组strmaze第i行第ia列的元素,那么中间就输出"32;1",否则中间就输出字符串str,而如果"P"为二维字符数组strmaze第i行第ib列的元素,那么中间就输出"0",后面则输出"m",二维字符数组strmaze第i行第ia列的元素和"\033[0m" 把字符串str设为"0" ia自增1 输出"|\n" i自增1 前面输出"-----------@\n\033[3",如果ihea大于6,那么中间就输出"2;1",否则如果ihea大于3,那么中间就输出"3",否则中间就输出"1",后面输出"m你现在的生命值为:",ihea和"\n\033[0m" R == healarr[ib].rbyg? 把字符串str设为"31;1" B == healarr[ib].rbyg? 把字符串str设为"36" Y == healarr[ib].rbyg? 把字符串str设为"33" G == healarr[ib].rbyg? 把字符串str设为"32;1" ib自增1

程序游玩的效果

掉血迷宫

下一篇博客要说的东西

C++门迷宫

相关推荐
jianglq2 分钟前
C++高性能线性代数库Armadillo入门
c++·线性代数
Lenyiin2 小时前
《 C++ 修炼全景指南:十 》自平衡的艺术:深入了解 AVL 树的核心原理与实现
数据结构·c++·stl
程序猿练习生2 小时前
C++速通LeetCode中等第5题-无重复字符的最长字串
开发语言·c++·leetcode
无名之逆3 小时前
云原生(Cloud Native)
开发语言·c++·算法·云原生·面试·职场和发展·大学期末
好蛊3 小时前
第 2 课 春晓——cout 语句
c++·算法
景小雨5 小时前
【数据结构与算法】排序算法之快速排序(简)
c++·算法·排序算法·快速排序
鸽嗷高.6 小时前
C++伟大发明--模版
开发语言·c++
weixin_486681147 小时前
C++系列-STL容器中统计算法count, count_if
开发语言·c++·算法
基德爆肝c语言7 小时前
C++入门
开发语言·c++
怀九日7 小时前
C++(学习)2024.9.18
开发语言·c++·学习·面向对象·引用·