📄 tuixiangzi.c
字号:
for(J=0;J<MAXC;J++) {
ch=MAP[I][J];
PutIco(ch); /*判定初始化状态下推箱者的位置(MEX,MEY)*/
if(ch=='P'){ MEX=J+SX; MEY=I+SY;}
else if(ch=='T'||ch=='F'||ch=='D') TOTAL++;
}
wmove(win,temp++,SX);
}
wmove(win,MEY,MEX); /*光标总是跟随推箱者下边*/
}
void StartGame() /*开始游戏及移动处理函数*/
{ int KEY,I=MEY-SY,J=MEX-SX; /*将推箱者的位置(MEX,MEY)换算成在二维数组MAP[][]中的相应位置*/
while(1)
{
wrefresh(win);
KEY=getch(); /* 等待自键盘输入字元*/
switch(KEY)
{ case 27 : endwin(); exit(0); /*按ESC键退出游戏*/
case '\t': ClearMap(); InitialMap(LEVEL);
StartGame(); break; /*按TAB 键重新开始当前游戏*/
case '\r': wmove(win,6,1);wprintw(win,"SELECT"); /*按回车键进行重新选关处理*/
scanw("%d",&LEVEL); /*注意没有以scanw()函数进行相应处理,所以要正确输入数据*/
ClearMap(); InitialMap(LEVEL);
StartGame(); break;
case 'a' : if(MAP[I][J-1]=='0') /*推箱者向左移动到空白处*/
{ PutIco(ORI[I][J]); MAP[I][J]=ORI[I][J];
MAP[I][--J]='P'; --MEX;
}
else if(MAP[I][J-1]=='B'||MAP[I][J-1]=='F') /*推箱者左边有箱子*/
{ if(MAP[I][J-2]=='0') /*箱子的左边是空白处*/
{ PutIco(ORI[I][J]); MAP[I][J]=ORI[I][J];
MAP[I][--J]='P'; --MEX;
wmove(win,MEY,MEX-1); PutIco('B');
MAP[I][J-1]='B';
}
else if(MAP[I][J-2]=='D') /*箱子的左边是目的地*/
{ PutIco(ORI[I][J]); MAP[I][J]=ORI[I][J]; --MEX;
if(MAP[I][J-1]=='F') /*如果此箱子占据目的地*/
{ MAP[I][--J]='T'; wmove(win,MEY,MEX);
wattron(win,COLOR_PAIR(1)); wprintw(win,"T");
}
else MAP[I][--J]='P'; /*如果此箱子占据空白处*/
wmove(win,MEY,MEX-1); wattron(win,COLOR_PAIR(4)); wprintw(win,"F");
MAP[I][J-1]='F';
}
}
else if(MAP[I][J-1]=='D') /*推箱者向左移动到目的地*/
{ PutIco(ORI[I][J]); MAP[I][J]=ORI[I][J]; MAP[I][--J]='T';
wmove(win,MEY,--MEX); wattron(win,COLOR_PAIR(1)); wprintw(win,"T");
} break;
case 'd': if(MAP[I][J+1]=='0') /*推箱者向右移动到空白处*/
{ PutIco(ORI[I][J]); MAP[I][J]=ORI[I][J];
MAP[I][++J]='P'; ++MEX;
}
else if(MAP[I][J+1]=='B'||MAP[I][J+1]=='F') /*推箱者右边有箱子*/
{ if(MAP[I][J+2]=='0') /*箱子的右边是空白处*/
{ PutIco(ORI[I][J]); MAP[I][J]=ORI[I][J];
MAP[I][++J]='P'; ++MEX;
wmove(win,MEY,MEX+1); PutIco('B');
MAP[I][J+1]='B';
}
else if(MAP[I][J+2]=='D') /*箱子的右边是目的地*/
{ PutIco(ORI[I][J]); MAP[I][J]=ORI[I][J]; ++MEX;
if(MAP[I][J+1]=='F') /*如果此箱子占据目的地*/
{ MAP[I][++J]='T'; wmove(win,MEY,MEX);
wattron(win,COLOR_PAIR(1)); wprintw(win,"T");
}
else MAP[I][++J]='P'; /*如果此箱子占据空白处*/
wmove(win,MEY,MEX+1);wattron(win,COLOR_PAIR(4)); wprintw(win,"F");
MAP[I][J+1]='F';
}
}
else if(MAP[I][J+1]=='D') /*推箱者向右移动到目的地*/
{ PutIco(ORI[I][J]); MAP[I][J]=ORI[I][J]; MAP[I][++J]='T';
wmove(win,MEY,++MEX);wattron(win,COLOR_PAIR(1)); wprintw(win,"T");
} break;
case 'w': if(MAP[I-1][J]=='0') /*推箱者向上移动到空白处*/
{ PutIco(ORI[I][J]); MAP[I][J]=ORI[I][J];
MAP[--I][J]='P'; --MEY;
}
else if(MAP[I-1][J]=='B'||MAP[I-1][J]=='F') /*推箱者上边有箱子*/
{ if(MAP[I-2][J]=='0') /*箱子的上边是空白处*/
{ PutIco(ORI[I][J]); MAP[I][J]=ORI[I][J];
MAP[--I][J]='P'; --MEY;
wmove(win,MEY-1,MEX);PutIco('B');
MAP[I-1][J]='B';
}
else if(MAP[I-2][J]=='D') /*箱子的上边是目的地*/
{ PutIco(ORI[I][J]); MAP[I][J]=ORI[I][J]; --MEY;
if(MAP[I-1][J]=='F') /*如果此箱子占据目的地*/
{ MAP[--I][J]='T'; wmove(win,MEY,MEX);
wattron(win,COLOR_PAIR(1)); wprintw(win,"T");
}
else MAP[--I][J]='P'; /*如果此箱子占据空白处*/
wmove(win,MEY-1,MEX);wattron(win,COLOR_PAIR(4)); wprintw(win,"F");
MAP[I-1][J]='F';
}
}
else if(MAP[I-1][J]=='D') /*推箱者向上移动到目的地*/
{ PutIco(ORI[I][J]); MAP[I][J]=ORI[I][J]; MAP[--I][J]='T';
wmove(win,--MEY,MEX); wattron(win,COLOR_PAIR(1)); wprintw(win,"T");
} break;
case 's': if(MAP[I+1][J]=='0') /*推箱者向下移动到空白处*/
{ PutIco(ORI[I][J]); MAP[I][J]=ORI[I][J];
MAP[++I][J]='P'; ++MEY;
}
else if(MAP[I+1][J]=='B'||MAP[I+1][J]=='F') /*推箱者下边有箱子*/
{ if(MAP[I+2][J]=='0') /*箱子的下边是空白处*/
{ PutIco(ORI[I][J]); MAP[I][J]=ORI[I][J];
MAP[++I][J]='P'; ++MEY;
wmove(win,MEY+1,MEX); PutIco('B');
MAP[I+1][J]='B';
}
else if(MAP[I+2][J]=='D') /*箱子的下边是目的地*/
{ PutIco(ORI[I][J]); MAP[I][J]=ORI[I][J]; ++MEY;
if(MAP[I+1][J]=='F') /*如果此箱子占据目的地*/
{ MAP[++I][J]='T'; wmove(win,MEY,MEX);
wattron(win,COLOR_PAIR(1)); wprintw(win,"T");
}
else MAP[++I][J]='P'; /*如果此箱子占据空白处*/
wmove(win,MEY+1,MEX);wattron(win,COLOR_PAIR(4)); wprintw(win,"F");
MAP[I+1][J]='F';
}
}
else if(MAP[I+1][J]=='D') /*推箱者向下移动到目的地*/
{ PutIco(ORI[I][J]); MAP[I][J]=ORI[I][J]; MAP[++I][J]='T';
wmove(win,++MEY,MEX);wattron(win,COLOR_PAIR(1)); wprintw(win,"T");
} break;
}
if(MAP[I][J]=='P') { wmove(win,MEY,MEX); PutIco('P'); } /*标出推箱者的当前位置*/
//ClearData(); /*清除显示的内存数据*/
//PutData(); /*显示内存数据,即二维数组中的数据*/
wmove(win,MEY,MEX);/*定位光标到推箱者下边*/
if(JudgeMap()) /*判定当前闯关是否成功*/
{ wmove(win,20,5); beep();
wprintw(win,"SUCCESSFUL,GOOD LUCK!"); /*成功时显示信息并做好进入下一关的准备*/ wrefresh(win);
getch(); wmove(win,20,5);
wprintw(win," "); wrefresh(win);
ClearMap();
InitialMap(++LEVEL);
StartGame();
}
}
}
void ClearMap()
{ int I,J;
wmove(win,SY,SX);
for(I=0;I<MAXL;I++)
{ for(J=0;J<MAXC;J++)
wprintw(win," ");
wprintw(win,"\n");
}
}
void PutIco(char ch) /*用固定格式写入图标,即地图中的每个图形单位(字符)*/
{ if(ch=='0') wprintw(win," ");
else if(ch=='W') { wattron(win,COLOR_PAIR(1)); wprintw(win,"W");}
else if(ch=='P') { wattron(win,COLOR_PAIR(4)); wprintw(win,"P"); }
else if(ch=='B') { wattron(win,COLOR_PAIR(2)); wprintw(win,"B");}
else if(ch=='D') { wattron(win,COLOR_PAIR(7)); wprintw(win,"D"); }
else if(ch=='F') { wattron(win,COLOR_PAIR(4)); wprintw(win,"F"); }
else if(ch=='T') { wattron(win,COLOR_PAIR(1)); wprintw(win,"T"); } //else wprintw(win," ");wrefresh(win);
}
int JudgeMap() /*判定闯关是否成功,此函数可以改成在StartGame()函数中进行数据统计*/
{ int I,J,N=0;
for(I=0;I<MAXL;I++)
for(J=0;J<MAXC;J++)
if(MAP[I][J]=='F') N++;
if(N==TOTAL) return 1;
else return 0;
}
/*------------程序检测部分--------------*/
void PutData()
{ int I,J;
for(I=0;I<MAXL;I++)
{ wmove(win,SY+I,30);
for(J=0;J<MAXC;J++)
wprintw(win,"%c",MAP[I][J]);
}
}
void ClearData()
{int I,J;
for(I=0;I<MAXL;I++)
{ wmove(win,SY+I,30);
for(J=0;J<MAXC;J++)
wprintw(win," ");
}
}
void initial()
{
initscr();
cbreak();
nonl();
noecho();
intrflush(stdscr,FALSE);
keypad(stdscr,TRUE);
refresh();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -