📄 tuixiangzi.c
字号:
/*---------------------------------------------------
推箱子游戏:此游戏的算法是十分简明的,将游戏变成一
串串的程序代码也不具有难度的.
基本思路是利用一个二维数组:数组值用于表示不同的
实物与场景.为了直观地处理数据,可以将二维数组设置
为一个字符数组.'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 + -