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

📄 tuixiangzi.c

📁 这是LInux下C语言开发的推箱子游戏。对学习curese编程的人有帮助 用了大量的Curese函数
💻 C
📖 第 1 页 / 共 2 页
字号:
/*--------------------------------------------------- 
 推箱子游戏:此游戏的算法是十分简明的,将游戏变成一 
 串串的程序代码也不具有难度的. 
 基本思路是利用一个二维数组:数组值用于表示不同的 
 实物与场景.为了直观地处理数据,可以将二维数组设置 
 为一个字符数组.'0'表示什么都没有,'B'表示箱子,'D' 
 表示目的地,'W'表示墙壁,'F'表示箱子被移动到了目的 
 地.'T'表示人走到了目的地上面了. 
 利用这些数值的变化就可以控制整个游戏的运行了. 


----------------------------------------------------*/ 
/*-----------------------变量函数声明部分------------------*/ 
#include<stdio.h>  
#include<curses.h>
#include<string.h> /*库函数与宏定义的常量声明*/

#define GRID 219/*表示方格与推箱者的特殊字符*/ 
#define ME 72 
#define MAXL 12 /*地图的最大长度与宽度*/ 
#define MAXC 25 

char MAP[MAXL][MAXC],ORI[MAXL][MAXC]; /*定义画地图的二维字符数组*/ 
int LEVEL=1,SX=5,SY=8,MEX,MEY,TOTAL; /*定义画地图的起始坐标与相关变量*/ 
 /*(MEX,MEY)为推箱者相对于窗口(80*25)坐标位置, 
 (SX,SY)为地图的起始坐标(左上角),
TOTAL为地图 中的总箱子数*/
 
WINDOW *win;

void initial(); //初始化屏幕
void InitialMap(int n); 
void DrawMap(); 
void StartGame(); 
void ClearMap(); 
void PutIco(char ch); 
void PutData(); /*观察二维字符数组数值变化的检测函数*/ 
void ClearData(); 

/*-------------------------主函数-------------------------*/ 
int main()  
{ 
  
  initial(); /* 呼叫 initial(), 启动 curses puts模式 */ 
  win=newwin(0,30,0,10);/* 建立一个新视窗, 其中LINES,COLS*/
  refresh();
  touchwin(win);        
  wrefresh(win);

//颜色初始化   
  if(!has_colors()||start_color()==ERR){   
  endwin();   
  printf("Terminal   does   not   support   color.\n");   
  exit(1);   
  }   
//添加颜色
  init_pair(1,   COLOR_GREEN,   COLOR_BLACK);   
  init_pair(2,   COLOR_RED,   COLOR_BLACK);   
  init_pair(3,   COLOR_CYAN,   COLOR_BLACK);   
  init_pair(4,   COLOR_WHITE,   COLOR_BLACK);   
  init_pair(5,   COLOR_MAGENTA,   COLOR_BLACK);   
  init_pair(6,   COLOR_BLUE,   COLOR_BLACK);   
  init_pair(7,   COLOR_YELLOW,   COLOR_BLACK);   
  
 wprintw(win,"\n* ESC to exit GAME *\n"); 
 wprintw(win,"* TAB to restart *\n"); 
 wprintw(win,"* ENTER to set values *\n"); 
 wprintw(win,"*----------------------*\n"); 
 InitialMap(1); 
 StartGame(); 
 getch();  endwin(); 
 return 0; 
} 
  
