C语言推箱子简易版VC++6.0代码

/
//游戏中用0表示空地,1表示人物,2表示箱子,3表示目的地,6表示围墙
//本程序由VC++6.0开发,采用了easyx函数库,请到http://www.easyx.cn/网站下载
//作者:sambrown  from zzu  感谢网友:自然向日葵 
/
#include 
#include 
#include 
#include 
#include 
int loop;
int x, y;			//人物坐标
int win(int a[][10])
{
	for(int x1 = 0; x1 < 10; x1++)
		for(int y1 = 0; y1 < 10; y1++)
			if(a[x1][y1] == 2) return 0;					//如果还有箱子返回假
	return 1;												//如果没有箱子返回真
}
void find( int a[][10] )
{
	for(x = 0; x < 10; x++)
		for(y = 0; y < 10; y++)
			if(a[x][y] == 1 || a[x][y] == 4 ) 
				return;
}
void clearman( int i, int j )
{
	i *= 40;
	j *= 40;
	setcolor(BLACK);
	setfillstyle(BLACK);
	fillcircle(i, j, 19 );
}
void clearbox( int i, int j )
{
	i *= 40;
	j *= 40;
	i -= 20;
	j -= 20;
	setfillstyle(BLACK);
	bar( i, j, i+39, j+39 );
}
void drawwall( int i, int j )
{
	i *= 40;
	j *= 40;
	i -= 20;
	j -= 20;
	setfillstyle(RED);
	bar( i, j, i+40, j+40 );
}
void drawman( int i, int j )
{
	i *= 40;
	j *= 40;
	setcolor(GREEN);
	setfillstyle(GREEN);
	fillcircle(i, j, 19);
}
void drawbox( int i, int j )
{
	i *= 40;
	j *= 40;
	i -= 20;
	j -= 20;
	setfillstyle(BROWN);
	bar( i, j, i+39, j+39 );
}
void okbox( int i, int j )
{
	i *= 40;
	j *= 40;
	i -= 20;
	j -= 20;
	setfillstyle(GREEN);
	bar( i, j, i+39, j+39 );
}
void drawdest( int i, int j )
{
	i *= 40;
	j *= 40;
	setcolor(YELLOW);
	setfillstyle(YELLOW);
	fillcircle( i, j, 10 );
}

//print函数部分,打印出来的图像和实际的数组是相反的,

void print( int b[][10] )
{
	cleardevice();
	setorigin( 50, 50 );
	for( int i = 0; i < 10; i++ )
		for( int j = 0; j < 10; j++ )
		{
			if( b[i][j] == 6)					//墙
				drawwall( i, j );
			if( b[i][j] == 1)
				drawman( i, j );				//人
			if( b[i][j] == 2)
				drawbox( i, j );				//箱子
			if( b[i][j] == 3)		
				drawdest( i, j );				//目的地
												//空地什么也不打印
		}
}
void move( int b[][10], int x1, int y1 )
{
	if( b[x+x1][y+y1] == 0 || b[x+x1][y+y1] == 3 )		//如果前面是空地或目的
	{
			b[x][y] --;
			b[x+x1][y+y1] ++;
			clearman( x, y );
			drawman( x+x1, y+y1 );
			if( b[x][y] == 3 )				//如果站在目的上移动,则走后要加上目的
				drawdest( x, y );
	}
	if((b[x + x1][y + y1] == 2 || b[x + x1][y + y1] == 5)	//如果前面是空地上的箱子 “或” 目的上的箱子
	&& (b[x+x1+x1][y+y1+y1] == 0 || b[x+x1+x1][y+y1+y1] == 3))	//“并且”  箱子前面是空地 “或”  目的
	{
		b[x][y] --;
		b[x+x1][y+y1]--;
		b[x+x1+x1][y+y1+y1] += 2;
		clearbox( x+x1, y+y1 );
		drawbox( x+x1+x1, y+y1+y1 );
		clearman( x, y );
		drawman( x+x1, y+y1 );
		if( b[x+x1+x1][y+y1+y1] == 5)
				okbox( x+x1+x1, y+y1+y1 );
		if( b[x][y] == 3 )				//如果站在目的上移动,则走后要加上目的
				drawdest( x, y );


	}
}
void play( int b[][10] )
{
	loop = 0;
	print(b);	
	do
	{
			find(b);
			switch( getch() )										//获取键盘
			{
				case ' ':	loop = 1;		return ;				//重新开始当前关 
				case  27:	exit(0);		break;					//结束游戏 
				case 'a':	move(b, -1, 0 );break;
				case 'd':	move(b, 1, 0 ); break;
				case 'w':	move(b, 0, -1 ); break;
				case 's':	move(b, 0, 1 );break;
			}
	}while(!win(b));										//通过win函数判断是否通过
	MessageBox(NULL, _T("恭喜你赢了"), _T("提醒"), MB_OK );
}
void initmap()
{
	int b[10][10];
	int a[1][10][10]={										//定义三维地图数组
							{
								{6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
								{6, 0, 0, 0, 0, 0, 0, 0, 0, 6},			//此处地图可以自定义,注意数组顺序和打印出来的是相反的
								{6, 0, 0, 0, 2, 0, 3, 0, 0, 6},			//切记数组一定要是10x10的,不能缺少元素,缺少的元素全部填补为墙
								{6, 0, 0, 0, 0, 0, 0, 0, 0, 6},
								{6, 0, 0, 0, 0, 0, 0, 0, 0, 6},
								{6, 0, 0, 0, 1, 0, 0, 0, 0, 6},
								{6, 0, 0, 0, 0, 0, 0, 0, 0, 6},
								{6, 0, 2, 0, 0, 0, 3, 0, 0, 6},
								{6, 0, 0, 0, 0, 0, 0, 0, 0, 6},
								{6, 6, 6, 6, 6, 6, 6, 6, 6, 6}
							}
					};
				for( int i = 0; i < 1; i++ )
				{
					do
					{
						loop = 0;
						for( int j = 0; j < 10; j++ )
							for( int k = 0; k < 10; k++ )
								b[j][k] = a[i][j][k];
						play(b);
					}while(loop);
				}
						
}
int main()
{
	initgraph(640, 480);
	initmap();
	closegraph();
	return 0;
}


你可能感兴趣的:(C语言)