推箱子:
数据分析:
1、确定数值与字符的对应关系
0 ' '
1 '@'
2 '#'
3 '$'
4 'O'
5 '@'
7 '$'
2、定义8*8整数地图并初始化
3、定义记录角色位置的变量 x y
4、定义记录步数的变量
逻辑分析:
进入死循环
1、清理屏幕、显示地图
if(0 == map[i][j]) printf(" ");
2、判断是否游戏胜利
3、获取方向键并处理
1、前方是路/目标点,参考走迷宫
前方 +1
原位置 -1
更新坐标
2、前方是箱子
箱子的前方是路\目标点
人前方的前方 +3
人前方 -3+1
人原位置 -1
更新左边
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <getch.h>
int main(int argc,const char* argv[])
{
char map[8][8] = {
{0,0,2,2,2,2,0,0},
{0,0,2,4,4,2,0,0},
{0,2,2,0,4,2,2,0},
{0,2,0,0,3,4,2,0},
{2,2,0,3,0,0,2,2},
{2,0,0,2,3,3,0,2},
{2,0,0,1,0,0,0,2},
{2,2,2,2,2,2,2,2}
};
char man_x = 6,man_y = 3;
int step = 0;
for(;;)
{
int count = 0;
system("clear");
for(int i=0; i<8; i++)
{
for(int 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("O ");break;
case 5: printf("@ ");break;
case 7: printf("$ "); count++; break;
}
}
printf("\n");
}
if(4 == count)
{
printf("游戏胜利 走了%d步!\n",step);
return 0;
}
int ox = 0,oy = 0;
switch(getch())
{
case 183: ox--; break;
case 184: ox++; break;
case 186: oy--; break;
case 185: oy++; break;
}
if(0 == map[man_x+ox][man_y+oy] ||
4 == map[man_x+ox][man_y+oy])
{
map[man_x+ox][man_y+oy] += 1;
map[man_x][man_y] -= 1;
man_x += ox;
man_y += oy;
step++;
continue;
}
if(3 == map[man_x+ox][man_y+oy] ||
7 == map[man_x+ox][man_y+oy])
{
if(0 == map[man_x+ox*2][man_y+oy*2] ||
4 == map[man_x+ox*2][man_y+oy*2])
{
map[man_x+ox*2][man_y+oy*2] += 3;
map[man_x+ox][man_y+oy] -= 2;
map[man_x][man_y] -= 1;
man_x += ox;
man_y += oy;
step++;
}
}
}
}