C语言小游戏 源码 推箱子

C语言小游戏 源码 推箱子,第1张

C语言小游戏 - 推箱子

其他窗口 *** 作:汉字对应的ASCLL


引入窗口控制头文件

windwos.h

定义游戏中所有实物

{"  ", "■", "", "☆", "□", "▲", "", "★", "▲"};

将游戏中所有的实物赋予不同的颜色

{0, FOREGROUND_RED, -1, FOREGROUND_GREEN, FOREGROUND_GREEN, FOREGROUND_GREEN, -1, BACKGROUND_GREEN, FOREGROUND_GREEN}

// 输出终端字符的颜色
void Color (int m) {
	HANDLE consolehwnd;/*创建句柄*/
	consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);/*实例化句柄*/
	SetConsoleTextAttribute(consolehwnd, m);
}

将文件中的数据地图存储到数组中

while(!feof(fp)) {
	fscanf(fp,"%d",&map[mapRow][mapCol++]);
	if(mapCol%LIE==0) {
		mapRow++;
		mapCol=0;
	}
}

在地图中绘制各种实物

case 0: // 空
case 1: // 墙
case 3: // 目的地
case 4: // 箱子
case 5: // 人
case 7: // 箱子+目的地
case 8: //人+目的地
	Color(mapBrickColor[now]); // 设置颜色
	printf(mapBrickChar[now]); // 输出字符
	break;

选择关卡

case 1:
case 2:
case 3:
case 4:
case 5:
case 6: { // 关卡选择
	char s[30] = "";
	sprintf(s, path, k);
	if((fp=fopen(s,"rt"))==NULL) {
		return 2;
	}
}

以上均为废话,为了凑字数
代码中有注释

推箱子源码

#include 
#include 
#include 
#include 

// C99或C11模式【所以文件后缀.c改为.cpp】
#define f(i, a, b) for(int (i)=(a);(i)<(b);(i)++)
//地图为10列对应txt文本中的内容:墙为1 空地为0 箱子为4 人为5 目的地为3
#define LIE 10

// 定义一些地图中的符号:空位置、墙、目的地、箱子、人 、箱子+目的地、人+目的地
const char mapBrickChar[][5] = {"  ", "■", "", "☆", "□", "▲", "", "★", "▲"};
// 每个字符对应的颜色颜色点进去看
const int mapBrickColor[] = {0, FOREGROUND_RED, -1, FOREGROUND_GREEN, FOREGROUND_GREEN, FOREGROUND_GREEN, -1, BACKGROUND_GREEN, FOREGROUND_GREEN};

int map[20][LIE]; // 存地图
char path[30] = "./关卡%d.txt"; // 关卡路径

int k; // 保存关卡

int mapRow=0; // 地图的长度
int mapCol=0; // 遍历地图时作为索引使用,无使用价值 

// 人的坐标
int ROW, COL;

// 输出终端字符的颜色
void Color (int m) {
	HANDLE consolehwnd;/*创建句柄*/
	consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);/*实例化句柄*/
	SetConsoleTextAttribute(consolehwnd, m);
}
int createmap() { // 读取并保存地图
	scanf("%d",&k);
	FILE *fp;
	switch (k) {
		case 0: { // 输入0退出
			return 1;
		}
		break;
		case 1:
		case 2:
		case 3:
		case 4:
		case 5:
		case 6: { // 关卡选择
			char s[30] = "";
			sprintf(s, path, k);
			if((fp=fopen(s,"rt"))==NULL) {
				return 2;
			}
		}
		break;
	}
	mapRow = mapCol = 0;
	while(!feof(fp)) {
		fscanf(fp,"%d",&map[mapRow][mapCol++]);
		if(mapCol%LIE==0) {
			mapRow++;
			mapCol=0;
		}
	}
	if(fclose(fp)) return 2;
	return 0;
}
// 绘制地图
void DrawMap() {
	system("cls");
	printf("方向键控制上下左右,r重新游戏,t退出游戏\n");
	f(i, 0,mapRow) {
		f (j, 0, LIE) {
			int now = map[i][j]; // 当前位置代号
			switch (now) {
				case 0: // 空
				case 1: // 墙
				case 3: // 目的地
				case 4: // 箱子
				case 5: // 人
				case 7: // 箱子+目的地
				case 8: //人+目的地
					Color(mapBrickColor[now]); // 设置颜色
					printf(mapBrickChar[now]); // 输出字符
					break;
			}
		}
		printf("\n");
	}
}

//获取到当前人的下标 时刻都能够确定人的下标
void getPersonPosition() {
	int row, col; //人的行和列
	f(i, 0, mapRow) { //控制变量 0-6
		f(j, 0, LIE) { //控制变量 0-9
			if (map[i][j] == 5||map[i][j] == 8) {
				row = i; //i 0-6
				col = j; //j 0-9
			}
		}
	}
	if(ROW!=row||COL!=col) {
		Color(15);
		printf("(%d,%d)\n", row, col);
	}
	ROW = row;
	COL = col;
}

// 修改地图数据
int PlayGame() {
	int flag=0; // 标记人是否移动过
	getPersonPosition();
	char input; //定义一个字符变量
	input = getch(); //变量接受键盘的输入
	switch (input) {
		case 72: //上
			if (map[ROW - 1][COL] == 0||map[ROW-1][COL]==3) { //如果人的前面是空地或者目的地
				map[ROW][COL] -= 5; //人的ID有可能是5 也有可能是8
				map[ROW - 1][COL] += 5;
				flag=-1;
			} else if (map[ROW - 1][COL] == 4 || map[ROW - 1][COL] == 7) { //人的前面是箱子
				if (map[ROW - 2][COL] == 0 || map[ROW - 2][COL] == 3) { //箱子的前面是空地
					map[ROW - 2][COL] += 4;
					map[ROW - 1][COL] += (5-4);
					map[ROW][COL] -= 5;
					flag=-1;
				}
			}
			break;

		case 80: //下
			if (map[ROW + 1][COL] == 0 || map[ROW + 1][COL] == 3) { //如果人的前面是空地或者目的地
				map[ROW][COL] -= 5; //人的ID有可能是5 也有可能是8
				map[ROW + 1][COL] += 5;
				flag=-2;
			} else if (map[ROW + 1][COL] == 4 || map[ROW + 1][COL] == 7) { //人的前面是箱子
				if (map[ROW + 2][COL] == 0 || map[ROW + 2][COL] == 3) { //箱子的前面是空地
					map[ROW + 2][COL] += 4;
					map[ROW + 1][COL] += 1;
					map[ROW][COL] -= 5;
					flag=-2;
				}
			}
			break;
		case 75: //左
			if (map[ROW][COL - 1] == 0 || map[ROW][COL - 1] == 3) { //如果人的前面是空地或者目的地
				map[ROW][COL] -= 5; //人的ID有可能是5 也有可能是8

				map[ROW][COL - 1] += 5;
				flag=-3;
			} else if (map[ROW][COL - 1] == 4 || map[ROW][COL - 1] == 7) { //人的前面是箱子
				if (map[ROW][COL - 2] == 0 || map[ROW][COL - 2] == 3) { //箱子的前面是空地
					map[ROW][COL - 2] += 4;
					map[ROW][COL - 1] += 1;
					map[ROW][COL] -= 5;
					flag=-3;
				}
			}
			break;

		case 77: //右
			if (map[ROW][COL + 1] == 0 || map[ROW][COL + 1] == 3) { //如果人的前面是空地或者目的地
				map[ROW][COL] -= 5; //人的ID有可能是5 也有可能是8
				map[ROW][COL + 1] += 5;
				flag=-4;
			} else if (map[ROW][COL + 1] == 4 || map[ROW][COL + 1] == 7) { //人的前面是箱子
				if (map[ROW][COL + 2] == 0 || map[ROW][COL + 2] == 3) { //箱子的前面是空地
					map[ROW][COL + 2] += 4;
					map[ROW][COL + 1] += 1;
					map[ROW][COL] -= 5;
					flag=-4;
				}
			}
			break;
		case 'r': // 重新开始
			mapRow=0;
			mapCol=0;
			ROW=0;
			COL=0;
			flag=-10;
			createmap();
			break;
		case 't': // 退出游戏
			return 1;
			break;
	}
	return flag;
}

