C语言推箱子迷宫

开头

大家好,我叫这是我58

程序

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>
typedef struct T {
	int ix;
	int iy;
}T;
void printmaze(const char strmaze[11][11], T tarr[9]) {
	int ia = 0;
	int ib = 0;
	int ic = 0;
	char str[5] = "33";
	for (ia = 0; ia < 11; ia++) {
		for (ib = 0; ib < 11; ib++) {
			for (ic = 0; ic < 9; ic++) {
				if ('@' == strmaze[tarr[ic].ix][tarr[ic].iy] && tarr[ic].ix == ia && tarr[ic].iy == ib) {
					strcpy(str, "33;1");
					break;
				}
			}
			printf("\033[%sm%c\033[0m", 'G' == strmaze[ia][ib] ? "32;1" : '$' == strmaze[ia][ib] || '#' == strmaze[ia][ib] ? "33;1" : '@' == strmaze[ia][ib] ? str : "0", strmaze[ia][ib]);
			strcpy(str, "33");
		}
		printf("|\n");
	}
	printf("-----------@\n");
}
int main() {
	int i = 0;
	char ch = 0;
	T tarr[9] = { {0,3},{0,9},{3,1},{4,0},{5,1},{7,4},{7,5},{9,2},{10,2} };
	char strmaze[11][11] = {
		'P','@',' ','$','*',' ',' ',' ',' ','$','@',
		'*','*',' ',' ','*',' ',' ',' ',' ','@','@',
		' ',' ','*',' ','@',' ',' ','@',' ','@',' ',
		'@','$',' ','*','*','@','@','*',' ','*',' ',
		'$','@',' ',' ',' ',' ',' ','*','@','*',' ',
		'@','$',' ','@',' ',' ',' ','@','*','@',' ',
		' ',' ',' ',' ','*','*',' ',' ',' ',' ',' ',
		'@','*',' ','*','$','$','*',' ','*','@','*',
		' ',' ','*',' ','@',' ',' ','*',' ',' ',' ',
		' ',' ','$','@',' ',' ',' ','@','@',' ','#',
		' ',' ','$',' ',' ','@',' ','*',' ','#','G'
	};
	char strmazer[11][11] = { 0 };
	memcpy(strmazer, strmaze, sizeof strmaze);
	char* cp = &strmaze[0][0];
	char* cboxp = cp;
	printf("欢迎你来玩推\033[33m箱子\033[0m迷宫,在这个迷宫中,“P”是你,空格是你可以走的地方,“\033[32;1mG\033[0m”为\033[32;1m终点\033[0m,\033[33m箱子“@”\033[0m可以推,门“\033[33;1m#\033[0m”一般无法通行,但在“\033[33;1m$\033[33;1m”全被\033[33m箱子“@”\033[0m占的时候,它们就会被打开,而且打开的时候所有的箱子“\033[33m@\033[0m”都会变成墙“*”,并且输入“r”即可重置迷宫,而你只要走到\033[32;1m终点\033[0m,就可以\033[32;1m赢\033[0m了,现在你听懂了吗?");
	Sleep(8000);
	system("cls");
	while ('G' == strmaze[10][10]) {
		int ifl = 0;
		printmaze(strmaze, tarr);
		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) && '@' != *(cp - 11) && (cp -= 11, ifl = 1);
			if (!ifl && 11 == i && '@' == *(cp - 11)) {
				cboxp = cp - 11;
				(cboxp - &strmaze[0][0]) / 11 && (' ' == *(cboxp - 11) || '$' == *(cboxp - 11) ) && (*cboxp = ' ', cboxp -= 11, *cboxp = '@', cp -= 11);
			}
			break;
		case 'a':
			for (i = 0; i < 11; i++) {
				if (cp == &strmaze[i][0]) {
					break;
				}
			}
			11 == i && '*' != *(cp - 1) && '#' != *(cp - 1) && '@' != *(cp - 1) && (cp--, ifl = 1);
			if (!ifl && 11 == i && '@' == *(cp - 1)) {
				cboxp = cp - 1;
				(cboxp - &strmaze[0][0]) % 11 && (' ' == *(cboxp - 1) || '$' == *(cboxp - 1)) && (*cboxp-- = ' ', *cboxp = '@', cp--);
			}
			break;
		case 's':
			for (i = 0; i < 11; i++) {
				if (cp == &strmaze[10][i]) {
					break;
				}
			}
			11 == i && '*' != *(cp + 11) && '#' != *(cp + 11) && '@' != *(cp + 11) && (cp += 11, ifl = 1);
			if (!ifl && 11 == i && '@' == *(cp + 11)) {
				cboxp = cp + 11;
				10 != (cboxp - &strmaze[0][0]) / 11 && (' ' == *(cboxp + 11) || '$' == *(cboxp + 11)) && (*cboxp = ' ', cboxp += 11, *cboxp = '@', cp += 11);
			}
			break;
		case 'd':
			for (i = 0; i < 11; i++) {
				if (cp == &strmaze[i][10]) {
					break;
				}
			}
			11 == i && '*' != *(cp + 1) && '#' != *(cp + 1) && '@' != *(cp + 1) && (cp++, ifl = 1);
			if (!ifl && 11 == i && '@' == *(cp + 1)) {
				cboxp = cp + 1;
				10 != (cboxp - &strmaze[0][0]) % 11 && (' ' == *(cboxp + 1) || '$' == *(cboxp + 1)) && (*cboxp++ = ' ', *cboxp = '@', cp++);
			}
			break;
		case 'r':
			memcpy(strmaze, strmazer, sizeof strmaze);
			cp = &strmaze[0][0];
			cboxp = cp;
			break;
		default:
			break;
		}
		*cp = 'P';
		system("cls");
		for (ifl = 0, i = 0; i < 9; i++) {
			' ' == strmaze[tarr[i].ix][tarr[i].iy] && (strmaze[tarr[i].ix][tarr[i].iy] = '$');
			'@' == strmaze[tarr[i].ix][tarr[i].iy] && ifl++;
		}
		if (9 == ifl) {
			strmaze[9][10] = ' ';
			strmaze[10][9] = ' ';
			for (i = 0; i < 121; i++) {
				'@' == strmaze[0][i] && (strmaze[0][i] = '*');
			}
		}
	}
	system("color 0A");
	printf("恭喜你,你赢了\n");
	return 0;
}

