Tag Archives:DOS
DOS 经典软件下载
二十多年前的某一天,我盯着资源管理器里很久没用却一直舍不得删除的 UCDOS 文件夹犹豫了半天,最终却为了给硬盘腾点空间一狠心 shift+delete 把他们彻底删除了,当时我没意识到,一个时代就这样彻底的离我远去;二十多年后的今天,我又在最新版的 DOSBOX 里把这些当年的工具一个个重新装了回去,软件没变,但是消逝的青春却再也回不来了。
做了一个《上古软件仓》,包含上古时代的编程工具,汉字系统和设计软件等,都是一些我以前经常用的软件,主打怀旧和娱乐。
截图:中文系统

(点击 more/continue 继续)

MINI-FOOLTRIS 游戏代码
不到两百行的俄罗斯方块游戏,教学用:
/*=====================================================================// FOOLTRS.C: Fool tetris game v1.0 by skywind// 最简俄罗斯,游戏设计入门傻瓜版,林伟 1999年8月11日//// 游戏并无任何扩展,仅以最简单的方式向人说明俄罗斯方块的基本功能实现// 程序运行于MS-DOS,虽然现在写游戏的平台早已变化了许多,// 但是我尽量容入了一些不变理论,希望才入门的游戏设计者能得到一些帮助// 用方向键/空格游戏,代码不超过两百行,初学C者皆能读懂,请用TC20编译////=====================================================================*/#include <stdio.h>#include <stdlib.h>#include <time.h>#include <conio.h>#include <string.h>#include <dos.h>/*---------------------------------------------------------------------// 基本定义:地图和砖块//---------------------------------------------------------------------*/int map[26][10]; /* 游戏地图定义: 所有砖块将被描述在地图中 ............*/typedef struct { int d[4][4]; } Block; /* 砖块结构定义 ...............*/int BlockList[7][4][4] = { /* 七种传统的方块定义 .................*/ { { 0, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 1, 0, 0 }, { 0, 1, 1, 0 } }, { { 0, 0, 0, 0 }, { 0, 0, 2, 0 }, { 0, 0, 2, 0 }, { 0, 2, 2, 0 } }, { { 0, 3, 0, 0 }, { 0, 3, 0, 0 }, { 0, 3, 0, 0 }, { 0, 3, 0, 0 } }, { { 0, 4, 0, 0 }, { 0, 4, 4, 0 }, { 0, 0, 4, 0 }, { 0, 0, 0, 0 } }, { { 0, 0, 5, 0 }, { 0, 5, 5, 0 }, { 0, 5, 0, 0 }, { 0, 0, 0, 0 } }, { { 0, 6, 6, 6 }, { 0, 0, 6, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }, { { 0, 0, 0, 0 }, { 0, 7, 7, 0 }, { 0, 7, 7, 0 }, { 0, 0, 0, 0 } }};unsigned char cmap[]={0,0x72,0x30,0x47,0x57,0x27,0x60,0x74}; /* 颜色表 */long GameMode = 0, GameSpeed = -1, GameScore = 0; /* 全局定义:各状态 .*//*---------------------------------------------------------------------// 视频相关数据定义//---------------------------------------------------------------------*/char far* TextBuf = (char far*)0xb8000000l; /* 文本状态的显存地址 .....*/char TextBck[20][10]; /* 文本状态的二级缓存 .....*/#define SCREEN(x,y) (TextBuf[((y) * 160) + ((x) * 2)]) /* 显存中字符 */#define SCOLOR(x,y) (TextBuf[((y) * 160) + ((x) * 2) + 1]) /* 屏幕颜色 *//*---------------------------------------------------------------------// 基本砖块操作函数//---------------------------------------------------------------------*/void Rotate(const Block* src, Block* dest) /* 旋转砖块src到dest ......*/{ int i, j; for (j = 0; j < 4; j++) for (i = 0; i < 4; i++) dest->d[i][j] = src->d[j][3 - i];}int MapCheck(int x, int y) /* 检测地图中某坐标是否有砖块 ..............*/{ if (x < 0 || x >=10 || y < 0 || y >= 26) return -1; return map[y][x];}int BlockCheck(int x, int y, const Block* src) /* 检测砖块位置合法性 ..*/{ int i, j; for (j = 0; j < 4; j++) for (i = 0; i < 4; i++) if (MapCheck(x + j, y - i) && src->d[i][j]) return 0; return 1;}void CreateBlock(Block* src) /* 随机创建一个砖块,然后保存到src .......*/{ int i,j,k = rand() % 7; Block t; for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) src->d[i][j] = BlockList[k][i][j]; for (i = rand() % 4; i > 0; i--, *src = t) Rotate(src, &t);}long TimePass = 0, TimeExit = -1, GameTime = -1, w;void GameMain(void);/*---------------------------------------------------------------------// 程序入口函数//---------------------------------------------------------------------*/void main(void){ clrscr(); /* 初始化:清屏 ...........*/ randomize(); /* 初始化:随机数种子 .....*/ for (w = 0; w < 26; w++) memset(map[w], 0, sizeof(int) * 10); for (w = 0; w < 22; w++) /* 初始化:绘制边框 .......*/ SCREEN(w,0)=254, SCOLOR(w,0)=8, SCREEN(w,21)=254, SCOLOR(w,21)=8, SCREEN(0,w)=254, SCOLOR(0,w)=8, SCREEN(21,w)=254, SCOLOR(21,w)=8; GameSpeed = 2; /* 初始化:设置速度 .......*/ GameMain(); /* 进入游戏主程序 .........*/}int readkey(void) /* 无等待的接收一个键盘消息 ...............*/{ if (!kbhit()) return 0; /* 如果当前没有按键消息则直接返回 .........*/ if ((w = getch()) == 0) return getch(); /* 返回非控制键 .........*/ return (int)w;}int SpeedX[10] = { 17, 15, 13, 11, 9, 7, 5, 4, 3, 2 }; /* 速度级别 ....*/int x = 3, y = 20, v = 0, level; /* 全局定义:砖块的坐标,速度 .....*/Block A, B, C; /* 全局定义:A, B, C三个活动砖块 ..*/void GameDriver(void);void GameView(void);/*---------------------------------------------------------------------// 游戏逻辑核心(重要): 每秒循环18.2次,处理砖块移动/下落/消除等逻辑//---------------------------------------------------------------------*/void GameMain(void){ long key, i, j, m, n, old_time = 0; /* 定义各变量 .........*/ CreateBlock(&A); CreateBlock(&C); /* 初始化砖块 .........*/ for (GameMode = 0, v = SpeedX[GameSpeed]; GameMode == 0; TimePass++) { while (clock() == old_time); /* 速度控制,clock()为 18.2Hz ..*/ old_time = clock(); nosound(); key = readkey(); /* 读入一个键盘消息 ............*/ if (key == 75) if (BlockCheck(x - 1, y, &A)) x--; /* 左移 ...*/ if (key == 77) if (BlockCheck(x + 1, y, &A)) x++; /* 右移 ...*/ if (key == 80) v = 0; /* 下落: SET v = 0 ....*/ if (key == ' ') { /* 直接下落 ...........*/ for (i = y; i >= 0; i--) if (!BlockCheck(x, i - 1, &A)) break; y = i; v = 0; } if (key == 27) GameMode = 1; /* ESC: 退出游戏 ......*/ if (key == 72) { /* UP: 转动砖块 .......*/ Rotate(&A, &B); if (BlockCheck(x, y, &B)) A = B; } if (--v <= 0) { /* 到达了下落的时间 .......*/ v = SpeedX[GameSpeed]; /* 重置砖块速度 ...........*/ if (BlockCheck(x, y - 1, &A) == 0) {/* 如果到达map底部 ....*/ for (i=0, m=y; i<4; i++,m--) for (j=0,n=x; j<4; j++,n++) if (MapCheck(n,m)==0 && A.d[i][j]) /* 将A复制到map */ map[m][n] = A.d[i][j]; A = C; /* 将C复制到A .........*/ CreateBlock(&C); /* 创建新的C砖块 ......*/ if (y >= 20) GameMode = -1; /* 判断死亡 ...........*/ else y = 20, x = 3; GameDriver(); /* 消除完成的行 .......*/ } else y--; /* 否则:下降 .........*/ } GameView(); /* 显示: 更新屏幕 .....*/ } while (kbhit()) getch(); /* 按任意键结束 .......*/ while (!kbhit()); nosound(); /* 关闭扬声器 .........*/}void GameDriver(void) /* 处理消除行 ..............................*/{ int inc[5]={10,100,300,600,1000}, count = 0, x, y, k, i, j; for (y = 0; y < 25; y++) for (; ; count++) { /* 扫描map测试消行 ...*/ for (x = 0, k = 0; x < 10; x++) k += (map[y][x])? 1 : 0; if (k < 10) break; /* 计算一行是否可以消去 .......*/ for (j = y; j < 25; j++) memcpy(map[j], map[j+1], 10 * sizeof(int)); } if ((GameScore / 10000) != ((GameScore + inc[count]) / 10000)) GameSpeed = (GameSpeed + 1) % 10; /* 计算速度升级 ...........*/ GameScore += inc[count]; /* 计算新的分数 ...........*/ sound((count == 0)? 75 : 900);}void GameView(void) /* 绘制:将map里面的砖块绘制到屏幕 .........*/{ int i, j, m, n; for (i=0; i<10; i++) for (j=0; j<20; j++) /* 更新TextBck二级缓存 ..*/ TextBck[j][i] = map[j][i]; for (i=0, n=x; i<4; i++, n++) for (j = 0, m=y; j < 4; j++, m--) if (m>=0&&m<20 && n>=0&&n<10 && A.d[j][i]) TextBck[m][n] = A.d[j][i]; for (i = 0; i < 10; i++) for (j = 0; j < 20; j++) { /* 显示地图 ...*/ m = TextBck[19 - j][i], n = i * 2; SCREEN(n+1,j+1) = (m)? '[':'.', SCOLOR(n+1,j+1) = (m)? cmap[m] : 8; SCREEN(n+2,j+1) = (m)? ']':'.', SCOLOR(n+2,j+1) = (m)? cmap[m] : 8; } for (j = 0; j < 4; j++) for (i = 0; i < 4; i++) { /* 显示下个砖块*/ m = C.d[j][i], n = 160 * (j + 8) + 4 * i + 58; TextBuf[n+0] = (m)? '[':'.', TextBuf[n+1] = (m)? cmap[m] : 8; TextBuf[n+2] = (m)? ']':'.', TextBuf[n+3] = (m)? cmap[m] : 8; } if (TimePass & 3) return; textcolor(0xa-8); gotoxy(30,1); printf("POSITION: [%2d,%2d]", x, y); /* 显示分数等 .*/ gotoxy(30,2); printf("SPEED: %d", GameSpeed); gotoxy(30,6); printf("SCORE: "); cprintf("%ld", GameScore); gotoxy(30,5); printf("TIME: "); /* 显示时间 ...*/ m = (int)(TimePass / 18.2) / 60, n = (int)(TimePass / 18.2) % 60; cprintf("%d%d:%d%d", (m/10), (m%10), (n/10), (n%10)); gotoxy(1, 23);}
MINI-FOOLFLY 游戏代码
此程序仅向人说明编写游戏程序的若干功能实现和常用处理方法,编译版本下载:
http://www.skywind.me/resource/oldworks/foolfly.zip
/* Fool fly game v1.0 by skywind * 空战摸拟源程序,林伟 1999年7月30日 * * 这是一个空战程序的模式例子,并没有做任何优化与扩充 * 仅仅向人说明编写游戏程序的若干功能实现或常用处理方法 * 程序是DOS版的,现在写游戏的平台早已变化了许多,但是 * 我尽量容入了一些不变理论,希望才入门的游戏设计者能受 * 到一些启发,通过它也可以看出当日DOS下设计的困难重重。 * * 整个程序不足300行,请用BC31或者TC20的Large模式编译 */#include <stdio.h>#include <dos.h>#include <stdlib.h>#include <conio.h>#include <mem.h>#include <time.h>#include <math.h>#include <alloc.h>#define MAX_STAR 80 /* 最多星星数目 */#define MAX_OBJ 30 /* 最多物体(子弹和敌人) */#define MAXY 169 /* y坐标的最大值 */typedef unsigned long ulong;char far *VideoBuf=(char far*)0xa0000000L, *MemBuf; /* MemBuf 图形二级缓存 */char keys[128]; /* keys[0..100] 键盘上各键的状态 */const KEY_UP=72,KEY_DOWN=80,KEY_LEFT=75,KEY_RIGHT=77,KEY_ESC=1,KEY_CTRL=29; /* 键盘扫描码 */void interrupt far (*OldInt9)(void); /* 老的键盘中断程序地址 */void interrupt NewInt9(void); /* 新的键盘中断服务程序 */char GameStart(void);struct TStars { int x,y,v; } Stars[MAX_STAR]; /* 星星的描述 */struct TObj { int mode,type,index,next,x,y; } Objs[MAX_OBJ]; /* 子弹和敌人的描述 */long GameScore=0; /* 游戏分数 */unsigned char fly_pic[260]={ /* 飞机的图形,我是用程序将PCX图形转换过来的 */16,0,16,0,0,0,0,29,25,0,0,0,0,25,29,196,0,0,0,0,0,0,0,25,25,0,0,0,0,25,0,196,0,0,0,0,112,112,0,25,196,40,40,29,112,112,40,112,0,112,112,112,40,40,112,112,40,40,25,25,112,40,40,112,112,112,112,112,112,40,112,25,40,40,112,112,112,40,40,25,40,112,112,0,0,112,112,25,40,40,40,112,40,40,40,25,40,112,0,0,0,0,112,25,40,112,40,112,112,112,40,25,112,0,0,0,0,0,0,29,112,0,40,0,112,0,112,29,0,0,0,0,0,0,0,29,112,0,40,54,112,0,112,29,0,0,0,0,0,0,0,29,0,0,40,54,112,0,0,29,0,0,0,0,0,0,0,0,0,40,112,25,112,112,0,0,0,0,0,0,0,0,0,0,0,40,112,25,112,112,0,0,0,0,0,0,0,0,0,0,0,40,112,112,112,112,0,0,0,0,0,0,0,0,0,0,0,0,40,112,112,0,0,0,0,0,0,0,0,0,0,0,0,0,40,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,0,0,0,0,0,0,0,0}; /* 数据头四个字节分别由两个16位数据表示图片的长和宽,后面是图片8bit的颜色数据 */void copyright(void){ printf("Game Over. your score %ld\n",GameScore); printf("Thank you for play it, if you have any question please call me\n"); printf("(0871)7167710 or lwwind@yeah.net, Lin Wei\n");}int game_init(void);int game_restore(void);void main(void){ if (!game_init()) return; /* 游戏初始化 */ printf(" - STAR WAR -\r"); /* 打印标题 */ GameStart(); /* 游戏主循环 */ game_restore(); /* 还原初始化 */ copyright(); /* 显示说明文 */}int game_init(void){ long i; union REGS regs; MemBuf=(char far*)farmalloc(320L*(MAXY+1)); if (!MemBuf) { printf("not enough memory\n"); return 0; } memset(MemBuf,0,320L*(MAXY+1)); randomize(); /* 初始化随机函数 */ for (i=0;i<128;i++) keys[i]=0; /* 键盘码初始化 */ for (i=0;i<MAX_STAR;i++) { /* 星空初始化 */ Stars[i].x=random(320); Stars[i].y=-20+random(250); Stars[i].v=1; if (i<MAX_STAR/3) Stars[i].v++; } for (i=0;i<MAX_OBJ;i++) Objs[i].mode=0; /* 物体初始化 */ /* 键盘中断初始化:设置新的中断 */ OldInt9=getvect(9); disable(); setvect(9,NewInt9); enable(); /* 设置 320x200x256c图形模式 */ regs.x.ax=0x13; int86(0x10,®s,®s); return 1;}int game_restore(void){ union REGS regs; /* 还原设置:还原老的中断 */ disable(); setvect(9,OldInt9); enable(); regs.x.ax=3; int86(0x10,®s,®s); farfree(MemBuf); return 0;}/* 键盘服务程序 */void interrupt NewInt9(void){ unsigned char key; key=inportb(0x60); /* 读键盘扫描码 */ if (key<0x80) keys[key]=1; /* 如果最高位是0,则为按下 */ else keys[key&0x7f]=0; /* 如果最高位是1,则为放开 */ key=inportb(0x61); key|=0x80; outportb(0x61,key); /* 告诉键盘已接收 */ outportb(0x61,key&0x7f); outportb(0x20,0x20); /* 发送中断结束信号 */}/*---------------------------- 游戏图形引擎 ---------------------------------*/void pixel(unsigned x,unsigned y,char c) /* 画点 */{ if (x>=320||y>MAXY) return; /* 判断范围 */ MemBuf[(y<<8)+(y<<6)+x]=c; /* MemBuf[y*320+x]=c */}/* 将二级缓存的内容显示出来 */void show(void){ int offset=(199-MAXY)*160; memcpy(VideoBuf+offset,MemBuf,320L*(MAXY+1));}/* 清屏 */void clear(void){ memset(MemBuf,0,320L*(MAXY+1));}/* 就是绘制图块,(x,y)是坐标b是内存地址mode表示是否上下颠倒 * 敌人和主人是同样的图片做颠倒 */void putimage(int x,int y,char *b,int mode){ int len, wid, i, j; len = b[0] + (int)b[1] * 256; wid = b[2] + (int)b[3] * 256; x-=len/2; y-=wid/2; /* 中心对称 */ for (j=0,b=b+4;j<wid;j++) for (i=0;i<len;i++,b++) { if (*b&&!mode) pixel(x+i,y+j,*b); /* 是否镜面翻转 */ if (*b&&mode) pixel(x+i,y+wid-j-1,*b); }}void drawfire(int x,int y) /* 画出激光 */{ int i,j; for (i=-6;i<6;i++) { pixel(x-5,y+i,9); pixel(x+3,y+i,9); }}/*---------------------------- 游戏控制引擎 ---------------------------------*/unsigned long timepass; /* 游戏进行的时间 */int GameOver, Sound=0;int fly_x=160,fly_y=MAXY*2/3,fly_flag=1,fire_flag=1;void drivers(void); /* 控制产生敌人的函数 */void control(void); /* 对象控制(事件处理) */int AllocObj(void) /* 分配空余对象 */{ int i=0; while (i<MAX_OBJ&&Objs[i].mode) i++; if (i>=MAX_OBJ) i=MAX_OBJ-1; return i;}int CheckHit(int x1,int y1,int x2,int y2,int r) /* 检查碰撞 */{ if (abs(x1-x2)<=r&&abs(y1-y2)<=r) return 1; return 0;}ulong fclock(void) /* 读取 1.19MHz的32位系统时钟 */{ ulong t; disable(); outportb(0x43,0); t=inportb(0x40); t+=(inportb(0x40)<<8); t=0xffff^t; enable(); /* (not t) + (clock()<<16) */ return (clock()<<16)+t;}char GameStart(void){ ulong start=0; timepass=0; while (!GameOver) { while (fclock()-start<=45000L); start=fclock(); /* 时间控制 */ clear(); /* 1.清屏. 以下5点为游戏的主循环 */ timepass++; /* 2.时间基数++ */ control(); /* 3.事件处理 */ drivers(); /* 4.事件引擎 */ show(); /* 5.显示 */ if (--Sound<=0) nosound(); /* 声音处理 */ if ((timepass&3)==0) printf("%d\r",GameScore); /* 到一定的时间更新显示分数 */ if (keys[KEY_ESC]) GameOver=1; } sound(105); delay(700); nosound(); /* Game Over发音 */ return 1;}/* 游戏的事件处理主程序分别处理星空和物体还有主角控制 * 通过扫描对象数组:Objs[MAX_OBJ]来完成,根据扫描到的对象属性Objs[i].mode来判断 * 到底是什么对象:敌机或者子弹。并进入相应的处理程序:分析对象的状态,然后作出 * 调整,并重新更改状态,这就是游戏编程同时处理众多物体的核心思想。 */void control(void){ int i,j,x,y, ok; /* 星星处理 */ for (i=0;i<MAX_STAR;i++) { Stars[i].y+=Stars[i].v; /* 向下移动 */ if (Stars[i].y>MAXY) { /* 如果移出屏幕就让它重新出现在屏幕上方某位置 */ Stars[i].x=random(320); Stars[i].y=-random(60); } if (Stars[i].v==1) pixel(Stars[i].x,Stars[i].y,23); /* 速度不一样颜色也不一样 */ else pixel(Stars[i].x,Stars[i].y,28); } /* 对象处理 */ for (i=0;i<MAX_OBJ;i++) /* 扫描对象数组 */ { x=Objs[i].x; y=Objs[i].y; ok=1; switch (Objs[i].mode) /* mode表示敌人,子弹等 */ { /* 敌人处理 */ case 1: if (Objs[i].index==0) { switch (Objs[i].type) /* 检测敌人的三种状态 */ { case 0: if (!random(30)) Objs[i].type=1; break; /* 3种动作状态 */ case 1: if (x<fly_x) x++; if (x>fly_x) x--; if (!random(40)) Objs[i].type=2; break; case 2: default:if (!random(3)) y+=3; break; } if (CheckHit(x,y,fly_x,fly_y,15)) fly_flag=0; /* 与主角相撞 */ putimage(x,y,fly_pic,0); } else { /* 如果被击中就闪烁地绘制飞机,然后消失 */ if ((Objs[i].index&3)==0) putimage(x,y,fly_pic,0); if (++Objs[i].index>50) Objs[i].mode=0; } y++; if (y>MAXY) Objs[i].mode=0; /* 移出屏幕就清除 */ break; /* 激光处理 */ case 2: y-=4; if (y<-20) Objs[i].mode=0; drawfire(x,y); for (j=0;j<MAX_OBJ;j++) /* 检查与敌机相碰 */ if (Objs[j].mode==1&&CheckHit(x,y,Objs[j].x,Objs[j].y,15)&& !Objs[j].index&&ok) /* 击中敌机 */ { Objs[j].index=1; ok=0; Objs[i].mode=0; sound(220); Sound=10; GameScore+=10; } break; } Objs[i].x=x; Objs[i].y=y; /* 更新坐标 */ } /* 主角控制 */ if (keys[KEY_UP]) if (--fly_y<0) fly_y=0; /* 如果上键被按下 */ if (keys[KEY_DOWN]) if (++fly_y>MAXY) fly_y=MAXY; /* 如果下键被按下 */ if (keys[KEY_LEFT]) if (--fly_x<0) fly_x=0; /* 如果左键被按下 */ if (keys[KEY_RIGHT]) if (++fly_x>319) fly_x=319; /* 如果右键被按下 */ if (keys[KEY_CTRL]&&fire_flag) { /* 如果按下CTRL */ i=AllocObj(); Objs[i].x=fly_x, Objs[i].y=fly_y-10, Objs[i].mode=2; fire_flag=0; } if (!keys[KEY_CTRL]) fire_flag=1; /* 如果放开CTRL */ putimage(fly_x,fly_y,fly_pic,1); /* 画出主角 */ if (!fly_flag) GameOver=1; /* 判断主角状态 */}/* 控制产生敌人的部分 */void drivers(void){ if (random(30)==0) { int i=AllocObj(); Objs[i].x=random(320); Objs[i].y=-random(20); Objs[i].mode=1; Objs[i].type=Objs[i].index=0; if (!random(20)) Objs[i].type=2; }}
艺术化的程序设计
计算机的硬件也有限,而人的创造也无限,程序设计美于思维和行为,记得1997年一个叫做 “OMNISCENT” 的 DEMO 使人感慨万分,作者就像一名艺术家在一粒小小的米粒上雕刻着自己的作品一般。能力虽有不及,仍不妨我校仿,以此挖掘计算机最原始的艺术表现形式:
(此为自去年九月到现在三次发布中的最终版本: EXFORCE)
在 DOS 窗口中运行 DEBUG,然后把下面内容复制、粘贴到 DEBUG 窗口中,回车就可以见到了。
e100 e8 5f 0 e8 4c 1 e8 ed 0 b8 0 4c cd 20 f f 0 8 7 1 7 1 6 7 7 1 0 f 1 0 0e11f 0 fe c2 cb c4 c1 8a d3 c5 df 8a cc c5 d8 8a da c6 cb d3 c3 c4 cd 86 8ae137 c8 d3 8a d9 c1 d3 dd c3 c4 ce 99 9a 9a 9a ea c2 c5 de c7 cb c3 c6 84 c9e14f c5 c7 a7 a0 0 87 97 8a ef f2 ec e5 f8 e9 ef 8a 97 87 0 66 60 b8 0 11 a3e168 e 1 5 80 bb a3 16 1 5 0 1 a3 10 1 5 80 0 a3 12 1 5 10 2 a3 14 1 8b 3e 10e185 1 fc b9 80 2 33 c0 f3 aa 1e 33 c0 8e d8 8e c0 be 24 0 66 ad 1f 66 a3 18e19e 1 8c c8 66 c1 e0 10 b8 1d 2 bf 24 0 fa 66 ab b0 34 e6 43 b8 87 0 e6 40e1b7 8a c4 e6 40 fb 66 33 c0 1e 7 b8 13 0 cd 10 be 7e 3 bb 0 0 8b 3e 16 1 ace1d1 3c c0 73 4 aa 43 eb 9 24 3f 50 ac 59 f3 aa 43 43 80 fb 9b 72 e9 33 c0 cde1ea 1a 81 e2 ff 7f 89 16 1c 1 66 61 c3 33 c0 8e c0 66 a1 18 1 bf 24 0 fa 66e203 ab b0 34 e6 43 33 c0 e6 40 e6 40 fb 66 33 c0 b8 3 0 cd 10 1e 7 e8 4d 0e21c c3 60 1e 6 8c c8 8e d8 8e c0 33 c0 e4 60 8b c8 83 e1 7f 8b 1e 10 1 3 d9e235 24 80 f6 d0 c1 e8 7 88 7 e4 61 c 80 e6 61 24 7f e6 61 b0 20 e6 20 7 1fe24e 61 cf c3 c3 60 b4 2 b7 0 ba d 0 cd 10 b3 3 be 54 1 e8 9 1 61 e8 b1 1 c3e269 be 20 1 e8 fe 0 33 c0 cd 16 c3 60 8b 36 e 1 bf 40 1f b9 c0 5d fc b8 0 a0e283 8e c0 f3 a5 e 7 61 c3 60 8b 3e e 1 b9 c0 5d e 7 33 c0 fc f3 ab 61 c3 c8e29d 0 0 0 60 8b 4e 4 8b 56 6 8a 46 8 81 f9 40 1 73 1a 81 fa 96 0 73 14 8b 3ee2b8 e 1 8b da c1 e2 8 c1 e3 6 3 da 3 d9 3 fb 88 5 61 c9 c3 c8 2 0 0 60 8b 1ee2d4 16 1 ba 0 0 83 6e 4 8 83 6e 6 8 c7 46 fe f 0 b9 0 0 33 c0 8a 7 43 3c 0e2f0 74 1e 50 8b 46 6 83 7e 8 0 74 4 3 c2 eb 3 3 46 fe 50 8b 46 4 3 c1 50 e8e30b 8f ff 83 c4 6 41 83 f9 10 72 d3 ff 4e fe 42 83 fa 10 72 c7 8b 4e 4 8b 56e324 6 61 c9 c3 c8 0 0 0 52 66 a1 1c 1 66 69 c0 35 4e 5a 1 66 40 66 a3 1c 1e33e 66 c1 e8 10 66 25 ff 7f 0 0 99 f7 7e 4 8b c2 5a c9 c3 c8 0 0 0 8b 1e 12e358 1 b9 20 0 b8 0 0 83 3f 0 74 7 83 c3 10 40 49 75 f4 c9 c3 fc ac 3c 0 74 ae373 b4 e 34 aa 60 cd 10 61 eb f1 c3 c3 0 1d 19 c4 0 19 1d c1 c4 c7 0 c2 19e38c c4 0 19 0 c1 c4 c4 0 c2 70 0 19 c1 c4 c2 28 1d c2 70 28 70 0 c3 70 c2 28e3a6 c2 70 c2 28 c2 19 70 c2 28 c6 70 28 70 19 c2 28 c3 70 c2 28 19 28 c2 70e3be c2 0 c2 70 19 c3 28 70 c3 28 19 28 70 c4 0 70 19 28 70 28 c3 70 28 19 70e3d7 c6 0 1d 70 0 28 0 70 0 70 1d c7 0 1d 70 0 28 36 70 0 70 1d c7 0 1d c2 0e3f2 28 36 70 c2 0 1d c9 0 28 70 19 c2 70 cb 0 28 70 19 c2 70 cb 0 28 c4 70e40b cc 0 28 c2 70 cd 0 28 19 cf 0 70 c8 0 c8 32 0 0 56 57 c7 46 fe 9c 2 c7e425 46 fc cd 2 c7 46 fa 28 3 c7 46 f8 51 3 c6 46 f1 1 c6 46 f0 0 c6 46 ef 0e43f 66 c7 46 e8 0 0 0 0 c7 46 e2 a0 0 c7 46 e0 78 0 c7 46 d2 0 0 c7 46 ce 0e45a 0 a1 10 1 89 46 ec a1 14 1 89 46 f6 a1 12 1 89 46 f4 c7 46 de 0 0 8b 76e474 f6 eb 38 68 40 1 ff 56 fa 59 89 4 68 c8 0 ff 56 fa 59 5 ce ff 89 44 2 83e48e 7e de 35 7d c c7 44 4 1 0 c7 44 6 17 0 eb a c7 44 4 2 0 c7 44 6 1c 0 ffe4aa 46 de 83 c6 8 83 7e de 50 7c c2 e9 94 3 66 8b 46 e8 66 89 46 e4 eb 14 66e4c3 60 33 c0 cd 1a 8b c1 66 c1 e0 10 8b c2 66 89 46 e4 66 61 66 8b 46 e4 66e4db 2b 46 e8 66 83 f8 c 72 de 66 8b 46 e4 66 89 46 e8 b8 8b 2 ff d0 c7 46 dee4f4 50 0 8b 76 f6 eb 36 8a 44 6 50 ff 74 2 ff 34 ff 56 fe 83 c4 6 8b 44 4 1e50e 44 2 81 7c 2 96 0 7e 14 68 40 1 ff 56 fa 59 89 4 6a 3c ff 56 fa 59 f7 d8e528 89 44 2 ff 4e de 83 c6 8 83 7e de 0 75 c4 8b 5e ec 80 7f 4b 0 74 f 83 6ee542 e2 2 83 7e e2 0 7d 5 c7 46 e2 0 0 8b 5e ec 80 7f 4d 0 74 10 83 46 e2 2e55c 81 7e e2 40 1 7e 5 c7 46 e2 40 1 8b 5e ec 80 7f 48 0 74 f 83 6e e0 3 83e576 7e e0 0 7d 5 c7 46 e0 0 0 8b 5e ec 80 7f 50 0 74 10 83 46 e0 2 81 7e e0e590 96 0 7e 5 c7 46 e0 96 0 8b 5e ec 80 7f 1 0 74 3 e9 b0 2 8b 5e ec 80 7fe5aa 1d 0 74 33 80 7e f0 0 75 31 c6 46 f0 1 ff 56 f8 c1 e0 4 8b 7e f4 3 f8 80e5c4 7e ef 2 7d 1c fe 46 ef c7 5 2 0 8b 46 e2 89 45 8 8b 46 e0 5 f7 ff 89 45e5de a eb 4 c6 46 f0 0 c7 46 de 0 0 8b 7e f4 e9 a3 1 8b 45 8 89 46 d6 8b 45 ae5f9 89 46 d4 8b 5 89 46 d0 3d 1 0 74 b 3d 2 0 75 3 e9 a7 0 e9 6b 1 83 7d 2 0e615 74 6d 8b 46 d6 2b 46 e2 89 46 da 83 7e da 0 7d 5 f7 d8 89 46 da 8b 46 d4e62e 2b 46 e0 89 46 d8 83 7e d8 0 7d 5 f7 d8 89 46 d8 83 7e da d 7d a 83 7ee647 d8 d 7d 4 c6 46 f1 0 6a 2 ff 56 fa 59 40 1 46 d4 81 7e d4 a0 0 7e 5 c7e661 46 d0 0 0 6a 8 ff 56 fa 59 b c0 75 25 8b 46 d6 3b 46 e2 7e 5 b8 ff ff ebe67b 3 b8 1 0 1 46 d6 eb 10 ff 45 4 8b 45 4 3d 28 0 7e 5 c7 46 d0 0 0 8b 45 2e697 8b 55 4 83 e2 1 b c2 75 3 e9 d8 0 6a 1 ff 76 d4 ff 76 d6 ff 56 fc 83 c4e6b1 6 e9 c7 0 8b 46 d4 5 fb ff 89 46 dc eb 27 6a 9 ff 76 dc 8b 46 d6 5 fb ffe6cb 50 ff 56 fe 83 c4 6 6a 9 ff 76 dc 8b 46 d6 5 3 0 50 ff 56 fe 83 c4 6 ffe6e5 46 dc 8b 46 d4 5 5 0 3b 46 dc 7f ce 83 6e d4 4 83 7e d4 ec 7d 8 c7 46 d0e6ff 0 0 fe 4e ef c7 46 dc 0 0 8b 46 f4 89 46 f2 eb 65 8b 5e f2 83 3f 1 75 56e719 83 7f 2 1 75 50 83 7e d0 0 74 4a 8b 46 d6 2b 47 8 89 46 da 83 7e da 0 7de733 5 f7 d8 89 46 da 8b 5e f2 8b 46 d4 2b 47 a 89 46 d8 83 7e d8 0 7d 5 f7e74c d8 89 46 d8 83 7e da f 7d 19 83 7e d8 f 7d 13 8b 5e f2 c7 47 2 0 0 c7 46e766 d0 0 0 fe 4e ef ff 46 ce ff 46 dc 83 46 f2 10 83 7e dc 20 7c 95 8b 46 d6e77f 89 45 8 8b 46 d4 89 45 a 8b 46 d0 89 5 ff 46 de 83 c7 10 83 7e de 20 7de798 3 e9 54 fe 6a 14 ff 56 fa 59 b c0 75 3b ff 56 f8 c1 e0 4 8b 56 f4 3 d0e7b1 89 56 f2 8b 5e f2 c7 7 1 0 c7 47 2 1 0 c7 47 4 0 0 68 40 1 ff 56 fa 59e7cc 8b 5e f2 89 47 8 6a a ff 56 fa 59 5 ec ff 8b 5e f2 89 47 a b8 96 0 2b 46e7e6 ce 89 46 d4 83 7e d4 0 7d 5 c7 46 d4 0 0 8b 46 d4 89 46 de eb 11 6a 4 ffe800 76 de 68 3f 1 ff 56 fe 83 c4 6 ff 46 de 81 7e de 96 0 7c e8 81 7e d2 8ce819 0 7d f c6 46 f1 1 8b 46 d2 25 1 0 89 46 da eb 5 c7 46 da 1 0 83 7e da 0e834 74 e 6a 0 ff 76 e0 ff 76 e2 ff 56 fc 83 c4 6 b8 74 2 ff d0 ff 46 d2 80e84d 7e f1 0 74 3 e9 63 fc 80 7e f1 0 75 2e 66 8b 46 e8 66 89 46 e4 eb 14 66e866 60 33 c0 cd 1a 8b c1 66 c1 e0 10 8b c2 66 89 46 e4 66 61 66 8b 46 e4 66e87e 2b 46 e8 66 3d d0 2 0 0 72 dc 5f 5e c9 c3 ff 53 4b 59 57 49 4e 44 30 35g本程运行于 DOS 环境,所以不必当心它是个病毒 :-),用 CTRL 控制运行,如果您运行在 WINXP 下面,粘贴操作只需要点击 DEBUG 窗口的图标,选 “编辑” 即可。
以往版本或者叫 “艺术化程序设计” 或者叫 “Extreme Game Programming” 都是 EXFORCE的前几次版本,最终版本共1943字节。关于EXFORCE的更多详情见
2004/9/20 skywind.

