#include<stdlib.h>
#include<windows.h>
#include<stdio.h>
#include<conio.h>
void init(); //初始化
void print(); //打印推箱子界面
void left(); //向左推箱子
void right(); //向右推箱子
void up(); //向上推箱子
void down(); //向下推箱子
void welcome(); //显示欢迎界面
void over(); //显示游戏结束界面
void gotoxy(int x,int y); // 光标跳转,行y,列x
//定义地图数组,二维数组有两个维度,而地图也是二维的矩形
int map[8][8]={
{0,0,1,1,1,0,0,0},
{0,0,1,4,1,0,0,0},
{0,0,1,0,1,1,1,1},
{1,1,1,3,0,3,4,1},
{1,4,0,3,2,1,1,1},
{1,1,1,1,3,1,0,0},
{0,0,0,1,4,1,0,0},
{0,0,0,1,1,1,0,0}
};
//人的位置,在二维地图中,我们可以用坐标表示一个人的位置,就好比经纬度
int x, y;
//箱子的个数,推箱子肯定要有箱子嘛。
int box=0;
int main()
{
SetConsoleTitle("推箱子--C语言版");
init();
welcome();
system("pause");
char a,c;
while(1)
{
//每次循环的开始清除屏幕
system("cls");
//绘画地图
print();
//判断,当box的数量0时,!0为真,然后走break跳出循环(结束游戏)
if(!box){
over();
break;
}
//键盘输入方向,这里使用getch,因为getch读取字符不会显示在屏幕上
a=getch();
switch(a)
{
case'a':
left();
break;
case'd':
right();break;
case'w':
up();break;
case's':
down();break;
}
}
return 0;
}
void gotoxy(int x, int y)
{ // 更新光标位置
COORD pos;
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(hOutput, pos);
// 隐藏光标
CONSOLE_CURSOR_INFO cursor;
cursor.bVisible = FALSE;
cursor.dwSize = sizeof(cursor);
SetConsoleCursorInfo(hOutput, &cursor);
}
void welcome()
{
gotoxy(15,0);
printf("**********************");
gotoxy(16,5);
printf("欢迎使用推箱子游戏");
gotoxy(15,10);
printf("**********************");
}
void over()
{
gotoxy(15,0);
printf("**********************");
gotoxy(18,5);
printf("游戏结束");
gotoxy(15,10);
printf("**********************");
}
void init()
{
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(map[i][j]==2)
{
x=i;
y=j;
}
if(map[i][j]==3)
{
box++;
}
}
}
}
void print()
{
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;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;
case 5:
printf("★");
break;
}
}
printf("\n");
}
}
/*
人向左移动
1.左边是空白--x=x;y=y+2不变
2.左边是箱子
(1)箱子左边是空白--人变为(0),箱子变为人(2),箱子左边变为(3)
(2)箱子左边是目的地(4)-- 人变为(0),箱子变为人(2),箱子左边(目的地)变为(5),箱子个数减1
(3)箱子左边是墙--不做操作
3.左边是目的地--不做操作
4.左边是墙--不做操作
*/
void left()
{
int x,y,i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(map[i][j]==2)
{
x=i;
y=j;
break;
}
}
}
int x1,y1; //人左边坐标
x1=x;
y1=y-1;
//左边是空白
if(map[x1][y1]==0)
{
map[x][y]=0;
map[x1][y1]=2;
}
//左边是箱子
if(map[x1][y1]==3)
{
if(map[x1][y1-1]==0)
{
map[x][y]=0;
map[x1][y1]=2;
map[x1][y1-1]=3;
}
else if(map[x1][y1-1]==4)
{
map[x][y]=0;
map[x1][y1]=2;
map[x1][y1-1]=5;
box--;
}
else
{
return;
}
}
//左边是目的地
if(map[x1][y1]==4)
{
return;
}
//左边是墙
if(map[x1][y1]==1)
{
return;
}
}
void right()
{
int x,y,i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(map[i][j]==2)
{
x=i;
y=j;
break;
}
}
}
int x1,y1; //人左边坐标
x1=x;
y1=y+1;
//右边是空白
if(map[x1][y1]==0)
{
map[x][y]=0;
map[x1][y1]=2;
}
//右边是箱子
if(map[x1][y1]==3)
{
if(map[x1][y1+1]==0)
{
map[x][y]=0;
map[x1][y1]=2;
map[x1][y1+1]=3;
}
else if(map[x1][y1+1]==4)
{
map[x][y]=0;
map[x1][y1]=2;
map[x1][y1+1]=5;
box--;
}
else
{
return;
}
}
//右边是目的地
if(map[x1][y1]==4)
{
return;
}
//右边是墙
if(map[x1][y1]==1)
{
return;
}
}
void down()
{
int x,y,i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(map[i][j]==2)
{
x=i;
y=j;
break;
}
}
}
int x1,y1; //人下边坐标
x1=x+1;
y1=y;
//下边是空白
if(map[x1][y1]==0)
{
map[x][y]=0;
map[x1][y1]=2;
}
//下边是箱子
if(map[x1][y1]==3)
{
if(map[x1+1][y1]==0)
{
map[x][y]=0;
map[x1][y1]=2;
map[x1+1][y1]=3;
}
else if(map[x1+1][y1]==4)
{
map[x][y]=0;
map[x1][y1]=2;
map[x1+1][y1]=5;
box--;
}
else
{
return;
}
}
//下边是目的地
if(map[x1][y1]==4)
{
return;
}
//下边是墙
if(map[x1][y1]==1)
{
return;
}
}
void up()
{
int x,y,i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(map[i][j]==2)
{
x=i;
y=j;
break;
}
}
}
int x1,y1; //人上边坐标
x1=x-1;
y1=y;
//上边是空白
if(map[x1][y1]==0)
{
map[x][y]=0;
map[x1][y1]=2;
}
//上边是箱子
if(map[x1][y1]==3)
{
if(map[x1-1][y1]==0)
{
map[x][y]=0;
map[x1][y1]=2;
map[x1-1][y1]=3;
}
else if(map[x1-1][y1]==4)
{
map[x][y]=0;
map[x1][y1]=2;
map[x1-1][y1]=5;
box--;
}
else
{
return;
}
}
//上边是目的地
if(map[x1][y1]==4)
{
return;
}
//上边是墙
if(map[x1][y1]==1)
{
return;
}
}