C语言破墙镐对称飞迷宫

开头

大家好,我叫这是我58

程序

#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)

结尾

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

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值