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

📄 hrd-1.0.c

📁 可以在Linux文本界面下运行的华容道游戏(C+ ncurses库)。
💻 C
📖 第 1 页 / 共 2 页
字号:
      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 + -