C语言小游戏 源码 推箱子

Posted 流星蝴蝶没有剑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言小游戏 源码 推箱子相关的知识,希望对你有一定的参考价值。

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 <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>

// 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

以上是关于C语言小游戏 源码 推箱子的主要内容,如果未能解决你的问题,请参考以下文章

C语言零基础项目:推箱子游戏,详细思路+源码分享

C语言实现推箱子游戏!(超简单详细)代码思路+源码分享

C语言小游戏 源码 推箱子

C语言小游戏 源码 推箱子

C语言小游戏 源码 推箱子

重温经典,推箱子游戏,你能闯到第几关?可自行添加关卡