目录
开头
大家好,我叫这是我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
函数