当前位置:   article > 正文

C语言迷宫制造

C语言迷宫制造

开头

大家好,我叫这是我58

程序

#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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108

程序的流程图

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

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号