c语言写的推箱子源码,非常适合新手学习
c语言写的推箱子源码,非常适合新手学习
愚人自忧 发表于2个月前
c语言写的推箱子源码,非常适合新手学习
  • 发表于 2个月前
  • 阅读 3
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

摘要: c语言 游戏 推箱子

 喜欢交流的或者有什么疑问的可以加作者QQ:916154899  

//=================================================================================================================================================================
//项目名称 : 推箱子
//作    者 : 愚人自忧
//制作时间 : 2017年8月19日
//
//          
//=================================================================================================================================================================
//头文件
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <conio.h>                         //获取键盘上的消息

#define ROW 8
#define COL 8
//===============================================================================================================================================================
//初始化地图 :0为空地 1为墙 2为箱子 3为目的地 4为人 

//第一关地图
int map[ROW][COL] = {
	{ 0,0,1,1,1,0,0,0, },
	{ 0,0,1,3,1,0,0,0, },
	{ 0,0,1,0,1,1,1,1, },
	{ 1,1,1,2,0,2,3,1, },
	{ 1,3,0,2,4,1,1,1, },
	{ 1,1,1,1,2,1,0,0, },
	{ 0,0,0,1,3,1,0,0, },
	{ 0,0,0,1,1,1,0,0, }
};

int end = 0;                         //中途退出的标记
int personX, personY ;               //一开始人的坐标
int boxNumber, win;                  //boxNumber表示地图上目的地的个数,win表示已经推到目的地的箱子个数
//===============================================================================================================================================================
//后面函数的申明

//游戏
void game();

//初始化
void start();

//画地图
void showMap();

//小人的移动方向
char direction();

//小人向上移动的方法  
void moveToUp();

//小人向下移动的方法  
void moveToDown();

//小人向左移动的方法  
void moveToLeft();

//小人向右移动的方法  
void moveToRight();



//================================================================================================================================================================
//主函数入口
void main()
{
	
	start();
	do
	{
		game();
	
		system("cls");
	} while (end == 0 && win != boxNumber);
	showMap();

	system("PAUSE");

}



//=================================================================================================================================================================
//游戏
void game()
{
	showMap();
	char dir = direction();
	switch (dir)
	{
	case 'w':
	case 'W':
		moveToUp();
		break;
	case 's':
	case 'S':
		moveToDown();
		break;

	case 'a':
	case 'A':
		moveToLeft();
		break;
	case 'd':
	case 'D':
		moveToRight();
		break;
	case 'q':
	case 'Q':
		printf("游戏结束");
		end = 1;
		break;
	}

}

//画地图函数
//0为空地 1为墙 2为箱子 3为目的地 4为人
//   "  "  "■"    "□"      "¤"    "♀"
void showMap()
{
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			switch (map[i][j])
			{
			case 0:
				printf("  ");
				break;
			case 1:
				printf("■");
				break;
			case 2:
				printf("□");
				break;
			case 3:
				printf("¤");
				break;
			case 4:
				printf("♀");
				break;
			}
		}
		printf("\n");
	}
}

//初始化
void start()
{
	personX = 0, personY = 0;     
	boxNumber = 0;
	end = 0;
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			switch (map[i][j])
			{
			case 3:
				boxNumber += 1;
				break;
			case 4:
				personX = i, personY = j;
				break;
			}
		}
	}

}


//小人的移动方向
char direction()
{
	//清除SCANF中的缓冲区   
	rewind(stdin);
	char dir;
	dir = _getch();
	return dir;
}

//小人向上移动的方法  
void moveToUp()
{
	//人的下一个坐标
	int personNextX = personX - 1;
	int personNextY = personY;

	//箱子的坐标和下一个坐标
	int BoxX, BoxY, BoxNextX, BoxNextY;


	if (map[personNextX][personNextY] == 0)            //如果下一个坐标是0即空地   人到空地上,人的坐标变为空地
	{
		map[personNextX][personNextY] = 4;
		map[personX][personY] = 0;

		personX = personNextX;
		personY = personNextY;
	}
	else if (map[personNextX][personNextY] == 1)      //如果下一个坐标是1即墙
	{
		//不进行操作
	}
	else if (map[personNextX][personNextY] == 2)      //如果下一个坐标是2即箱子
	{
		BoxX = personNextX;                           //当前的箱子就是人的下一个坐标

		BoxY = personNextY;

		BoxNextX = BoxX - 1;
		BoxNextY = BoxY;
		if (map[BoxNextX][BoxNextY] == 0)              //如果箱子的下一个坐标是空地就推过去
		{
			map[BoxNextX][BoxNextY] = 2;
			map[BoxX][BoxY] = 4;
			map[personX][personY] = 0;
			personX = personNextX;                   //人的下一个坐标变为人的当前坐标
			personY = personNextY;
		}
		else if (map[BoxNextX][BoxNextY] == 3)       //如果箱子的下一个坐标是目的地就推过去
		{
			map[BoxNextX][BoxNextY] = 2;
			map[BoxX][BoxY] = 4;
			map[personX][personY] = 0;
			personX = personNextX;                   //人的下一个坐标变为人的当前坐标
			personY = personNextY;
			win += 1;                                //已经推进去的箱子数加1
		}
	}



}

