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

📄 hrd-1.0.c

📁 可以在Linux文本界面下运行的华容道游戏(C+ ncurses库)。
💻 C
📖 第 1 页 / 共 2 页
字号:
/************************************************** * 软件名称: 华容道 V1.0                          * * 软件功能: 游戏                                 * * 运行平台: 中文控制台/终端                      * * 软件作者: lanche < lanche@163.com >            * * 软件主页: http://linside.8u8.com               * * 软件版权: 免费软件,附源代码                    * * 发布日期: 2002年9月4日                         * **************************************************/#include <stdio.h>#include <stdlib.h>#include <termios.h>#include <sys/ioctl.h>#include <ncurses.h>#define X      4        /* 坐标修正 */#define Y      20#define BLANK  0        /* 空位 */#define CCAO   1        /* 曹操 */#define ZFEI   2        /* 张飞 */#define HZONG  3        /* 黄忠 */#define MCAO   4        /* 马超 */#define GYU    5        /* 关羽 */#define ZYUN   6        /* 赵云 横 */#define ZYUN2  7        /* 赵云 竖 */#define BING1  8        /* 兵壹 */#define BING2  9        /* 兵贰 */#define BING3  10       /* 兵叁 */#define BING4  11       /* 兵肆 */#define GROUND 20       /* 场景 */#define CURSOR 30       /* 游标 */#define LEFT   1            /* 移动方向 */#define RIGHT  2#define UP     3#define DOWN   4#define K_ESC     -1#define K_UP      -8#define K_DOWN    -9#define K_LEFT    -10#define K_RIGHT   -11#define K_ENTER   -12#define K_SPACE   -13#define K_F1      -21#define K_F2      -22#define K_F3      -23#define K_F4      -24#define K_F5      -25#define K_UNUSE   -111#define COLOR_INIT 0char flags[5][4];           /* 标志数组 */char pos[11][2];            /* 坐标数组 */char DemoMode=0;            /* 默认为关闭演示模式 *//*------------------*/int vga_getkey(void)        /* This function come from source code of */{                           /* svgalib-1.4.3 and nothing modified     */    struct termio zap, original;    int e;    char c;    ioctl(fileno(stdin), TCGETA, &original);    /* Get termio */    zap = original;    zap.c_cc[VMIN] = 0;                         /* Modify termio  */    zap.c_cc[VTIME] = 0;    zap.c_lflag = 0;    ioctl(fileno(stdin), TCSETA, &zap);         /* Set new termio */    e = read(fileno(stdin), &c, 1);             /* Read one char */    ioctl(fileno(stdin), TCSETA, &original);    /* Restore termio */    if (e != 1)        return 0;                               /* No key pressed. */    return c;                                   /* Return key. */}/*------------------*/int new_getkey(void){  int key;  for(;;){    key=vga_getkey();    if(key!=0)break;         /* If no key pressed then continue. */  }  if(key != 0x1b) {  /* not ESC */    switch (key) {      case 10:        return K_ENTER;      /* ENTER */      case 32:        return K_SPACE;      /* Space */      default:        return key;    }  }  if((key = vga_getkey()) != '[') {    return K_ESC;            /* it was ESC */  }  switch (key = vga_getkey()) {    case 'A':      return K_UP;           /* up */    case 'B':      return K_DOWN;         /* down */    case 'C':      return K_RIGHT;        /* right */    case 'D':      return K_LEFT;         /* left */    case '[':      switch (key = vga_getkey()) {        case 'A':          return K_F1;        case 'B':          return K_F2;        case 'C':          return K_F3;        case 'D':          return K_F4;        case 'E':          return K_F5;        default:          return -111;      }    default:      return -111;         /* ignore */  }}/*------------------*/void putman(int x,int y,int who){  y*=6;x*=3;  switch (who) {  case 1:    /* 曹操 */    mvaddstr(X+x, Y+y, "┏━━━━┓");    mvaddstr(X+x+1,Y+y,"┃   曹   ┃");    mvaddstr(X+x+2,Y+y,"┃        ┃");    mvaddstr(X+x+3,Y+y,"┃        ┃");    mvaddstr(X+x+4,Y+y,"┃   操   ┃");    mvaddstr(X+x+5,Y+y,"┗━━━━┛");    break;  case 2:    /* 张飞 */    mvaddstr(X+x, Y+y, "┏━┓");    mvaddstr(X+x+1,Y+y,"┃张┃");    mvaddstr(X+x+2,Y+y,"┃  ┃");    mvaddstr(X+x+3,Y+y,"┃  ┃");    mvaddstr(X+x+4,Y+y,"┃飞┃");    mvaddstr(X+x+5,Y+y,"┗━┛");    break;  case 3:    /* 黄忠 */    mvaddstr(X+x, Y+y, "┏━┓");    mvaddstr(X+x+1,Y+y,"┃黄┃");    mvaddstr(X+x+2,Y+y,"┃  ┃");    mvaddstr(X+x+3,Y+y,"┃  ┃");    mvaddstr(X+x+4,Y+y,"┃忠┃");    mvaddstr(X+x+5,Y+y,"┗━┛");    break;  case 4:    /* 马超 */    mvaddstr(X+x, Y+y, "┏━┓");    mvaddstr(X+x+1,Y+y,"┃马┃");    mvaddstr(X+x+2,Y+y,"┃  ┃");    mvaddstr(X+x+3,Y+y,"┃  ┃");    mvaddstr(X+x+4,Y+y,"┃超┃");    mvaddstr(X+x+5,Y+y,"┗━┛");    break;  case 5:    /* 关羽 */    mvaddstr(X+x, Y+y, "┏━━━━┓");    mvaddstr(X+x+1,Y+y,"┃ 关  羽 ┃");    mvaddstr(X+x+2,Y+y,"┗━━━━┛");    break;  case 6:    /* 赵云 横 */    mvaddstr(X+x, Y+y, "┏━━━━┓");    mvaddstr(X+x+1,Y+y,"┃ 赵  云 ┃");    mvaddstr(X+x+2,Y+y,"┗━━━━┛");    break;  case 7:    /* 赵云 竖 */    mvaddstr(X+x, Y+y, "┏━┓");    mvaddstr(X+x+1,Y+y,"┃赵┃");    mvaddstr(X+x+2,Y+y,"┃  ┃");    mvaddstr(X+x+3,Y+y,"┃  ┃");    mvaddstr(X+x+4,Y+y,"┃云┃");    mvaddstr(X+x+5,Y+y,"┗━┛");    break;  case 8:    /* 兵仔 */  case 9:  case 10:  case 11:    mvaddstr(X+x, Y+y, "┏━┓");    mvaddstr(X+x+1,Y+y,"┃兵┃");    mvaddstr(X+x+2,Y+y,"┗━┛");    break;  case 20:    /* 外框 */    mvaddstr(X+2,Y+4, "┏━━━━━━━━━━━━┓");    mvaddstr(X+3,Y+4, "┃                        ┃");    mvaddstr(X+4,Y+4, "┃                        ┃");    mvaddstr(X+5,Y+4, "┃                        ┃");    mvaddstr(X+6,Y+4, "┃                        ┃");    mvaddstr(X+7,Y+4, "┃                        ┃");    mvaddstr(X+8,Y+4, "┃                        ┃");    mvaddstr(X+9,Y+4, "┃                        ┃");    mvaddstr(X+10,Y+4,"┃                        ┃");    mvaddstr(X+11,Y+4,"┃                        ┃");    mvaddstr(X+12,Y+4,"┃                        ┃");    mvaddstr(X+13,Y+4,"┃                        ┃");    mvaddstr(X+14,Y+4,"┃                        ┃");    mvaddstr(X+15,Y+4,"┃                        ┃");    mvaddstr(X+16,Y+4,"┃                        ┃");    mvaddstr(X+17,Y+4,"┃                        ┃");    mvaddstr(X+18,Y+4,"┗━━━            ━━━┛");    break;  case 30:    /* 游标 */    mvaddstr(X+x, Y+y, "┏┅┓");    mvaddstr(X+x+1,Y+y,"┇ ┇");    mvaddstr(X+x+2,Y+y,"┗┅┛");    break;  default:    break;  }}/*------------------*/void clsman(int x,int y,int who){  y*=6;x*=3;  switch (who) {  case 1:    /* 曹操 */    mvaddstr(X+x, Y+y, "            ");    mvaddstr(X+x+1,Y+y,"            ");    mvaddstr(X+x+2,Y+y,"            ");    mvaddstr(X+x+3,Y+y,"            ");    mvaddstr(X+x+4,Y+y,"            ");    mvaddstr(X+x+5,Y+y,"            ");    break;  case 2:    /* 张飞 */  case 3:    /* 黄忠 */  case 4:    /* 马超 */  case 7:    /* 赵云 竖 */    mvaddstr(X+x, Y+y, "      ");    mvaddstr(X+x+1,Y+y,"      ");    mvaddstr(X+x+2,Y+y,"      ");    mvaddstr(X+x+3,Y+y,"      ");    mvaddstr(X+x+4,Y+y,"      ");    mvaddstr(X+x+5,Y+y,"      ");    break;  case 5:    /* 关羽 */    mvaddstr(X+x, Y+y, "            ");    mvaddstr(X+x+1,Y+y,"            ");    mvaddstr(X+x+2,Y+y,"            ");    break;  case 6:    /* 赵云 横 */    mvaddstr(X+x, Y+y, "            ");    mvaddstr(X+x+1,Y+y,"            ");    mvaddstr(X+x+2,Y+y,"            ");    break;  case 8:    /* 兵仔 */  case 9:  case 10:  case 11:  case 30:   /* 游标 */    mvaddstr(X+x, Y+y, "      ");    mvaddstr(X+x+1,Y+y,"      ");    mvaddstr(X+x+2,Y+y,"      ");    break;  default:    break;  }}/*------------------*/void now_is(int who)        /* 高亮显示所控棋子 */{  int x,y;  x=pos[who-1][1];  y=pos[who-1][0];  attron(A_BOLD);  putman(x,y,who);  refresh();}/*-----------------*/void now_is_not(int who)    /* 取消高亮显示 */{  int x,y;  x=pos[who-1][1];  y=pos[who-1][0];  attroff(A_BOLD);  putman(x,y,who);  refresh();}/*------------------*/void mycolor(int what){  chtype color;  if(!has_colors())return;  if(what==COLOR_INIT){    start_color();    init_pair(1, COLOR_YELLOW, COLOR_BLACK);    init_pair(2, COLOR_BLUE, COLOR_WHITE);    init_pair(3, COLOR_WHITE, COLOR_RED);  }  else if(what==1){                     /* 正常 */    color=COLOR_PAIR(1);    color|=A_BOLD;  }  else if(what==2){                     /* 背景 */    color=COLOR_PAIR(2);    color|=A_BOLD;  }  else if(what==3)color=COLOR_PAIR(3);  /* 棋子 */  attrset(color);}/*------------------*/void move_it(int who,int where){  int x,y;  int old_x,old_y;  x=pos[who-1][0];  y=pos[who-1][1];  old_x=x;  old_y=y;  mycolor(3);  attron(A_BOLD);  putman(y,x,who);  attroff(A_BOLD);  refresh();  if(DemoMode)usleep(300000);  mycolor(2);  attron(A_REVERSE);  clsman(y,x,who);  attroff(A_REVERSE);  /* 移动棋子后要非常烦锁地修改标志矩阵,我自己都很头痛 */  if(where==LEFT){    x--;    switch (who){      case CCAO:        flags[y-1][x-1]=who;flags[y-1+1][x-1]=who;        flags[old_y-1][old_x-1+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[y-1+1][x-1]=who;        flags[old_y-1][old_x-1]=0;flags[old_y-1+1][old_x-1]=0;        break;      case GYU:      case ZYUN:        flags[y-1][x-1]=who;        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==RIGHT){    x++;    switch (who){      case CCAO:        flags[y-1][x-1+1]=who;flags[y-1+1][x-1+1]=who;        flags[old_y-1][old_x-1]=0;flags[old_y-1+1][old_x-1]=0;        break;      case ZFEI:      case HZONG:      case MCAO:      case ZYUN2:        flags[y-1][x-1]=who;flags[y-1+1][x-1]=who;        flags[old_y-1][old_x-1]=0;flags[old_y-1+1][old_x-1]=0;        break;      case GYU:

⌨️ 快捷键说明

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