#include "interface.h"
#include "pic.c"
/*
* 打印原始图像函数
*
* int (*arr)[COL], 数组
* int row_num, 数组行数
* int col_num, 数组列数
* int pic_row, 图像行数
* int pic_col 图像列数
*
*/
void prt_interface(int (*arr)[COL], int row_num, int col_num, int pic_row, int pic_col)
{
int i, j;
#if num1
for (i = 0; i < row_num; i++)
{
for (j = 0; j < col_num; j++)
{
if (arr[i][j] == 1)
{/*箱子*/
printf("@");
}
else if (arr[i][j] == 2)
{/*目的地*/
printf("*");
}
else if (arr[i][j] == 3)
{/*箱子和*叠加*/
printf("@");
}
else if (arr[i][j] == 4)
{/*围墙*/
printf("#");
}
else
{/*空地*/
printf(" ");
}
}
printf("\n");
}
printf("\e[%dA",row_num);
#endif
#if num2
for (i = 0; i < row_num; i++)
{
for (j = 0; j < col_num; j++)
{
if (arr[i][j] == 1)
{/*箱子*/
prt_box();
}
else if (arr[i][j] == 2)
{/*目的地*/
prt_star();
}
else if (arr[i][j] == 3)
{/*箱子和*叠加*/
prt_add();
}
else if (arr[i][j] == 4)
{/*围墙*/
prt_wall();
}
else
{/*空地*/
prt_air();
}
}
printf("\e[%dD\e[%dB", COL*pic_col, pic_row);
}
printf("\e[%dA",row_num * pic_row);
#endif
return ;
}
/*
*
* 功能:计算*的个数的函数
*
* int (*arr)[COL] 数组
* int row_num 数组行数
* int col_num) 数组列数
*
*
* */
int overlap(int (*arr)[COL], int row_num, int col_num)
{
int i = 0, j = 0;
int count = 0;
for (i = 0; i < row_num; i++)
{
for (j = 0; j < col_num; j++)
{
if (arr[i][j] == 2)
{
count++;
}
}
}
return count;
}
/*
* 功能:按键控制函数
*
*
* int (*arr)[COL], 数组
* int row_num, 数组行数
* int col_num, 数组列数
* int init_row, 初始化行坐标
* int init_col,初始化列坐标
* int pic_row, 图像行数
* int pic_col 图像列数
*
*
*/
void get_keyboard(int (*arr)[COL], int row_num, int col_num, int init_row, int init_col, int pic_row, int pic_col)
{
int ret;
char key[3] = {0};
int count = 0;
/*计算数组*的个数*/
int sum = overlap(arr, row_num, col_num);
printf("%d\n",sum);
/*缓冲设置*/
tcgetattr(0, &oldattr);
cfmakeraw(&newattr);
/*打印数组初始图像*/
prt_interface(arr, row_num, col_num, pic_row, pic_col);
/*移动光标到初始化位置*/
row = init_row; col = init_col;
#if num1
printf("\e[%dB\e[%dC",init_row, init_col);
#endif
#if num2
printf("\e[%dB\e[%dC", init_row * pic_row, init_col * pic_col);
prt_man();
printf("\e[%dD", pic_col);
#endif
fflush(NULL);
while(1)
{
/*截取数据流*/
memset(key, 0, 3);
tcsetattr(0, TCSANOW, &newattr);
ret = read(0, key, 3);
tcsetattr(0, TCSANOW, &oldattr);
fflush(NULL);
if (ret == 1 && key[0] == 3)
{/*按了Ctrl+c键退出*/
exit(0);
}
/*按了up/down/left/right键*/
else if(ret == 3)
{
/***************************************************************************/
if (key[0] == 27 && key[1] == 91 && key[2] == 65)
{/*按了up键*/
if (row > 0)
{
/*碰到的是空*地直接走*/
if (arr[row-1][col] == 0)
{
if (arr[row][col] == 2)
{
#if num1
printf("*\e[1D\e[1A%%\e[1D");
#endif
#if num2
prt_star();
printf("\e[%dD", pic_col);
printf("\e[%dA", pic_row);
prt_man();
printf("\e[%dD", pic_col);
#endif
fflush(stdout);
}
else
{
#if num1
printf(" \e[1D\e[1A%%\e[1D");
#endif
#if num2
prt_air();
printf("\e[%dD", pic_col);
printf("\e[%dA", pic_row);
prt_man();
printf("\e[%dD", pic_col);
#endif
fflush(stdout);
}
row--;
}
/*碰到的只是箱子*/
else if (arr[row-1][col] == 1 )
{
if (arr[row-2][col] == 0)
{
if (arr[row][col] == 2)
{
#if num1
printf("*\e[1D\e[2A@\e[1D\e[1B%%\e[1D");
#endif
#if num2
prt_star();
printf("\e[%dD",pic_col);
printf("\e[%dA",2 * pic_row);
prt_box();
printf("\e[%dD",pic_col);
printf("\e[%dB", pic_row);
prt_man();
printf("\e[%dD",pic_col);
#endif
fflush(stdout);
}
else if (arr[row][col] == 0)
{
#if num1
printf(" \e[1D\e[2A@\e[1D\e[1B%%\e[1D");
#endif
#if num2
prt_air();
printf("\e[%dD",pic_col);
printf("\e[%dA",2 * pic_row);
prt_box();
printf("\e[%dD",pic_col);
printf("\e[%dB", pic_row);
prt_man();
printf("\e[%dD",pic_col);
#endif
fflush(stdout);
}
arr[row-1][col] = 0;
arr[row-2][col] = 1;
row--;
}
else if (arr[row-2][col] == 2)
{
if (arr[row][col] == 2)
{
#if num1
printf("*\e[1D\e[2A@\e[1D\e[1B%%\e[1D");
#endif
#if num2
prt_star();
printf("\e[%dD",pic_col);
printf("\e[%dA",2 * pic_row);
prt_add();
printf("\e[%dD",pic_col);
printf("\e[%dB", pic_row);
prt_man();
printf("\e[%dD",pic_col);
#endif
fflush(stdout);
}
else if (arr[row][col] == 0)
{
#if num1
printf(" \e[1D\e[2A@\e[1D\e[1B%%\e[1D");
#endif
#if num2
prt_air();
printf("\e[%dD",pic_col);
printf("\e[%dA",2 * pic_row);
prt_add();
printf("\e[%dD",pic_col);
printf("\e[%dB", pic_row);
prt_man();
printf("\e[%dD",pic_col);
#endif
fflush(stdout);
}
arr[row-1][col] = 0;
arr[row-2][col] = 3;
count++;
if (sum == count)
{
return;
}
row--;
}
}
/*碰到*的地方*/
else if (arr[row-1][col] == 2)
{
if (arr[row][col] == 2)
{
#if num1
printf("*\e[1D\e[1A%%\e[1D");
#endif
#if num2
prt_star();
printf("\e[%dD", pic_col);
printf("\e[%dA", pic_row);
prt_man();
printf("\e[%dD", pic_col);
#endif
fflush(stdout);
}
else
{
#if num1
printf(" \e[1D\e[1A%%\e[1D");
#endif
#if num2
prt_air();
printf("\e[%dD", pic_col);
printf("\e[%dA", pic_row);
prt_man();
printf("\e[%dD", pic_col);
#endif
fflush(stdout);
}
row--;
}/*end of else if (arr[row-1][col] == 2)碰到*的地方*/
/*碰到箱子和*叠加的地方*/
else if (arr[row-1][col] == 3)
{
if (arr[row-2][col] == 0)
{
if (arr[row][col] == 2)
{
#if num1
printf("*\e[1D\e[2A@\e[1D\e[1B%%\e[1D");
#endif
#if num2
prt_star();
printf("\e[%dD", pic_col);
printf("\e[%dA", 2 * pic_row);
prt_box();
printf("\e[%dD", pic_col);
printf("\e[%dB", pic_row);
prt_man();
printf("\e[%dD", pic_col);
#endif
fflush(stdout);
}
else
{
#if num1
printf(" \e[1D\e[2A@\e[1D\e[1B%%\e[1D");
#endif
#if num2
prt_air();
printf("\e[%dD", pic_col);
printf("\e[%dA", 2 * pic_row);
prt_box();
printf("\e[%dD", pic_col);
printf("\e[%dB", pic_row);
prt_man();
printf("\e[%dD", pic_col);
#endif
fflush(stdout);
}
arr[row-1][col] = 2;
arr[row-2][col] = 1;
count--;
row--;
continue;
}
else if (arr[row-2][col] == 2)
{
if (arr[row][col] == 2)
{
#if num1
printf("*\e[1D\e[2A@\e[1D\e[1B%%\e[1D");
#endif
#if num2
prt_star();
printf("\e[%dD", pic_col);
printf("\e[%dA", 2 * pic_row);
prt_add();
printf("\e[%dD", pic_col);
printf("\e[%dB", pic_row);
prt_man();
printf("\e[%dD", pic_col);
#endif
fflush(stdout);
}
else
{
#if num1
printf(" \e[1D\e[2A@\e[1D\e[1B%%\e[1D");
#endif
#if num2
prt_air();
printf("\e[%dD", pi