C语言迷宫制造

目录

开头

大家好,我叫这是我58

程序

c 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h> 
#include <string.h>
void printmaze(const char strmaze[11][11]) {
	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");
}
int main() {
	int i = 0;
	int ia = 0;
	int ip = 0;
	int ig = 0;
	char ch = 0;
	char strmaze[11][11] = { 0 };
	char* cpg = NULL;
	memset(strmaze, ' ', sizeof strmaze);
	char* cp = &strmaze[0][0];
	printf("迷宫制造的规则:\n\t1.迷宫最大能制造的大小为11*11\n\t2.迷宫中只能有"P""\033[32;1mG\033[0m""*"和空格,不能有的会自动地被清除掉\n\t3.可以用"/"或者"|"来结束迷宫的制造,只不过,用"|"来结束迷宫的制造的话就可以使你可以边界互通了\n\t4.在制造迷宫的时候,迷宫最多只能有121个字符,如果超出这个部分,那么就会在换行之后自动结束迷宫的制造,如果你制造的完整的迷宫的右边紧挨着"|",那么就可以使你可以边界互通了\n\t5.最好把迷宫造的完整点,并且右边要加上"/"或者"|",不然就会耽误你玩你自己做的迷宫的时间\n\n");
	while (ch = getchar(), ((' ' == ch || '*' == ch || 'P' == ch || 'G' == ch) && (i++, *cp = ch, (i <= 120 && cp++))), (ch - '/' && ch - '|')) {
		'P' == ch && ip++;
		'G' == ch && ig++;
		if (121 == i) {
			break;
		}
	}
	((!(ch - '|')) || (!(getchar() - '|'))) && (ia = 1);
	if (!(ip && ig)) {
		system("color 0C");
		system("cls");
		printf("ERROR: "P"或者"G"并\033[4m没有被创建出来\033[0m\n");
		return 1;
	}
	if (ip > 1 || ig > 1) {
		system("color 0C");
		system("cls");
		printf("ERROR: "P"和"G"\033[4m只能创建一个\033[0m\n");
		return 1;
	}
	for (i = 0, cp = NULL; !(cp && cpg); i++) {
		!cp && (cp = strstr(strmaze[i], "P"));
		!cpg && (cpg = strstr(strmaze[i], "G"));
	}
	system("cls");
	while ('\n' != getchar()) {
		;
	}
	while ('G' == *cpg) {
		printmaze(strmaze);
		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);
			(ia && 11 != i && '*' != *(cp + 110)) && (cp += 110);
			break;
		case 'a':
			for (i = 0; i < 11; i++) {
				if (cp == &strmaze[i][0]) {
					break;
				}
			}
			11 == i && '*' != *(cp - 1) && cp--;
			(ia && 11 != i && '*' != *(cp + 10)) && (cp += 10);
			break;
		case 's':
			for (i = 0; i < 11; i++) {
				if (cp == &strmaze[10][i]) {
					break;
				}
			}
			11 == i && '*' != *(cp + 11) && (cp += 11);
			(ia && 11 != i && '*' != *(cp - 110)) && (cp -= 110);
			break;
		case 'd':
			for (i = 0; i < 11; i++) {
				if (cp == &strmaze[i][10]) {
					break;
				}
			}
			11 == i && '*' != *(cp + 1) && cp++;
			(ia && 11 != i && '*' != *(cp - 10)) && (cp -= 10);
			break;
		default:
			break;
		}
		*cp = 'P';
		system("cls");
	}
	system("color 0A");
	printf("恭喜你,你赢了\n");
	return 0;
}

程序的流程图

是 是 是 是 是 break 是 是 清屏 返回1 否 是 清屏 返回1 否 是 是 是 否(清屏) 是 否 是 是 否 是 是 是(break) 是 是 break 清屏 否 返回0 否 是 是 是(break) 是 是 break 否 是 是 是(break) 是 是 break 否 是 是 是(break) 是 是 break 否(break) 否(break) 否(break) 否(break) 否(break) 否 否 否 否 否 否 否 否 否 否 否 否 否 否 否 否 否 否 否 否 否 开始 把宏_CRT_SECURE_NO_WARNINGS定义为1 导入stdio.h 导入stdlib.h 导入string.h 定义printmaze函数 定义整型i为0 定义整型ia为0 定义整型ip为0 定义整型ig为0 定义字符ch为0 把有11行11列的二维字符数组strmaze全都初始化为0 定义字符指针cpg为空指针 把二维字符数组strmaze里的所有元素都改为空格 定义字符指针cp为二维字符数组strmaze第0行第0列的地址 输出"迷宫制造的规则:\n\t1.迷宫最大能制造的大小为11*11\n\t2.迷宫中只能有"P""\033[32;1mG\033[0m""*"和空格,不能有的会自动地被清除掉\n\t3.可以用"/"或者"|"来结束迷宫的制造,只不过,用"|"来结束迷宫的制造的话就可以使你可以边界互通了\n\t4.在制造迷宫的时候,迷宫最多只能有121个字符,如果超出这个部分,那么就会在换行之后自动结束迷宫的制造,如果你制造的完整的迷宫的右边紧挨着"|",那么就可以使你可以边界互通了\n\t5.最好把迷宫造的完整点,并且右边要加上"/"或者"|",不然就会耽误你玩你自己做的迷宫的时间\n\n" 把ch设为你从缓冲区里最先读取到的字符 ' ' == ch || '*' == ch || 'P' == ch || 'G' == ch? i自增1 把解引用的cp设为ch i <= 120? 把cp向右移动一位 ch - '/' && ch - '|'? 'P' == ch? ip自增1 'G' == ch? ig自增1 121 == i? (!(ch - '|')) || (!(getchar() - '|'))? 设ia为1 !(ip && ig)? 把窗口的背景色设为黑色,前景色设为淡红色 输出"ERROR: "P"或者"G"并\033[4m没有被创建出来\033[0m\n" 结束 ip > 1 || ig > 1? 把窗口的背景色设为黑色,前景色设为淡红色 输出"ERROR: "P"和"G"\033[4m只能创建一个\033[0m\n" 设i为0 把cp设为空指针 !(cp && cpg)? !cp? 从二维字符数组strmaze的第i项中找到字符串"P"的地址,如果找到了,cp就为strmaze的第i项中找到的字符串"P"的地址,否则cp为空指针 !cpg? 从二维字符数组strmaze的第i项中找到字符串"P"的地址,如果找到了,cpg就为strmaze的第i项中找到的字符串"G"的地址,否则cpg为空指针 i自增1 '\n' != getchar()? 'G' == *cpg? 执行printmaze函数,参数有二维字符数组strmaze 把ch设为你输入的字符 '\n' != getchar()? 把解引用的cp设为空格 'w' == ch? 设i为0 i < 11? cp == &strmaze[0][i]? 11 == i && '*' != *(cp - 11)? 把cp向左移动11位 ia && 11 != i && '*' != *(cp + 110)? 把cp向右移动110位 把解引用的cp设为字符"P" 把窗口的背景色设为黑色,前景色设为淡绿色 输出"恭喜你,你赢了\n" 'a' == ch? 设i为0 i < 11? cp == &strmaze[i][0]? 11 == i && '*' != *(cp - 1)? 把cp向左移动一位 ia && 11 != i && '*' != *(cp + 10)? 把cp向右移动10位 's' == ch? 设i为0 i < 11? cp == &strmaze[10][i]? 11 == i && '*' != *(cp + 11)? 把cp向右移动11位 ia && 11 != i && '*' != *(cp - 110)? 把cp向左移动110位 'd' == ch? 设i为0 i < 11? cp == &strmaze[i][10]? 11 == i && '*' != *(cp + 1)? 把cp向右移动一位 ia && 11 != i && '*' != *(cp - 10)? 把cp向左移动10位 i自增1 i自增1 i自增1 i自增1
printfmaze函数 是 是 否 否 结束 开始 定义整型ia为0 定义整型ib为0 设ia为0 ia < 11? 设ib为0 ia < 11? 输出"\033[%sm%c\033[0m"(如果字符"G"为二维字符数组strmaze第ia行第ib列的元素,那么"%s"代"32;1",否则代"0","%c"则代二维字符数组strmaze第ia行第ib列的元素的地址) ib自增1 输出"|\n" ia自增1 输出"-----------@\n"

程序的效果

迷宫制造

我推荐要制造的迷宫





......

下一篇博客要讲的东西

sprintf函数和sscanf函数

相关推荐
格林威2 小时前
Baumer工业相机堡盟工业相机如何通过BGAPISDK使用短曝光功能(曝光可设置1微秒)(C语言)
c语言·开发语言·人工智能·数码相机·计算机视觉
结衣结衣.2 小时前
Linux——进程状态
linux·运维·服务器·c语言·笔记·学习
格林威2 小时前
Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的图像剪切(ROI)功能(C语言)
c语言·开发语言·人工智能·数码相机·计算机视觉
少杰是小白3 小时前
计算机二级自学笔记(程序题1部分)
c语言·笔记
云卓科技6 小时前
无人机之悬停精度篇
科技·安全·机器人·无人机·制造
wheeldown6 小时前
【C语言】(指针系列3)数组指针+函数指针+typedef+函数数组指针+转移表
c语言·数据结构·算法
小比卡丘7 小时前
C语言进阶版第8课—指针(2)
c语言·开发语言·算法
fhvyxyci7 小时前
【数据结构初阶】队列接口实现及用队列实现栈超详解
c语言·数据结构
元气代码鼠7 小时前
C语言程序设计-练习篇
c语言·开发语言
EterNity_TiMe_10 小时前
【C语言进阶】C语言动态内存管理:深入理解malloc、calloc与realloc
c语言·开发语言·学习·visualstudio·性能优化·学习方法