📄 hrd-1.0.c
字号:
/************************************************** * 软件名称: 华容道 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 + -