程序的流程图

开始
把宏_CRT_SECURE_NO_WARNINGS定义为1
导入stdio.h
导入stdlib.h
导入string.h
导入Windows.h
定义结构体T,成员变量有整型ix和整型iy,并把结构体T中的struct关键字给去掉
定义printmaze函数
定义整型i为0
定义字符ch为0
把有9个结构体T的结构体T数组tarr里的元素分别初始化为{0,3},{0,9},{3,1},{4,0},{5,1},{7,4},{7,5},{9,2}和{10,2}
把有11行11列的二维字符数组strmaze初始化为下面的图片

等待8秒,等待好后就清屏
是(break)
break
清屏
是(break)
break
是(break)
break
是(break)
break
break
否(break)
否(break)
否(break)
否(break)
否(break)
否(break)
否(break)
否(break)
否(break)
把有11行11列的二维字符数组strmazer里的元素全都初始化为0
把二维字符数组strmaze里的所有内容拷贝到二维字符数组strmazer的里面去
定义字符指针cp为二维字符数组strmaze第0行第0列的地址
定义cboxp为cp
输出“欢迎你来玩推\​033[33m箱子\​033[0m迷宫,在这个迷宫中,“P”是你,空格是你可以走的地方,“\​033[32;1mG\​033[0m”为\​033[32;1m终点\​033[0m,\​033[33m箱子“@”\​033[0m可以推,门“\​033[33;1m#\​033[0m”一般无法通行,但在“\​033[33;1m$\​033[33;1m”全被\​033[33m箱子“@”\​033[0m占的时候,它们就会被打开,而且打开的时候所有的箱子“\​033[33m@\​033[0m”都会变成墙“*”,并且输入“r”即可重置迷宫,而你只要走到\​033[32;1m终点\​033[0m,就可以\​033[32;1m赢\​033[0m了,现在你听懂了吗?”
'G' == strmaze[10][10]?
定义整型ifi为0
执行printmaze函数,参数有二维字符数组strmaze和结构体T数组tarr
把ch设为你输入的字符
'\​n' != getchar()?
把解引用的cp设为空格
'w' == ch?
设i为0
i < 11?
cp == &strmaze[0][i]?
11 == i && '*' != *(cp - 11) && '#' != *(cp - 11) && '@' != *(cp - 11)?
把cp向左移动11位
设ifl为1
!ifl && 11 == i && '@' == *(cp - 11)?
把cboxp设为cp减去11的结果
(cboxp - &strmaze[0][0]) / 11 && (' ' == *(cboxp - 11) || '$' == *(cboxp - 11) )?
把解引用的cboxp设为空格
cboxp向左移动11位
把解引用的cboxp设为字符“@”
把cp向左移动11位
把解引用的cp设为字符“P”
设ifl为0
设i为0
i < 9?
' ' == strmaze[tarr[i].ix][tarr[i].iy]?
把二维字符数组strmaze第结构体T数组tarr的第i项的成员变量ix的值行第结构体T数组tarr的第i项的成员变量iy的值列的元素设为字符“$”
'@' == strmaze[tarr[i].ix][tarr[i].iy]?
ifl自增1
i自增1
9 == ifl?
把二维字符数组strmaze第9行第10列的元素设为空格
把二维字符数组strmaze第10行第9列的元素设为空格
设i为0
i < 121?
'@' == strmaze[0][i]?
把二维字符数组strmaze第0行第i列的元素设为字符“*”
i自增1
把背景色设为黑色,前景色设为淡绿色
输出“恭喜你,你赢了\​n”
结束
'a' == ch?
设i为0
i < 11?
cp == &strmaze[i][0]?
11 == i && '*' != *(cp - 1) && '#' != *(cp - 1) && '@' != *(cp - 1)?
把cp向左移动一位
设ifl为1
!ifl && 11 == i && '@' == *(cp - 1)?
把cboxp设为cp减去1的结果
(cboxp - &strmaze[0][0]) % 11 && (' ' == *(cboxp - 1) || '$' == *(cboxp - 1))?
把解引用的cboxp设为空格,并把cboxp向左移动一位
把解引用的cboxp设为字符“@”
把cp向左移动一位
's' == ch?
设i为0
i < 11?
cp == &strmaze[10][i]?
11 == i && '*' != *(cp + 11) && '#' != *(cp + 11) && '@' != *(cp + 11)?
把cp向右移动11位
设ifl为1
!ifl && 11 == i && '@' == *(cp + 11)?
把cboxp设为cp加上11的结果
10 != (cboxp - &strmaze[0][0]) / 11 && (' ' == *(cboxp + 11) || '$' == *(cboxp + 11))?
把解引用的cboxp设为空格
把cboxp向右移动11位
把解引用的cboxp设为字符“@”
把cp向右移动11位
'd' == ch?
设i为0
i < 11?
cp == &strmaze[i][10]?
11 == i && '*' != *(cp + 1) && '#' != *(cp + 1) && '@' != *(cp + 1)?
把cp向右移动一位
设ifl为1
!ifl && 11 == i && '@' == *(cp + 1)?
把cboxp设为cp加上1的结果
10 != (cboxp - &strmaze[0][0]) % 11 && (' ' == *(cboxp + 1) || '$' == *(cboxp + 1))?
把解引用的cboxp设为空格,并把cboxp向有右移动一位
把解引用的cboxp设为字符“@”
把cp向右移动一位
'r' == ch?
把二维字符数组strmazer里的所有内容拷贝到二维字符数组strmaze的里面去
把cp设为二维字符数组strmaze第0行第0列的地址
把cboxp设为cp
i自增1
i自增1
i自增1
i自增1
printmaze函数
break
结束
开始
定义整型ia为0
定义整型ib为0
定义整型ic为0
把有5个字符的字符串str初始化为“33”
设ia为0
ia < 11?
设ib为0
ib < 11?
设ic为0
ic < 9?
'@' == strmaze[tarr[ic].ix][tarr[ic].iy] && tarr[ic].ix == ia && tarr[ic].iy == ib)?
把“33;1”拷贝到字符串str的里面去
输出“\​033[%sm%c\​033[0m”(如果字符“G”为二维字符数组strmaze第ia行第ib列的元素,“%s”代“32;1”,否则如果字符“$”或者字符“#”为二维字符数组strmaze第ia行第ib列的元素,那么“%s”代“33;1”,否则如果字符“@”为二维字符数组strmaze第ia行第ib列的元素,那么“%s”代字符串str,否则“%s”代“0”,“%c”则代二维字符数组strmaze第ia行第ib列的元素)
把“33”拷贝到字符串str的里面去
ib自增1
输出“|\​n”
ia自增1
输出“-----------@\​n”
ic自增1

程序游玩的效果

推箱子迷宫

下一篇博客要说的东西

C语言中的###

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值