//小人向下移动的方法  
void moveToDown()
{
	//人的下一个坐标
	int personNextX = personX + 1;
	int personNextY = personY;

	//箱子的坐标和下一个坐标
	int BoxX, BoxY, BoxNextX, BoxNextY;


	if (map[personNextX][personNextY] == 0)            //如果下一个坐标是0即空地   人到空地上,人的坐标变为空地
	{
		map[personNextX][personNextY] = 4;
		map[personX][personY] = 0;

		personX = personNextX;
		personY = personNextY;
	}
	else if (map[personNextX][personNextY] == 1)      //如果下一个坐标是1即墙
	{
		//不进行操作
	}
	else if (map[personNextX][personNextY] == 2)      //如果下一个坐标是2即箱子
	{
		BoxX = personNextX;                           //当前的箱子就是人的下一个坐标

		BoxY = personNextY;

		BoxNextX = BoxX + 1;
		BoxNextY = BoxY;
		if (map[BoxNextX][BoxNextY] == 0)              //如果箱子的下一个坐标是空地就推过去
		{
			map[BoxNextX][BoxNextY] = 2;
			map[BoxX][BoxY] = 4;
			map[personX][personY] = 0;
			personX = personNextX;                   //人的下一个坐标变为人的当前坐标
			personY = personNextY;

		}
		else if (map[BoxNextX][BoxNextY] == 3)       //如果箱子的下一个坐标是
		{
			map[BoxNextX][BoxNextY] = 2;
			map[BoxX][BoxY] = 4;
			map[personX][personY] = 0;
			personX = personNextX;                   //人的下一个坐标变为人的当前坐标
			personY = personNextY;
			win += 1;                                //已经推进去的箱子数加1
		}
	}


}

//小人向左移动的方法  
void moveToLeft()
{
	//人的下一个坐标
	int personNextX = personX;
	int personNextY = personY - 1;

	//箱子的坐标和下一个坐标
	int BoxX, BoxY, BoxNextX, BoxNextY;


	if (map[personNextX][personNextY] == 0)            //如果下一个坐标是0即空地   人到空地上,人的坐标变为空地
	{
		map[personNextX][personNextY] = 4;
		map[personX][personY] = 0;

		personX = personNextX;
		personY = personNextY;
	}
	else if (map[personNextX][personNextY] == 1)      //如果下一个坐标是1即墙
	{
		//不进行操作
	}
	else if (map[personNextX][personNextY] == 2)      //如果下一个坐标是2即箱子
	{
		BoxX = personNextX;                           //当前的箱子就是人的下一个坐标

		BoxY = personNextY;

		BoxNextX = BoxX;
		BoxNextY = BoxY - 1;
		if (map[BoxNextX][BoxNextY] == 0)              //如果箱子的下一个坐标是空地就推过去
		{
			map[BoxNextX][BoxNextY] = 2;
			map[BoxX][BoxY] = 4;
			map[personX][personY] = 0;
			personX = personNextX;                   //人的下一个坐标变为人的当前坐标
			personY = personNextY;

		}
		else if (map[BoxNextX][BoxNextY] == 3)       //如果箱子的下一个坐标是
		{
			map[BoxNextX][BoxNextY] = 2;
			map[BoxX][BoxY] = 4;
			map[personX][personY] = 0;
			personX = personNextX;                   //人的下一个坐标变为人的当前坐标
			personY = personNextY;
			win += 1;                                //已经推进去的箱子数加1
		}
	}


}

//小人向右移动的方法  
void moveToRight()
{
	//人的下一个坐标
	int personNextX = personX;
	int personNextY = personY + 1;

	//箱子的坐标和下一个坐标
	int BoxX, BoxY, BoxNextX, BoxNextY;


	if (map[personNextX][personNextY] == 0)            //如果下一个坐标是0即空地   人到空地上,人的坐标变为空地
	{
		map[personNextX][personNextY] = 4;
		map[personX][personY] = 0;

		personX = personNextX;
		personY = personNextY;
	}
	else if (map[personNextX][personNextY] == 1)      //如果下一个坐标是1即墙
	{
		//不进行操作
	}
	else if (map[personNextX][personNextY] == 2)      //如果下一个坐标是2即箱子
	{
		BoxX = personNextX;                           //当前的箱子就是人的下一个坐标

		BoxY = personNextY;

		BoxNextX = BoxX;
		BoxNextY = BoxY + 1;
		if (map[BoxNextX][BoxNextY] == 0)              //如果箱子的下一个坐标是空地就推过去
		{
			map[BoxNextX][BoxNextY] = 2;
			map[BoxX][BoxY] = 4;
			map[personX][personY] = 0;
			personX = personNextX;                   //人的下一个坐标变为人的当前坐标
			personY = personNextY;

		}
		else if (map[BoxNextX][BoxNextY] == 3)       //如果箱子的下一个坐标是
		{
			map[BoxNextX][BoxNextY] = 2;
			map[BoxX][BoxY] = 4;
			map[personX][personY] = 0;
			personX = personNextX;                   //人的下一个坐标变为人的当前坐标
			personY = personNextY;
			win += 1;                                //已经推进去的箱子数加1
		}
	}


}

 

共有 人打赏支持
粉丝 0
博文 2
码字总数 1986
×
愚人自忧
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: