⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tuixiangzi.c

📁 这是LInux下C语言开发的推箱子游戏。对学习curese编程的人有帮助 用了大量的Curese函数
💻 C
📖 第 1 页 / 共 2 页
字号:
   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 + -