【C语言小游戏】--推箱子

目录

游戏整体思路

代码实现


游戏整体思路

1.地图的实现(空地  墙壁  人  箱子  目标点 )
2.人物的移动
3.人物推箱子
4.胜利的判断(地图上没有箱子了)
5.关卡的实现

代码实现

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include<conio.h>//_getch()//输入一个按键,才执行下一个语句
#include <Windows.h>

/*
实现思路:
1.地图的实现(空地  墙壁  人  箱子  目标点 )
2.人物的移动
3.人物推箱子
4.胜利的判断(地图上没有箱子了)
5.关卡的实现
*/


//空地 0 墙壁 1 人 2 箱子 3 目标点 4
//关卡数组Map 三维数组
int Map[3][10][10] =
{
	{//第一关
	{1,1,1,1,1,1,1,1,1,1},
	{1,2,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,1},
	{1,3,3,4,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,1},
	{1,4,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,3,0,4,0,0,1},
	{1,0,0,0,0,0,0,0,0,1},
	{1,1,1,1,1,1,1,1,1,1}, },
	{//第二关
	{1,1,1,1,1,1,1,1,1,1},
	{1,2,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,1,0,1},
	{1,3,3,4,0,0,0,0,0,1},
	{1,0,0,0,1,0,0,0,0,1},
	{1,4,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,1,0,0,0,1},
	{1,0,0,0,3,0,4,0,0,1},
	{1,0,0,0,0,0,0,0,0,1},
	{1,1,1,1,1,1,1,1,1,1}, },
	{//第三关
	{1,1,1,1,1,1,1,1,1,1},
	{1,2,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,1},
	{1,3,3,4,0,0,0,0,0,1},
	{1,0,0,0,0,3,0,0,0,1},
	{1,4,0,0,0,4,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,1},
	{1,0,1,0,3,0,4,0,0,1},
	{1,0,0,0,0,0,0,0,0,1},
	{1,1,1,1,1,1,1,1,1,1}, }
};
int level = 0;//记录当前关卡,默认为第0关
int maparr[10][10] = { 0 };

/*
一 初始化游戏
二 更新游戏数据
三 结束游戏
初始化游戏
while(结束游戏)
{
更新游戏数据
}
*/
//初始化游戏
void initGame();
//地图加载函数
void initMap();
//绘制函数
void drawMap();
//更新游戏数据
void runGame();
//人物的移动函数
void moveInmap(int off_x, int off_y);
//结束函数
int endGame();


int main()
{
	initGame();
L:initMap();
	while (endGame())
	{
		runGame();

	}
	if (level < 3)
	{
		level++;
		if (level != 3)
			printf("恭喜通过本关,按任意键进入下一关\n");
		goto L;
	}
	printf("游戏胜利\n");
	return 0;
}
//初始化游戏
void initGame()
{
	printf("\n\n\n    推箱子--按任意键开始");
	_getch();
}
//地图加载函数
void initMap()
{
	//加载当前关卡地图
	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			maparr[i][j] = Map[level][i][j];
		}
	}
}
void drawMap()
{
	system("cls");
	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			switch (maparr[i][j])
			{
			case 0:
				printf("  ");
				break;
			case 1:
				printf("■");
				break;
			case 2:
				printf("♀");
				break;
			case 3:
				printf("●");
				break;
			case 4:
				printf("☆");
				break;
			case 2 + 4:
				printf("♀");
				break;
			case 3 + 4:
				printf("★");
				break;
			default:
				break;
			}
		}
		printf("\n");
	}
}
//更新游戏数据
void runGame()
{

	switch (_getch())//输入一个按键,才执行下一个语句
	{
	case 'w':
	case 'W':
		printf("向上\n");
		moveInmap(-1, 0);
		break;
	case 's':
	case 'S':
		printf("向下\n");
		moveInmap(1, 0);
		break;
	case 'a':
	case 'A':
		printf("向左\n");
		moveInmap(0, -1);
		break;
	case 'd':
	case 'D':
		printf("向右\n");
		moveInmap(0, 1);
		break;
	default:
		break;

	}
	drawMap();

}

//人物的移动函数
void moveInmap(int off_x, int off_y)
{
	//找人
	//人 :maparr[playerPos_X][playerPos_Y];
	// 人的下面:[playerPos_X+1][playerPos_Y];
	// 人的下面的下面:[playerPos_X+1+1][playerPos_Y];
	//四向
	//人 :maparr[playerPos_X][playerPos_Y];
	// 人的下面:[playerPos_X+off_x][playerPos_Y+off_y];
	// 人的下面的下面:[playerPos_X+off_x*2][playerPos_Y+off_y*2];
	int playerPos_X = 0;
	int playerPos_Y = 0;

	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			if (2 == maparr[i][j] || 2 + 4 == maparr[i][j])
			{
				playerPos_X = i;
				playerPos_Y = j;

			}
		}
	}


	//移动
	if (0 == maparr[playerPos_X + off_x][playerPos_Y + off_y] ||
		4 == maparr[playerPos_X + off_x][playerPos_Y + off_y])//空地、目标点
	{
		maparr[playerPos_X][playerPos_Y] -= 2;
		maparr[playerPos_X + off_x][playerPos_Y + off_y] += 2;
	}
	else if (3 == maparr[playerPos_X + off_x][playerPos_Y + off_y] ||
		3 + 4 == maparr[playerPos_X + off_x][playerPos_Y + off_y])//箱子、箱子在点上
	{
		if (0 == maparr[playerPos_X + off_x * 2][playerPos_Y + off_y * 2] ||
			4 == maparr[playerPos_X + off_x * 2][playerPos_Y + off_y * 2])//空地、目标点
		{
			maparr[playerPos_X][playerPos_Y] -= 2;
			//maparr[playerPos_X + 1][playerPos_Y] += 2;
			//maparr[playerPos_X+1][playerPos_Y] -= 3;
			maparr[playerPos_X + off_x][playerPos_Y + off_y] += (2 - 3);
			maparr[playerPos_X + off_x * 2][playerPos_Y + off_y * 2] += 3;
		}
	}
}
//结束函数
int endGame()
{
	//遍历
	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			if (3 == maparr[i][j])
			{
				return 1;
			}
		}
	}
	return 0;

}

  

  • 9
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sherry的成长之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值