📄 hrd-1.0.c
字号:
case ZYUN: flags[y-1][x-1+1]=who; flags[old_y-1][old_x-1]=0; break; case BING1: case BING2: case BING3: case BING4: flags[y-1][x-1]=who; flags[old_y-1][old_x-1]=0; break; } } else if(where==UP){ y--; switch (who){ case CCAO: flags[y-1][x-1]=who;flags[y-1][x-1+1]=who; flags[old_y-1+1][old_x-1]=0;flags[old_y-1+1][old_x-1+1]=0; break; case ZFEI: case HZONG: case MCAO: case ZYUN2: flags[y-1][x-1]=who; flags[old_y-1+1][old_x-1]=0; break; case GYU: case ZYUN: flags[y-1][x-1]=who;flags[y-1][x-1+1]=who; flags[old_y-1][old_x-1]=0;flags[old_y-1][old_x-1+1]=0; break; case BING1: case BING2: case BING3: case BING4: flags[y-1][x-1]=who; flags[old_y-1][old_x-1]=0; break; } } else if(where==DOWN){ y++; switch (who){ case CCAO: flags[y-1+1][x-1]=who;flags[y-1+1][x-1+1]=who; flags[old_y-1][old_x-1]=0;flags[old_y-1][old_x-1+1]=0; break; case ZFEI: case HZONG: case MCAO: case ZYUN2: flags[y-1+1][x-1]=who; flags[old_y-1][old_x-1]=0; break; case GYU: case ZYUN: flags[y-1][x-1]=who;flags[y-1][x-1+1]=who; flags[old_y-1][old_x-1]=0;flags[old_y-1][old_x-1+1]=0; break; case BING1: case BING2: case BING3: case BING4: flags[y-1][x-1]=who; flags[old_y-1][old_x-1]=0; break; } } pos[who-1][0]=x; /* 更新坐标 */ pos[who-1][1]=y; mycolor(3); attron(A_BOLD); putman(y,x,who); attroff(A_BOLD); refresh(); if(DemoMode)usleep(300000); putman(y,x,who);}/*------------------*/void stages(int stage){ int i,j; /* flag为标志数组,pos为十二颗棋子的坐标,为0的是本关未用的棋子 */ char flag1[5][4]={2,1,1,7, 2,1,1,7, 3,5,5,4, 3,8,9,4, 10,0,0,11}; char pos1[11][2]={2,1,1,1,1,3,4,3,2,3,0,0,4,1,2,4,3,4,1,5,4,5}; char flag2[5][4]={2,1,1,8, 2,1,1,9, 6,6,10,11, 3,5,5,4, 5,0,0,4}; char pos2[11][2]={2,1,1,1,1,4,4,4,2,4,1,3,0,0,4,1,4,2,3,3,4,3}; /* 装入本关数据 */ if(stage==1){ for(i=0;i<5;i++)for(j=0;j<4;j++)flags[i][j]=flag1[i][j]; for(i=0;i<11;i++)for(j=0;j<2;j++)pos[i][j]=pos1[i][j]; } else if(stage==2){ for(i=0;i<5;i++)for(j=0;j<4;j++)flags[i][j]=flag2[i][j]; for(i=0;i<11;i++)for(j=0;j<2;j++)pos[i][j]=pos2[i][j]; }}/*------------------*/void demo(int stage) /* 演示,stage为第几关 */{ int i,j; char ch; int steps; /* 演示数据,每行含十四步,第一关157步(含小步),真正103步 */ char data1[]={ 10,2,3,4,5,1,11,1,4,4,9,3,9,2,11,3,11,3,4,1,9,4,9,4,11,2,11,4, 5,2,5,2,8,3,8,1,10,3,10,3,4,1,11,1,11,4,5,4,10,2,10,2,8,2,8,2, 4,3,3,3,11,1,11,1,9,1,9,1,5,4,10,4,10,1,7,4,7,4,1,2,2,2,3,3, 3,3,11,3,11,3,9,1,9,3,5,1,5,1,10,4,10,2,8,4,8,4,4,2,9,2,9,3, 5,3,8,1,8,1,10,1,10,1,4,4,7,4,9,2,9,2,11,2,11,2,5,3,10,3,10,1, 4,1,7,1,9,4,9,4,11,2,11,4,5,2,5,2,10,3,10,2,3,4,3,4,2,1,10,3, 10,3,4,3,4,3,8,2,3,4,2,4,10,1,4,3,8,3,8,3,3,2,2,4,2,4,8,1, 4,4,10,2,8,3,8,3,2,3,2,3,3,1,7,1,11,1,11,4,5,4,1,4,10,2,10,2, 8,2,8,2,4,3,2,3,7,3,3,3,11,1,11,1,9,1,9,1,5,4,1,4,8,4,8,2, 4,2,7,3,7,3,1,1,8,4,8,4,10,4,10,4,4,2,7,2,2,2,3,3,3,3,1,1, 8,1,8,3,5,3,9,2,9,2,11,2,11,2,1,4,8,1,8,1,10,1,10,1,5,3,11,3, 11,2,1,2,1,4 }; /* 第二关80步(含小步),真正63步 */ char data2[]={ 5,4,10,4,10,1,11,1,11,4,6,2,6,2,3,3,5,1,11,4,10,2,3,2,2,4,2,4, 1,1,9,1,9,3,6,3,4,3,10,3,11,3,5,2,5,2,3,4,2,4,1,4,9,1,9,1, 8,1,8,1,6,3,4,3,11,2,10,4,1,2,2,3,2,3,3,1,5,1,11,4,10,2,1,4, 8,4,8,2,9,2,9,4,2,3,3,3,5,1,11,1,10,4,6,1,4,3,1,2,3,2,2,4, 2,4,6,1,8,3,9,2,3,3,2,3,5,3,11,1,11,1,10,1,10,1,1,4,4,4,9,4, 8,4,6,2,6,2,3,3,2,3,5,3,10,3,10,1,1,1,1,4 }; attroff(A_BOLD); clear(); refresh(); mycolor(1); if(stage==1){ mvaddstr(X-2,Y+4, " 华容道 第一关 "); mvaddstr(X+0,Y+4, " 横刀立马 "); } /* 暂时只有两关 */ else if(stage==2){ mvaddstr(X-2,Y+4, " 华容道 第二关 "); mvaddstr(X+0,Y+4, " 插翅难飞 "); } /* 装入本关数据 */ refresh(); stages(stage); /* 布阵 */ mycolor(2); attron(A_REVERSE); putman(1,1,GROUND); attroff(A_REVERSE); mycolor(3); for(i=0;i<11;i++){ if(pos[i][0]==0)continue; putman(pos[i][1],pos[i][0],i+1); } mycolor(1); mvaddstr(X+22,Y+2, " 按空格键开始演示 "); refresh(); for(;;)if((ch=getch())==' ')break; mvaddstr(X+22,Y+2, " "); attron(A_BOLD); mvaddstr(X+22,Y+16,"Demo "); attroff(A_BOLD); refresh(); /* Start Demo */ sleep(2); DemoMode=1; if(stage==1){ steps=157; for(i=0;i<steps;i++)move_it(data1[i*2],data1[i*2+1]); } if(stage==2){ steps=80; for(i=0;i<steps;i++)move_it(data2[i*2],data2[i*2+1]); } mycolor(1); attron(A_BOLD); mvaddstr(X+22,Y+16,"Done "); attroff(A_BOLD); refresh(); sleep(2); DemoMode=0; /* End Demo */}/*------------------*/void view(int stage) /* 临时函数,用于显示某关场景 */{ int i; mycolor(1); if(stage==1){ mvaddstr(X-2,Y+4, " 华容道 第一关 "); mvaddstr(X+0,Y+4, " 横刀立马 "); } else if(stage==2){ mvaddstr(X-2,Y+4, " 华容道 第二关 "); mvaddstr(X+0,Y+4, " 插翅难飞 "); } mycolor(2); attron(A_REVERSE); putman(1,1,GROUND); attroff(A_REVERSE); stages(stage); mycolor(3); for(i=0;i<11;i++){ if(pos[i][0]==0)continue; putman(pos[i][1],pos[i][0],i+1); } refresh();}/*------------------*/int move_able(int who,int where){ int x,y; int new_x,new_y; x=pos[who-1][0]; y=pos[who-1][1]; switch (where){ case LEFT: if(x==1)return(0); new_x=x-1;new_y=y; if(flags[new_y-1][new_x-1]!=0)return(0); if(who==ZFEI||who==HZONG||who==MCAO||who==ZYUN2||who==CCAO)new_y++; if(flags[new_y-1][new_x-1]!=0)return(0); break; case RIGHT: if(x==4)return(0); new_x=x+1;new_y=y; if(who==GYU||who==ZYUN||who==CCAO){ new_x++;if(new_x>4)return(0); } if(flags[new_y-1][new_x-1]!=0)return(0); if(who==ZFEI||who==HZONG||who==MCAO||who==ZYUN2||who==CCAO)new_y++; if(flags[new_y-1][new_x-1]!=0)return(0); break; case UP: if(y==1)return(0); new_x=x;new_y=y-1; if(flags[new_y-1][new_x-1]!=0)return(0); if(who==GYU||who==ZYUN||who==CCAO)new_x++; if(flags[new_y-1][new_x-1]!=0)return(0); break; case DOWN: if(y==5)return(0); new_x=x;new_y=y+1; if(who==ZFEI||who==HZONG||who==MCAO||who==ZYUN2||who==CCAO){ new_y++;if(new_y>5)return(0); } if(flags[new_y-1][new_x-1]!=0)return(0); if(who==GYU||who==ZYUN||who==CCAO)new_x++; if(flags[new_y-1][new_x-1]!=0)return(0); break; } return 1;}/*------------------*/void play(int stage) /* 游戏核心 */{ int i,j; chtype color; static int x,y,man; int go; char key; clear(); view(stage); man=CCAO; x=pos[man-1][0]; y=pos[man-1][1]; mycolor(3); now_is(man); for(;;){ /*key=getch();*/ key=new_getkey(); if(key==K_ESC){endwin();exit(0);} if(key==K_F5){attroff(A_BOLD);return;} if(key==K_F1){DemoMode=1;return;} if(key=='a'||key=='d'||key=='w'||key=='s'){ /* 移动游标 */ if(man==0){ mycolor(2); attron(A_REVERSE); clsman(y,x,CURSOR); attroff(A_REVERSE); } switch (key){ case 'a': x--;if(x<1)x=4; break; case 'd': if(man==CCAO||man==GYU||man==ZYUN)x++; /* "胖子"的处理,:) */ x++;if(x>4)x=1; break; case 'w': y--;if(y<1)y=5; break; case 's': /* "高个子"的处理 */ if(man==CCAO||man==ZFEI||man==HZONG||man==MCAO||man==ZYUN2)y++; y++;if(y>5)y=1; break; } if(flags[y-1][x-1]==0){ /* 遇到空位时的处理 */ if(man!=0)now_is_not(man); mycolor(2); attron(A_REVERSE); putman(y,x,CURSOR); attroff(A_REVERSE); refresh(); man=0; } else { if(man!=0){mycolor(3);now_is_not(man);} man=flags[y-1][x-1]; x=pos[man-1][0]; /* 调整游标位置 */ y=pos[man-1][1]; mycolor(3); now_is(man); refresh(); } } if(key==K_LEFT||key==K_RIGHT||key==K_UP||key==K_DOWN){ /* 移动棋子 */ if(man==BLANK)continue; /* 空位不作处理 */ go=0; if(key==K_LEFT)go=LEFT; else if(key==K_RIGHT)go=RIGHT; else if(key==K_UP)go=UP; else if(key==K_DOWN)go=DOWN; if(!move_able(man,go))continue; /* 不能移动的话不作处理 */ move_it(man,go); /* 移动棋子并调整游标位置 */ x=pos[man-1][0]; y=pos[man-1][1]; mycolor(3); now_is(man); refresh(); } if(man==CCAO && x==2 && y==4)break; } usleep(300000); move_it(CCAO,DOWN);}/*------------------*/main(){ int i,j; char ch; chtype color; initscr(); noecho(); cbreak(); nonl(); mycolor(COLOR_INIT); for(;;){ play(1); /* 第一关 */ if(DemoMode){demo(1);continue;} break; } mycolor(1); mvaddstr(X+22,Y+2, "恭喜您过关! 请按空格键进入下一关 "); for(;;)if((ch=getch())==' ')break; for(;;){ play(2); /* 第二关 */ if(DemoMode){demo(2);continue;} break; } endwin();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -