C语言破墙镐对称飞迷宫

目录

开头

大家好,我叫这是我58

程序

c 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
enum WASD {
	W,
	A,
	S,
	D
};
void printmaze(const char strmaze[11][11], const int ip, const int ic) {
	int ia = 0;
	int ib = 0;
	for (ia = 0; ia < 11; ia++) {
		for (ib = 0; ib < 11; ib++) {
			printf("\033[%sm%c\033[0m",'G' == strmaze[ia][ib] ? "32;1" : "0", strmaze[ia][ib]);
		}
		printf("|\n");
	}
	printf("-----------@\n\033[%sm破墙镐*%d%s\n\033[%sm对称飞*%d%s\033[0m\n", ip ? "0" : "30;1", ip, ip ? "(q)" : "", ic ? "0" : "30;1", ic, ic ? "(e)" : "");
}
int main() {
	enum WASD wp = W;
	int i = 0;
	int ip = 4;
	int ic = 2;
	char ch = 0;
	char strmaze[11][11] = {
		'P','*',' ','*',' ',' ',' ','*',' ',' ','*',
		'*',' ',' ','*','*','*','*',' ','*','*',' ',
		' ',' ',' ','*','*',' ','*',' ','*','*',' ',
		'*','*','*','*','*','*','*',' ','*','*',' ',
		' ','*','*','*',' ','*',' ','*','*','*',' ',
		'*',' ','*','*','*','G','*','*','*','*',' ',
		'*',' ',' ','*',' ','*','*','*','*','*',' ',
		'*','*','*','*',' ','*','*','*',' ',' ',' ',
		'*','*','*','*','*','*','*','*',' ','*','*',
		' ',' ',' ','*','*','*','*','*','*','*','*',
		'*',' ',' ',' ',' ','*',' ',' ','*','*',' '
	};
	char* rmaze = malloc(122 * sizeof(char));
	char* rmazea = rmaze;
	rmaze = "P* *   *  **  **** **    ** * ** ******* **  *** * *** * ***G**** *  * ***** **** ***   ******** **   *********    *  ** ";
	char* cp = &strmaze[0][0];
	printf("\033[0m欢迎你来玩破墙镐对称飞迷宫,在这个迷宫中,"P"是你,空格是你可以走的地方,"\033[32;1mG\033[0m"为\033[32;1m终点\033[0m,输入"q"来用掉一把破墙镐来破掉你面前的墙,输入"e"来使用对称飞飞到你与迷宫的中心点中心对称的一个点,输入"r"即可重置迷宫,而你只要走到\033[32;1m终点\033[0m,就可以\033[32;1m赢\033[0m了,你听懂了吗?");
	Sleep(6400);
	system("cls");
	while ('G' == strmaze[5][5]) {
		int ix = (cp - &strmaze[0][0]) / 11;
		int iy = (cp - &strmaze[0][0]) % 11;
		printmaze(strmaze, ip, ic);
		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);
			wp = W;
			break;
		case 'a':
			for (i = 0; i < 11; i++) {
				if (cp == &strmaze[i][0]) {
					break;
				}
			}
			11 == i && '*' != *(cp - 1) && cp--;
			wp = A;
			break;
		case 's':
			for (i = 0; i < 11; i++) {
				if (cp == &strmaze[10][i]) {
					break;
				}
			}
			11 == i && '*' != *(cp + 11) && (cp += 11);
			wp = S;
			break;
		case 'd':
			for (i = 0; i < 11; i++) {
				if (cp == &strmaze[i][10]) {
					break;
				}
			}
			11 == i && '*' != *(cp + 1) && cp++;
			wp = D;
			break;
		case 'q':
			if (ip) {
				int ipa = 0;
				switch (wp) {
				case W:
					(ix && '*' == *(cp - 11)) && (*(cp - 11) = ' ', ipa = 1);
					break;
				case A:
					(iy && '*' == *(cp - 1)) && (*(cp - 1) = ' ', ipa = 1);
					break;
				case S:
					(10 != ix && '*' == *(cp + 11)) && (*(cp + 11) = ' ', ipa = 1);
					break;
				case D:
					(10 != iy && '*' == *(cp + 1)) && (*(cp + 1) = ' ', ipa = 1);
					break;
				default:
					break;
				}
				ipa && ip--;
			}
			break;//破墙镐
		case 'e':
			(ic && ' ' == strmaze[10 - ix][10 - iy]) && (ic--, cp = &strmaze[10 - ix][10 - iy]);//对称飞
			break;
		case 'r':
			ip = 4;
			ic = 2;
			cp = &strmaze[0][0];
			for (i = 0; i < 121; i++) {
				strmaze[0][i] = rmaze[i];
			}
			break;
		default:
			break;
		}
		*cp = 'P';
		system("cls");
	}
	system("color 0A");
	printf("恭喜你,你赢了\n");
	free(rmazea);
	rmaze = NULL;
	rmazea = NULL;
	return 0;
}//破墙镐(2)(q)对称飞(4)(e)迷宫:破墙镐------破墙(有墙才破),对称飞------从迷宫的中心点瞬移(瞬移点没墙)

程序的流程图

开始 把宏_CRT_SECURE_NO_WARNINGS定义为1 导入stdio.h 导入stdlib.h 导入Windows.h 定义枚举WASD里的变量为W,A,S和D,并分别把这些变量初始化为0,1,2和3 定义printmaze函数 定义枚举WASD变量wp为W 定义整型i为0 定义整型ip为0 定义整型ic为2 定义字符ch为0 把有11行11列的二维字符数组strmaze初始化为下面的图片


对称飞 破墙镐 等待6.4秒,等待好后就清屏 是 是 否 是 是 是(break) 是 break 清屏 否 否 是 是 是(break) 是 break 否 是 是 是(break) 是 break 否 是 是 是(break) 是 break 否 是 是 是 是 是 break 否 是 是 break 否 是 是 否(break) 否 否 否 否 否 否 否 否 否 否 否 否 否 是 是 break 否(break) 否 是 是 break 否 是 是 break 否(break) 否(break) 否(break) 否(break) 否(break) 否(break) 否(break) 否(break) ic && ' ' == strmaze[10 - ix][10 - iy])? ic自减1 把cp设为二维字符数组strmaze第10减ix的值行第10减iy的值列的元素的地址 ip? 定义ipa为0 W == wp? ix && '*' == *(cp - 11)? 把解引用的某个结果设为空格,而这个结果就是cp减去11的结果 把ipa设为1 ipa? ip自减1 A == wp? iy && '*' == *(cp - 1))? 把解引用的某个结果设为空格,而这个结果就是cp减去1的结果 把ipa设为1 S == wp? 10 != ix && '*' == *(cp + 11)? 把解引用的某个结果设为空格,而这个结果就是cp加上11的结果 把ipa设为1 D == ch? 10 != iy && '*' == *(cp + 1)? 把解引用的某个结果设为空格,而这个结果就是cp加上1的结果 把ipa设为1 把有122个字节大小的动态内存交给rmaze字符指针来维护 定义字符指针rmazea为rmaze 把rmaze设为"P* * * ** **** ** ** * ** ******* ** *** * *** * ***G**** * * ***** **** *** ******** ** ********* * ** " 定义字符指针cp为二位字符数组strmaze第0行第0列的地址 输出"\033[0m欢迎你来玩破墙镐对称飞迷宫,在这个迷宫中,"P"是你,空格是你可以走的地方,"\033[32;1mG\033[0m"为\033[32;1m终点\033[0m,输入"q"来用掉一把破墙镐来破掉你面前的墙,输入"e"来使用对称飞飞到你与迷宫的中心点中心对称的一个点,输入"r"即可重置迷宫,而你只要走到\033[32;1m终点\033[0m,就可以\033[32;1m赢\033[0m了,你听懂了吗?" 'G' == strmaze[5][5]? 定义整型iy为cp与二维字符数组strmaze第0行第0列的地址之间的元素个数模上11的结果 执行printmaze函数,参数有二位字符数组strmaze,整型ip和整型ic 把ch设为你输入的字符 '\n' != getchar()? 把解引用的cp设为空格 'w' == ch? 设i为0 i < 11? cp == &strmaze[0][i]? 11 == i && '*' != *(cp - 11)? 把cp向左移动11位 把wp设为W 把解引用的cp设为字符"P" 把窗口的背景色设为黑色,前景色设为淡绿色 输出"恭喜你,你赢了\n" 借rmazea释放rmaze 把rmaze置为空指针 把rmazea也置为空指针 结束 'a' == ch? 设i为0 i < 11? cp == &strmaze[i][0]? 11 == i && '*' != *(cp - 1) 把cp向左移动一位 把wp设为A 's' == ch? 设i为0 i < 11? cp == &strmaze[10][i]? 11 == i && '*' != *(cp + 11)? 把cp向右移动11位 把wp设为S 'd' == ch? 设i为0 i < 11? &strmaze[i][10]? 11 == i && '*' != *(cp + 1)? 把cp向右移动一位 把wp设为D 'q' == ch? 'e' == ch? 'r' == ch? 设ip为4 设ic为2 设cp为二位字符数组strmaze第0行第0列的地址 设i为0 i < 121? 把二维字符数组strmaze第0行第i列的元素设为rmaze第i项的元素 i自增1 i自增1 i自增1 i自增1 i自增1 破墙镐(2)(q)对称飞(4)(e)迷宫:破墙镐------破墙(有墙才破),对称飞------从迷宫的中心点瞬移(瞬移点没墙)
printmaze函数 是 是 否 否 结束 开始 定义整型ia为0 定义整型ib为0 设ia为0 ia < 11? 设ib为0 ib < 11? 输出"\033[%sm%c\033[0m"(如果"G"为二维字符数组strmaze第ia行第ib列的元素,那么"%s"就代"32;1",否则代"0",而"%c"则代二维字符数组strmaze第ia行第ib列的元素) ib自增1 输出"|\n" ia自增1 输出"-----------@\n\033[%sm破墙镐*%d%s\n\033[%sm对称飞*%d%s\033[0m\n"(如果ip不为0,第一个"%s"和第二个"%s"分别代"0"和"(q)",否则就分别代"30;1"和空字符串,第一个"%d"则代ip,如果ic不为0,第一个"%s"和第二个"%s"分别代"0"和"(e)",否则就也分别代"30;1"和空字符串,第二个"%d"则代ic)

程序游玩的效果(gif)

结尾

你觉得我这次写的迷宫好吗?如果你觉得我这次写的迷宫不好,就可以评论一下我这次写的迷宫不好的原因吧。

相关推荐
励志成为嵌入式工程师3 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
Peter_chq3 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
hikktn5 小时前
如何在 Rust 中实现内存安全:与 C/C++ 的对比分析
c语言·安全·rust
PandaQue5 小时前
《怪物猎人:荒野》游戏可以键鼠直连吗
游戏
观音山保我别报错5 小时前
C语言扫雷小游戏
c语言·开发语言·算法
小林熬夜学编程7 小时前
【Linux系统编程】第四十一弹---线程深度解析:从地址空间到多线程实践
linux·c语言·开发语言·c++·算法
墨墨祺8 小时前
嵌入式之C语言(基础篇)
c语言·开发语言
躺不平的理查德8 小时前
数据结构-链表【chapter1】【c语言版】
c语言·开发语言·数据结构·链表·visual studio
幼儿园园霸柒柒9 小时前
第七章: 7.3求一个3*3的整型矩阵对角线元素之和
c语言·c++·算法·矩阵·c#·1024程序员节
好想有猫猫9 小时前
【51单片机】串口通信原理 + 使用
c语言·单片机·嵌入式硬件·51单片机·1024程序员节