// 判断是否成功
int success() {
	f(i, 0, mapRow) {
		f(j, 0, LIE) {
			if (map[i][j]==3) { // 是否还有目的地没变成箱子
				return 0;
			}
		}
	}
	return 1;
}

int main() {
	// 屁:脚本打开网页
	ShellExecute(NULL,"open","https://blog.csdn.net/qq_44009311",NULL,NULL,SW_SHOWNORMAL);

	while(1) {
		printf("请选择关卡\n");
		printf("退出'0':Logout\n");
		printf("关卡'1':非常简单\n");
		printf("关卡'2':简单\n");
		printf("关卡'3':常规\n");
		printf("关卡'4':困哪\n");
		printf("关卡'5':较难\n");
		printf("关卡'6':非常困难\n");
		// 读取并保存地图数据
		int t = createmap();
		if(t != 0) return 0; //0正常、 返回1:输入0退出、返回2:文件打开失败
		DrawMap();
		while (1) {
			// 修改地图
			int tp = PlayGame();
			if(tp > 0) { // 退出游戏
				Color(10);
				printf("退出!\n");
				break;
			} else if(tp==0) {
			} else {
				if(success()) { // 成功
					Color(10);
					printf("成功!\n");
					system("pause");
					break;
				}
				DrawMap();
			}
		}
		system("cls");
	}
	return 0;
}

关卡1.txt

0 0 0 0	1 1 1 0	0 0
0 0 0 0	1 3 1 0	0 0
1 1 1 1 1 4 1 1 1 1
1 3 0 0	4 5 4 0	3 1
1 1 1 1 1 4 1 1 1 1
0 0 0 0	1 3 1 0	0 0
0 0 0 0	1 1 1 0 0 0

关卡2.txt

0 1 1 1 1 1 1 1 0 0
0 1 3 3 3 3 0 1 0 0
1 1 1 3 3 3 4 1 1 1
1 0 0 4 1 4 0 4 0 1
1 0 4 4 0 0 1 4 0 1
1 0 0 0 5 1 0 0 0 1
1 1 1 1 0 0 0 1 1 1
0 0 0 1 1 1 1 1 0 0

关卡3.txt

0 0 1 1 1 1 1 1 0 0
1 1 1 0 0 0 1 1 1 1
1 0 0 0 4 0 4 0 0 1
1 0 4 0 0 0 4 5 0 1
1 1 1 4 4 1 1 1 1 1
0 0 1 0 0 3 3 1 0 0
0 0 1 3 3 3 3 1 0 0
0 0 1 1 1 1 1 1 0 0

关卡4.txt

1 1 1 1 1 1 1 1 1 0
1 0 0 0 1 1 0 0 1 0
1 0 1 0 4 0 4 0 1 0
1 0 0 7 3 1 0 0 1 0
1 1 0 1 3 0 3 1 1 0
1 1 4 1 1 1 5 1 1 1
1 0 0 0 0 0 4 0 0 1
1 0 0 0 1 1 0 1 0 1
1 1 1 1 1 1 0 0 0 1
0 0 0 0 0 1 1 1 1 1

关卡5.txt

0 0 0 0 0 1 1 1 1 1
0 1 1 1 1 1 0 0 0 1
0 1 0 3 3 0 4 1 0 1
0 1 0 1 3 7 0 0 0 1
1 1 0 7 3 1 0 5 1 1
1 0 4 0 0 4 4 0 1 0
1 0 0 0 1 1 0 0 1 0
1 1 1 1 1 1 1 1 1 0

关卡6.txt

0 1 1 1 1 0 0 0 0 0
0 1 0 0 1 1 1 1 1 0
1 1 4 0 1 1 0 0 1 0
1 0 0 4 5 4 0 0 1 0
1 0 0 0 1 1 4 0 1 0
1 1 1 3 1 1 0 1 1 1
0 1 3 3 3 4 0 4 0 1
0 1 1 3 3 0 0 0 0 1
0 0 1 1 1 1 1 1 1 1

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/793545.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存