/
//游戏中用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;
}