C语言钥匙迷宫2.0

目录

开头

大家好,我叫这是我58。废话不多说,咱们直接开始。

程序

c 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <Windows.h>
enum color {
	Y,
	B,
	R
};
typedef struct Key {
	enum color co;
	int ix;
	int iy;
}Key;
typedef struct Door {
	enum color co;
	int ix;
	int iy;
}Door;
void printmaze(char strmaze[11][11], int* apkeys, Key(*k)[12], Door(*d)[29]) {
	const char sarr[3][5] = { "33","36","31;1" };
	Key* ka = *k;
	Door* da = *d;
	const Key* const kb = *k + 11;
	const Door* const db = *d + 28;
	int ia = 0;
	int ib = 0;
	char stc[5] = "";
	for (ia = 0; ia < 11; ia++) {
		for (ib = 0; ib < 11; ib++) {
			while (ka->ix <= ia) {
				if (ka->iy == ib && ka->ix == ia) {
					strcpy(stc, sarr[ka->co]);
				}
				if (ka == kb) { 
					break; 
				}
				ka++;
			}
			while (da->ix <= ia) {
				if (da->iy == ib && da->ix == ia) {
					strcpy(stc, sarr[da->co]);
				}
				if (da == db) {
					break;
				}
				da++;
			}
			printf("\033[%sm%c\033[0m", 'G' == strmaze[ia][ib] ? "32;1" : !!strcmp(stc,"33") + !!strcmp(stc,"36") + !!strcmp(stc,"31;1") == 2 && 'P' != strmaze[ia][ib] && '*' != strmaze[ia][ib] ? stc : "0", strmaze[ia][ib]);
			ka = *k;
			da = *d;
			strcpy(stc, "");
		}
		printf("|\n");
	}
	printf("-----------@\n\033[33m黄钥匙*%d\033[0m\n\033[36m蓝钥匙*%d\033[0m\n\033[31;1m红钥匙*%d\033[0m\n", apkeys[0], apkeys[1], apkeys[2]);
}
int main() {
	int apkeys[3] = { 0 };
	Key k[12] = { {R,0,5},{Y,0,6},{B,0,8},{R,2,3},{B,3,4},{B,3,6},{Y,4,3},{R,4,7},{Y,6,3},{Y,6,4},{Y,7,1},{Y,9,0} };
	Door d[29] = { {B,0,7}, {Y,0,10}, {Y,1,0}, {B,1,1}, {R,1,3}, {B,1,6}, {Y,1,9}, {B,1,10}, {B,2,9}, {Y,3,0}, {Y,4,8}, {Y,5,0}, {Y,7,7}, {Y,7,8}, {B,7,9}, {Y,7,10}, {Y,8,0}, {R,8,5}, {Y,8,7}, {R,8,8}, {B,8,9}, {B,8,10}, {B,9,7}, {B,9,8}, {R,9,9}, {R,9,10}, {Y,10,7}, {B,10,8}, {R,10,9} };
	const Key ka[12] = { {R,0,5},{Y,0,6},{B,0,8},{R,2,3},{B,3,4},{B,3,6},{Y,4,3},{R,4,7},{Y,6,3},{Y,6,4},{Y,7,1},{Y,9,0} };
	const Door da[29]= { {B,0,7}, {Y,0,10}, {Y,1,0}, {B,1,1}, {R,1,3}, {B,1,6}, {Y,1,9}, {B,1,10}, {B,2,9}, {Y,3,0}, {Y,4,8}, {Y,5,0}, {Y,7,7}, {Y,7,8}, {B,7,9}, {Y,7,10}, {Y,8,0}, {R,8,5}, {Y,8,7}, {R,8,8}, {B,8,9}, {B,8,10}, {B,9,7}, {B,9,8}, {R,9,9}, {R,9,10}, {Y,10,7}, {B,10,8}, {R,10,9} };
	int i = 0;
	int ia = 0;
	char ch = 0;
	char strmaze[11][11] = {
		' ',' ',' ',' ','*','+','+','#','+',' ','#',
		'#','#','*','#','*','*','#',' ',' ','#','#',
		' ',' ','*','+',' ','*','*','*','*','#',' ',
		'#',' ','*',' ','+','*','+',' ','*','*',' ',
		' ',' ','*','+',' ','*',' ','+','#',' ',' ',
		'#','*','*','*','*','*','*','*','*','*',' ',
		' ',' ','*','+','+','*',' ',' ',' ',' ',' ',
		' ','+','*','*',' ','*',' ','#','#','#','#',
		'#',' ',' ','*',' ','#',' ','#','#','#','#',
		'+','*',' ','*','*',' ',' ','#','#','#','#',
		'P','*',' ',' ',' ',' ',' ','#','#','#','G'
	};
	const char strmz[] = "    *++#+ ###*#**#  ##  *+ ****# # * +*+ **   *+ * +#  #*********   *++*      +** * #####  * # ####+* **  ####P*     ###G";
	char* cp = &strmaze[10][0];
	printf("欢迎你来玩这个\033[33m钥\033[36m匙\033[31;1m迷宫\033[0m,这个迷宫的规则与50层魔塔的规则基本无异,只不过输入"r"可以使你重新开始这个游戏,而且,这三种颜色的"+":"\033[33m+\033[0m""\033[36m+\033[0m""\033[31;1m+\033[0m"分别代表了50层魔塔里的\033[33m黄钥匙\033[0m,\033[36m蓝钥匙\033[0m和\033[31;1m红钥匙\033[0m,并且那三种颜色的"#":"\033[33m#\033[0m""\033[36m#\033[0m""\033[31;1m#\033[0m"分别代表了50层魔塔里的\033[33m黄门\033[0m,\033[36m蓝门\033[0m和\033[31;1m红门\033[0m,你明白了吗?");
	Sleep(6600);
	system("cls");
	while ('G' == strmaze[10][10]) {
		int ix = (cp - &strmaze[0][0]) / 11;
		int iy = (cp - &strmaze[0][0]) % 11;
		for (ia = 0; ia < 12; ia++) {
			if (k[ia].ix == ix && k[ia].iy == iy && -2 != k[ia].ix + k[ia].iy) {
				apkeys[k[ia].co]++;
				k[ia].ix = -1;
				k[ia].iy = -1;
			}
		}
		printmaze(strmaze, apkeys, &k, &d);
		scanf("%c", &ch);
		while ('\n' != getchar()) {
			;
		}
		*cp = ' ';
		switch (ch) {
		case 'w':
			for (i = 0; i < 11; i++) {
				if (cp == &strmaze[0][i]) {
					break;
				}
			}
			(11 == i && '*' != *(cp - 11) && '#' != *(cp - 11)) && (cp -= 11);
			for (ia = 0; ia < 29; ia++) {
				if (apkeys[d[ia].co] > 0 && -1 != d[ia].ix && -1 != d[ia].iy && d[ia].ix == ix - 1 && d[ia].iy == iy) {
					strmaze[d[ia].ix][d[ia].iy] = ' ';
					apkeys[d[ia].co]--;
					d[ia].ix = -1;
					d[ia].iy = -1;
				}
			}
			break;
		case 'a':
			for (i = 0; i < 11; i++) {
				if (cp == &strmaze[i][0]) {
					break;
				}
			}
			(11 == i && '*' != *(cp - 1) && '#' != *(cp - 1)) && cp--;
			for (ia = 0; ia < 29; ia++) {
				if (apkeys[d[ia].co] > 0 && -1 != d[ia].ix && -1 != d[ia].iy && d[ia].ix == ix && d[ia].iy == iy - 1) {
					strmaze[d[ia].ix][d[ia].iy] = ' ';
					apkeys[d[ia].co]--;
					d[ia].ix = -1;
					d[ia].iy = -1;
				}
			}
			break;
		case 's':
			for (i = 0; i < 11; i++) {
				if (cp == &strmaze[10][i]) {
					break;
				}
			}
			(11 == i && '*' != *(cp + 11) && '#' != *(cp + 11)) && (cp += 11);
			for (ia = 0; ia < 29; ia++) {
				if (apkeys[d[ia].co] > 0 && -1 != d[ia].ix && -1 != d[ia].iy && d[ia].ix == ix + 1 && d[ia].iy == iy) {
					strmaze[d[ia].ix][d[ia].iy] = ' ';
					apkeys[d[ia].co]--;
					d[ia].ix = -1;
					d[ia].iy = -1;
				}
			}
			break;
		case 'd':
			for (i = 0; i < 11; i++) {
				if (cp == &strmaze[i][10]) {
					break;
				}
			}
			(11 == i && '*' != *(cp + 1) && '#' != *(cp + 1)) && cp++;
			for (ia = 0; ia < 29; ia++) {
				if (apkeys[d[ia].co] > 0 && -1 != d[ia].ix && -1 != d[ia].iy && d[ia].ix == ix && d[ia].iy == iy + 1) {
					strmaze[d[ia].ix][d[ia].iy] = ' ';
					apkeys[d[ia].co]--;
					d[ia].ix = -1;
					d[ia].iy = -1;
				}
			}
			break;
		case 'r':
			for (ia = 0; ia < 12; ia++) {
				k[ia] = ka[ia];
				d[ia] = da[ia];
			}
			for (; ia < 29; ia++) {
				d[ia] = da[ia];
			}
			for (i = 0; i < 121; i++) {
				strmaze[0][i] = strmz[i];
			}
			cp = &strmaze[10][0];
			for (i = 0; i < 3; i++) {
				apkeys[i] = 0;
			}
			break;
		default:
			break;
		}
		*cp = 'P';
		system("cls");
	}
	system("color 0A");
	printf("恭喜你,你赢了\n");
	return 0;
}

程序的流程图

开始 把宏_CRT_SECURE_NO_WARNINGS定义为1 导入stdio.h 导入string.h 导入Windows.h 创建枚举color,并把枚举color里的"Y""B""R"分别初始化为0,1和2 创建一个Key结构体,里面有类型为枚举color的co,整型ix和整型iy,并去掉结构体Key中的struct关键字 创建一个Door结构体,里面有类型为枚举color的co,整型ix和整型iy,并去掉结构体Door中的struct关键字 定义printmaze函数 把有三个整型的整型数组apkeys都初始化为0 把有12个结构体Key的变量的数组k分别初始化为{R,0,5},{Y,0,6},{B,0,8},{R,2,3},{B,3,4},{B,3,6},{Y,4,3},{R,4,7},{Y,6,3},{Y,6,4},{Y,7,1},{Y,9,0} 把有29个结构体Door的变量的数组d分别初始化为{B,0,7}, {Y,0,10}, {Y,1,0}, {B,1,1}, {R,1,3}, {B,1,6}, {Y,1,9}, {B,1,10}, {B,2,9}, {Y,3,0}, {Y,4,8}, {Y,5,0}, {Y,7,7}, {Y,7,8}, {B,7,9}, {Y,7,10}, {Y,8,0}, {R,8,5}, {Y,8,7}, {R,8,8}, {B,8,9}, {B,8,10}, {B,9,7}, {B,9,8}, {R,9,9}, {R,9,10}, {Y,10,7}, {B,10,8}, {R,10,9} 把有12个结构体Key的变量的常量数组ka也分别初始化为{R,0,5},{Y,0,6},{B,0,8},{R,2,3},{B,3,4},{B,3,6},{Y,4,3},{R,4,7},{Y,6,3},{Y,6,4},{Y,7,1},{Y,9,0} 把有29个结构体Door的变量的常量数组da也分别初始化为{B,0,7}, {Y,0,10}, {Y,1,0}, {B,1,1}, {R,1,3}, {B,1,6}, {Y,1,9}, {B,1,10}, {B,2,9}, {Y,3,0}, {Y,4,8}, {Y,5,0}, {Y,7,7}, {Y,7,8}, {B,7,9}, {Y,7,10}, {Y,8,0}, {R,8,5}, {Y,8,7}, {R,8,8}, {B,8,9}, {B,8,10}, {B,9,7}, {B,9,8}, {R,9,9}, {R,9,10}, {Y,10,7}, {B,10,8}, {R,10,9} 定义整型i为0 定义整型ia为0 定义字符ch为0 把有11行11列的二维字符数组strmaze初始化为下面的图片


等待6.6秒,等待好后就清屏 是 是 是 否 是 否 是 是 是(break) 是 是 是 否(break) 清屏 否 否 是 是 是(break) 是 是 是 否(break) 否 是 是 是(break) 是 是 是 否(break) 否 是 是 是(break) 是 是 是 否(break) 否 是 是 否 是 否 是 否 是 否(break) 否 否 否 否 否 否 否 否 否 否 否 否 否 否 否 否 否 否(break) 把常量字符串strmz初始化为" *++#+ ###*#**# ## *+ ****# # * +*+ ** *+ * +# #********* *++* +** * ##### * # ####+* ** ####P* ###G" 把字符指针cp设为二维字符数组strmaze的第10行第0列的地址 输出"欢迎你来玩这个\033[33m钥\033[36m匙\033[31;1m迷宫\033[0m,这个迷宫的规则与50层魔塔的规则基本无异,而你只需要到达终点"\033[32;1mG\033[0m"就可以了,只不过输入"r"可以使你重新开始这个游戏,而且,这三种颜色的"+":"\033[33m+\033[0m""\033[36m+\033[0m""\033[31;1m+\033[0m"分别代表了50层魔塔里的\033[33m黄钥匙\033[0m,\033[36m蓝钥匙\033[0m和\033[31;1m红钥匙\033[0m,并且那三种颜色的"#":"\033[33m#\033[0m""\033[36m#\033[0m""\033[31;1m#\033[0m"分别代表了50层魔塔里的\033[33m黄门\033[0m,\033[36m蓝门\033[0m和\033[31;1m红门\033[0m,你明白了吗?" 'G' == strmaze[10][10]? 定义整型ix为cp与二维字符数组strmaze的第0行第0列的地址的差除以11的结果 定义整型iy为cp与二维字符数组strmaze的第0行第0列的地址的差模11的结果 设i为0 ia < 12? k[ia].ix == ix && k[ia].iy == iy && -2 != k[ia].ix + k[ia].iy? 把apkeys的第k的第ia项的成员变量co的值项自增1 k的第ia项的成员变量ix设为-1 k的第ia项的成员变量iy设为-1 ia自增1 执行printmaze函数,参数有二维字符数组strmaze,apkeys,结构体Key的变量k的地址和结构体Door的变量d的地址 把ch设为你输入的字符 '\n' != getchar()? 把解引用的cp设为空格 'w' == ch? 设i为0 i < 11? cp == &strmaze[0][i]? 11 == i && '*' != *(cp - 11) && '#' != *(cp - 11)? 把cp向左移动11位 设ia为0 ia < 29? apkeys[d[ia].co] > 0 && -1 != d[ia].ix && -1 != d[ia].iy && d[ia].ix == ix - 1 && d[ia].iy == iy? 把二维字符数组strmaze的第d的ia项的成员变量ix的值行第d的第ia项的成员变量iy的值列设为空格 apkeys的第d的第ia项的成员变量co的值项自减1 把d的第ia项的成员变量ix设为-1 把d的第ia项的成员变量iy也设为-1 ia自增1 把解引用的cp设为字符"P" 把窗口的背景色设为黑色,前景色设为淡绿色 输出"恭喜你,你赢了\n" 结束 'a' == ch? 设i为0 i < 11? cp == &strmaze[i][0]? 11 == i && '*' != *(cp - 1) && '#' != *(cp - 1)? 把cp向左移动一位 设ia为0 ia < 29? apkeys[d[ia].co] > 0 && -1 != d[ia].ix && -1 != d[ia].iy && d[ia].ix == ix && d[ia].iy == iy - 1? 把二维字符数组strmaze的第d的ia项的成员变量ix的值行第d的第ia项的成员变量iy的值列设为空格 apkeys的第d的第ia项的成员变量co的值项自减1 把d的第ia项的成员变量ix设为-1 把d的第ia项的成员变量iy也设为-1 i自增1 's' == ch? 设i为0 i < 11? cp == &strmaze[10][i]? 11 == i && '*' != *(cp + 11) && '#' != *(cp + 11)? 把cp向右移动11位 设ia为0 ia < 29? apkeys[d[ia].co] > 0 && -1 != d[ia].ix && -1 != d[ia].iy && d[ia].ix == ix + 1 && d[ia].iy == iy? 把二维字符数组strmaze的第d的ia项的成员变量ix的值行第d的第ia项的成员变量iy的值列设为空格 apkeys的第d的第ia项的成员变量co的值项自减1 把d的第ia项的成员变量ix设为-1 把d的第ia项的成员变量iy也设为-1 ia自增1 'd' == ch? 设i为0 i < 11? cp == &strmaze[i][10]? 11 == i && '*' != *(cp + 1) && '#' != *(cp + 1)? 把cp向右移动一位 设ia为0 ia < 29? apkeys[d[ia].co] > 0 && -1 != d[ia].ix && -1 != d[ia].iy && d[ia].ix == ix && d[ia].iy == iy + 1? 把二维字符数组strmaze的第d的ia项的成员变量ix的值行第d的第ia项的成员变量iy的值列设为空格 apkeys的第d的第ia项的成员变量co的值项自减1 把d的第ia项的成员变量ix设为-1 把d的第ia项的成员变量iy也设为-1 ia自增1 'r' == ch? 设i为0 ia < 12? 把k的第ia项设为ka的第ia项 把d的第ia项设为da的第ia项 ia自增1 ia < 29? 把d的第ia项设为da的第ia项 ia自增1 设i为0 i < 121? 把二维字符数组strmaze第0行第i列设为字符串strmz的第i项 i自增1 把cp设为二维数组strmaze第10行第0列的地址 设i为0 i < 3? 把apkeys的第i项设为0 i自增1 i自增1 i自增1 i自增1 i自增1
printfmaze函数 是 是 是 是 是(break) 是 是 是(break) 否 否 否 否 否 否 否 否 结束 开始 把有3行5列二维常量字符串数组sarr分别初始化为"33""36"和"31;1" 定义结构体Key指针ka为解引用的k 定义结构体Door指针da为解引用的d 定义结构体Key常量指针常量kb为解引用的k加上11的结果 定义结构体Door常量指针常量db为解引用的d加上28的结果 定义整型ia为0 定义整型ib为0 把有5个字符的字符串stc初始化为空字符串 设ia为0 ia < 11? 设ib为0 ib < 11? ka->ix <= ia? ka->iy == ib && ka->ix == ia? 把sarr的第ka指向的成员变量co的值项拷贝到字符串stc里面去 ka == kb? da->ix <= ia? da->iy == ib && da->ix == ia? 把sarr的第da指向的成员变量co的值项拷贝到字符串stc里面去 da == db? 输出"\033[%sm%c\033[0m"(如果字符"G"为二维字符数组strmaze第ia行第ib列的元素,那么就代"32;1",否则如果stc是否与"33"相等的逻辑值加上stc是否与"36"相等的逻辑值加上stc是否与"32;1"相等的逻辑值的和为2,并且字符"P"不为二维字符数组strmaze第ia行第ib列的元素,而且字符"*"不为二维字符数组strmaze第ia行第ib列的元素,那么就代字符串stc,否则代"0","%c"则代二维字符数组strmaze的第ia行第ib列的元素) 把ka设为解引用的k 把da设为解引用的d 把空字符串拷贝到字符串stc里面去 ib自增1 输出"|\n" ia自增1 输出"-----------@\n\033[33m黄钥匙*%d\033[0m\n\033[36m蓝钥匙*%d\033[0m\n\033[31;1m红钥匙*%d\033[0m\n"(三个"%d"分别代apkeys的第0项,apkeys的第1项和apkeys的第2项) 把ka向右移动一位 把da向右移动一位

程序游玩的效果

钥匙迷宫2.0

结尾

在你看到这里之后,可以评论来互动一下我哦。

相关推荐
懒大王就是我32 分钟前
C语言网络编程 -- TCP/iP协议
c语言·网络·tcp/ip
半盏茶香35 分钟前
【C语言】分支和循环详解(下)猜数字游戏
c语言·开发语言·c++·算法·游戏
小堇不是码农41 分钟前
在VScode中配置C_C++环境
c语言·c++·vscode
小肥象不是小飞象1 小时前
(六千字心得笔记)零基础C语言入门第八课——函数(上)
c语言·开发语言·笔记·1024程序员节
励志成为嵌入式工程师6 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
Peter_chq6 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
hikktn8 小时前
如何在 Rust 中实现内存安全:与 C/C++ 的对比分析
c语言·安全·rust
观音山保我别报错8 小时前
C语言扫雷小游戏
c语言·开发语言·算法
小林熬夜学编程10 小时前
【Linux系统编程】第四十一弹---线程深度解析:从地址空间到多线程实践
linux·c语言·开发语言·c++·算法
墨墨祺11 小时前
嵌入式之C语言(基础篇)
c语言·开发语言