void InitialMap(int n) /*初始化二维数组,即地图的数据设置*/ 
{  int I,J;  
 for(I=0;I<MAXL;I++) 
 for(J=0;J<MAXC;J++) 
  MAP[I][J]=NULL; 
  switch(n) 
  {   case 1: /*第一关地图*/ 
    for(I=0;I<MAXL;I++) {         if(I==0) strcpy(MAP[I],"0WWWWW00"); 
   else if(I==1) strcpy(MAP[I],"0WP0WWW0"); 
   else if(I==2) strcpy(MAP[I],"0W0B00W0"); 
 	else if(I==3) strcpy(MAP[I],"WWW0W0WW"); 
 	else if(I==4) strcpy(MAP[I],"WDW0W00W"); 
 	else if(I==5) strcpy(MAP[I],"WDB00W0W"); 
 	else if(I==6) strcpy(MAP[I],"WD000B0W"); 
 	else if(I==7) strcpy(MAP[I],"WWWWWWWW"); 
  } break; 
 case 2: /*第二关地图*/ 
 for(I=0;I<MAXL;I++) 
 {    if(I==0) strcpy(MAP[I],"0WWWW0"); 
 else if(I==1) strcpy(MAP[I],"WW00W0"); 
 else if(I==2) strcpy(MAP[I],"WPB0W0"); 
 else if(I==3) strcpy(MAP[I],"WWB0WW"); 
 else if(I==4) strcpy(MAP[I],"WW0B0W"); 
 else if(I==5) strcpy(MAP[I],"WDB00W"); 
 else if(I==6) strcpy(MAP[I],"WDD0DW"); 
 else if(I==7) strcpy(MAP[I],"WWWWWW"); 
 } break; 
 case 3: /*第三关地图*/ 
 for(I=0;I<MAXL;I++) 
 {    if(I==0) strcpy(MAP[I],"0WWWWWWW00"); 
 else if(I==1) strcpy(MAP[I],"0W00000WWW"); 
 else if(I==2) strcpy(MAP[I],"WWBWWW000W"); 
 else if(I==3) strcpy(MAP[I],"W0P0B00B0W"); 
 else if(I==4) strcpy(MAP[I],"W0DDW0B0WW"); 
 else if(I==5) strcpy(MAP[I],"WWDDW000W0"); 
 else if(I==6) strcpy(MAP[I],"0WWWWWWWW0"); 
 } break; 
 case 4: /*第四关地图*/ 
 for(I=0;I<MAXL;I++) 
 {    if(I==0) strcpy(MAP[I],"000WWWWWWW"); 
 else if(I==1) strcpy(MAP[I],"00WW00W0PW"); 
 else if(I==2) strcpy(MAP[I],"00W000W00W"); 
 else if(I==3) strcpy(MAP[I],"00WB0B0B0W"); 
 else if(I==4) strcpy(MAP[I],"00W0BWW00W"); 
 else if(I==5) strcpy(MAP[I],"WWW0B0W0WW"); 
 else if(I==6) strcpy(MAP[I],"WDDDDD00W0"); 
 else if(I==7) strcpy(MAP[I],"WWWWWWWWW0"); 
 } break;  
 case 5: /*第五关地图*/ 
 for(I=0;I<MAXL;I++) 
 {    if(I==0) strcpy(MAP[I],"00WWWW00"); 
 else if(I==1) strcpy(MAP[I],"00WDDW00"); 
 else if(I==2) strcpy(MAP[I],"0WW0DWW0"); 
 else if(I==3) strcpy(MAP[I],"0W00BDW0"); 
 else if(I==4) strcpy(MAP[I],"WW0B00WW"); 
 else if(I==5) strcpy(MAP[I],"W00WBB0W"); 
 else if(I==6) strcpy(MAP[I],"W00P000W"); 
 else if(I==7) strcpy(MAP[I],"WWWWWWWW"); 
 } break; 
 case 6: /*第六关地图*/ 
 for(I=0;I<MAXL;I++) 
 { if(I==0) strcpy(MAP[I],"0000WWWWW0000000000"); 
 else if(I==1) strcpy(MAP[I],"0000W000W0000000000"); 
 else if(I==2) strcpy(MAP[I],"0000WB00W0000000000"); 
 else if(I==3) strcpy(MAP[I],"00WWW00BWW000000000"); 
 else if(I==4) strcpy(MAP[I],"00W00B0B0W000000000"); 
 else if(I==5) strcpy(MAP[I],"WWW0W0WW0W000WWWWWW"); 
 else if(I==6) strcpy(MAP[I],"W000W0WW0WWWWW00DDW"); 
 else if(I==7) strcpy(MAP[I],"W0B00B0000000000DDW"); 
 else if(I==8) strcpy(MAP[I],"WWWWW0WWW0WPWW00DDW"); 
 else if(I==9) strcpy(MAP[I],"0000W00000WWWWWWWWW"); 
 else if(I==10)strcpy(MAP[I],"0000WWWWWWW00000000"); 
 } break;  
 case 7: /*第七关地图*/ 
 for(I=0;I<MAXL;I++) 
 { if(I==0) strcpy(MAP[I],"WWWWWWWWWWWW00"); 
 else if(I==1) strcpy(MAP[I],"WDD00W00000WWW"); 
 else if(I==2) strcpy(MAP[I],"WDD00W0B00B00W"); 
 else if(I==3) strcpy(MAP[I],"WDD00WBWWWW00W"); 
 else if(I==4) strcpy(MAP[I],"WDD0000P0WW00W"); 
 else if(I==5) strcpy(MAP[I],"WDD00W0W00B0WW"); 
 else if(I==6) strcpy(MAP[I],"WWWWWW0WWB0B0W"); 
 else if(I==7) strcpy(MAP[I],"00W0B00B0B0B0W"); 
 else if(I==8) strcpy(MAP[I],"00W0000W00000W"); 
 else if(I==9) strcpy(MAP[I],"00WWWWWWWWWWWW"); 
 } break;  
 case 8: /*第八关地图*/ 
 for(I=0;I<MAXL;I++) 
 { if(I==0) strcpy(MAP[I],"00WWWWWW"); 
 else if(I==1) strcpy(MAP[I],"00W0000W"); 
 else if(I==2) strcpy(MAP[I],"WWWBBB0W"); 
 else if(I==3) strcpy(MAP[I],"WP0BDD0W"); 
 else if(I==4) strcpy(MAP[I],"W0BDDDWW"); 
 else if(I==5) strcpy(MAP[I],"WWWW00W0"); 
 else if(I==6) strcpy(MAP[I],"000WWWW0"); 
 } break;  
 case 9: /*第九关地图*/ 
 for(I=0;I<MAXL;I++) 
 { if(I==0) strcpy(MAP[I],"WWWWWWW"); 
 else if(I==1) strcpy(MAP[I],"WDDBDDW"); 
 else if(I==2) strcpy(MAP[I],"WDDWDDW"); 
 else if(I==3) strcpy(MAP[I],"W0BBB0W"); 
 else if(I==4) strcpy(MAP[I],"W00B00W"); 
 else if(I==5) strcpy(MAP[I],"W0BBB0W"); 
 else if(I==6) strcpy(MAP[I],"W00WP0W"); 
 else if(I==7) strcpy(MAP[I],"WWWWWWW"); 
 } break;  
 case 10: /*第十关地图*/ 
 for(I=0;I<MAXL;I++) 
 { if(I==0) strcpy(MAP[I],"000WWWWW000"); 
 else if(I==1) strcpy(MAP[I],"0WWW000WWW0"); 
 else if(I==2) strcpy(MAP[I],"WW00PB0B0W0"); 
 else if(I==3) strcpy(MAP[I],"W00WW0WW0WW"); 
 else if(I==4) strcpy(MAP[I],"W0BDWDB000W"); 
 else if(I==5) strcpy(MAP[I],"W0WDWFW000W"); 
 else if(I==6) strcpy(MAP[I],"W0BDDD00WWW"); 
 else if(I==7) strcpy(MAP[I],"WWWBW0WWW00"); 
 else if(I==8) strcpy(MAP[I],"00W000W0000"); 
 else if(I==9) strcpy(MAP[I],"00WWWWW0000"); 
 } break;  
 }  

 wmove(win,SY-2,SX);
 wprintw(win,"LEVEL %d \n",n); 
 for(I=0;I<MAXL;I++) /*备份原始地图的部分数据,以备移动时恢复图标使用*/ 
 for(J=0;J<MAXC;J++) /*只用备份空白处,目的地和被箱子或推箱者占用的空白处与目的地*/ 
 if(MAP[I][J]=='0'||MAP[I][J]=='D'||MAP[I][J]=='W') ORI[I][J]=MAP[I][J]; 
 else if((MAP[I][J]=='F')||(MAP[I][J]=='T')) ORI[I][J]='D'; 
 else ORI[I][J]='0'; 
 DrawMap();  
}  
  
void DrawMap() /*画出第LEVEL关的初始化地图*/  
{ int I,J,temp; 
 char ch; 
 TOTAL=0; /*初始化统计当前所选关的箱子总数*/ 
 wmove(win,SY,SX);  temp=SY+1;
 for(I=0;I<MAXL;I++) 
 { 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -