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函数

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