精华区代码Revision-C版本[系列六-bottom half]
程序代码:
;---------------------------------------------------------------------- ;每局的开始预处理 gao_build macro ;static inlne gao_build(); local gao_build_repeat ; push ax push bx push cx push dx ; mov [x],map_x mov [y],map_y ;g_xy.x = map_x; g_xy.y = map_y; inc [x] inc [y] ;g_xy.x++; g_xy.y++; mov al,18 add [x],al add [y],al ;g_xy.x += 18; g_xy.y += 18; mov ax,map_size mov bx,map_size mul bx mov cx,ax ;uint16_t i = map_size*map_size; dec cx ;i--; ; ;uint8_t *p_map; gao_build_repeat: mov ax,cx dec ax ;i--; mov bx,offset map ;p_map = map; add bx,ax ;p_map += i; mov [bx],0000h ;*(uint16_t*)p_map = 0; loop gao_build_repeat ;while (i--); ; .if [map_over]==1 add [person1],1 ;if(map_over == 1) person_t[0]++; .elseif [map_over]==2 add [person2],1 ;else if (map_over == 2) person_t[1]++; .endif ; .if [person_first]==2 ;if (person_first == 2) { mov [person_first],1 ;person_first = 1; mov [person],1 ;person = 1; mov [map_over],6 ;map_over = 6; .else ;} else { mov [person_first],2 ;person_first = 2; mov [person],2 ;person = 2; mov [map_over],7 ;map_over = 7; .endif ;} ; pop dx pop cx pop bx pop ax endm ;---------------------------------------------------------------------- ;将两个人的胜利局数都清零,并且做一些简单初始化 gao_init macro ;static inline gao_init(); push ax push bx push cx push dx ; mov ax,@data mov ds,ax mov [person1],0 ;person1 = 0; mov [person2],0 ;person2 = 0; mov [person_first],2 ;person_first = 2; ; pop dx pop cx pop bx pop ax endm ;---------------------------------------------------------------------- ;结束程序 gao_exit macro push ax push bx push cx push dx ; gao_clear_screen 07h,0,0,49,79 ;clrscr(); /*Pseudo-code*/ mov ah,4ch int 21h ;exit(0); ; pop dx pop cx pop bx pop ax endm ;---------------------------------------------------------------------- ;输入函数 ;辅助函数 1 , 坐标转换 gao_give_change macro state,x,y,xx,yy ;static inline gao_give_change(uint16_t state, struct point xy, struct point x2y2); push ax push bx push cx push dx ; mov al,x ;struct point _xy; _xy.x = xy.x; sub al,map_x ;_xy.x -= map_x; mov ah,0 mov bl,2 div bl ;_xy.x /= 2; mov xx,al ;x2y2.x = _xy.x; mov ah,0 mov bl,map_size mul bl ; mov cx,ax ;uint16_t state = _xy.x * map_size; ; mov al,y mov ah,0 ;_xy.y = xy.y; sub al,map_y mov bl,2 div bl ;_xy.y /= 2; mov yy,al ;x2y2.y = _xy.y; mov ah,0 add cx,ax ;state += _xy.y; mov state,cx ;state = state; ; pop dx pop cx pop bx pop ax endm ;辅助函数 2 - 1 , 坐标转换 gao_judge_over_change macro xx,x,y ;static inline gao_judge_over_change(uint16_t xx, struct point xy); push ax push bx push cx push dx ; mov bl,map_size mov al,x ;struct point _xy; _xy.x = xy.x; mov ah,0 mul bl mov bl,y ;_xy.y = xy.y; mov bh,0 add ax,bx mov xx,ax ;xx = _xy.x * map_size + _xy.y; ; pop dx pop cx pop bx pop ax endm ;辅助函数 2 - 2 , 计算连子数量 gao_judge_over_add macro t,x,y,change_x,change_y,person ;static inline gao_judge_over_add(uint8_t t, struct point xy, uint8_t change_x, uint8_t change_y, uint8_t person); local gao_judge_over_add_end ; push ax push bx push cx push dx ; mov dl,map_size dec dl ;uint8_t size = map_size - 1; ; .while [nothing1]==0 ;while (nothing1 == 0) { .if x==0 .break .if change_x==0 .endif ;if (xy.x == 0 && change_x == 0) break; .if y==0 .break .if change_y==0 .endif ;if (xy.y == 0 && change_y == 0) break; .if x==dl .break .if change_x==1 .endif ;if (xy.x == size && change_x == 1) break; .if y==dl .break .if change_y==1 .endif ;if (xy.y == size && change_y == 1) break; .if change_x==1 inc x ;if (change_x == 1) xy.x++; .elseif change_x==0 dec x ;if (change_x == 0) xy.x--; .endif .if change_y==1 inc y ;if (change_y == 1) xy.y++; .elseif change_y==0 dec y ;if (change_y == 0) xy.y--; .endif gao_judge_over_change [chess_state],x,y mov bx,offset map mov ax,[chess_state] add bx,ax mov bl,[bx] ;uint8_t man = map[*(uint16_t*)chess_state]; .break .if bl!=person ;if (man != person) break; inc t ;t++; .endw ;} gao_judge_over_add_end: ; pop dx pop cx pop bx pop ax endm ;辅助函数 2 , 判断是否完满 gao_judge_over macro jud,x,y,person ;static inline gao_judge_over(bool jud, struct point xy, uint8_t person); local gao_judge_over_end ; push ax push bx push cx push dx ; mov [nothing1],0 ;nothing[0] = 0; mov [nothing2],1 ;nothing[1] = 1; mov [nothing3],2 ;nothing[2] = 2; ; mov [chess_t],1 ;chess_t = 1; mov ah,x mov al,y ;struct point _xy = xy; mov [help_x],ah mov [help_y],al ;help_x = _xy.x; help_y = _xy.y; gao_judge_over_add [chess_t],[help_x],[help_y],[nothing3],[nothing1],person mov [help_x],ah mov [help_y],al ;help_x = _xy.x; help_y = _xy.y; gao_judge_over_add [chess_t],[help_x],[help_y],[nothing3],[nothing2],person .if [chess_t]>=5 ;if (chess_t >= 5) mov jud,2 ;jud = (bool)2; jmp gao_judge_over_end ;goto gao_judge_over_end; .endif ; mov [chess_t],1 ;chess_t = 1; mov ah,x mov al,y mov [help_x],ah mov [help_y],al ;help_x = _xy.x; help_y = _xy.y; gao_judge_over_add [chess_t],[help_x],[help_y],[nothing1],[nothing3],person mov [help_x],ah mov [help_y],al ;help_x = _xy.x; help_y = _xy.y; gao_judge_over_add [chess_t],[help_x],[help_y],[nothing2],[nothing3],person .if [chess_t]>=5 ;if (chess_t >= 5) mov jud,2 ;jud = (bool)2; jmp gao_judge_over_end ;goto gao_judge_over_end; .endif ; mov [chess_t],1 ;ignore same c source code mov ah,x mov al,y mov [help_x],ah mov [help_y],al gao_judge_over_add [chess_t],[help_x],[help_y],[nothing1],[nothing1],person mov [help_x],ah mov [help_y],al gao_judge_over_add [chess_t],[help_x],[help_y],[nothing2],[nothing2],person .if [chess_t]>=5 mov jud,2 jmp gao_judge_over_end .endif ; mov [chess_t],1 mov ah,x mov al,y mov [help_x],ah mov [help_y],al gao_judge_over_add [chess_t],[help_x],[help_y],[nothing1],[nothing2],person mov [help_x],ah mov [help_y],al gao_judge_over_add [chess_t],[help_x],[help_y],[nothing2],[nothing1],person .if [chess_t]>=5 mov jud,2 jmp gao_judge_over_end .endif ; gao_judge_over_end: ; pop dx pop cx pop bx pop ax endm ;辅助函数 3 , 判断复杂情况 gao_give_judge macro jud,x,y,person ;static inline gao_give_judge(bool jud, struct point xy, uint8_t person); local gao_give_judge_end ; push ax push bx push cx push dx ; mov bx,offset map gao_give_change [chess_state],x,y,[chess_x],[chess_y] mov ax,[chess_state] add bx,ax mov al,[bx] ;uint8_t man = map[*(uint16_t*)chess_state]; .if al!=0 ;if (man) mov jud,1 ;jud = true; jmp gao_give_judge_end ;goto gao_give_judge_end; .endif ; mov al,[person] ;man = person; mov [bx],al ;map[*(uint16_t*)chess_state] = man; mov jud,0 ;jud = false; gao_judge_over jud,[chess_x],[chess_y],[person] .if jud!=0 ;if (jud != false) mov jud,2 ;jud = (bool)2; jmp gao_give_judge_end ;goto gao_give_judge_end; .endif ; gao_give_judge_end: ; pop dx pop cx pop bx pop ax endm ;辅助函数 4 , 判断能不能放子 gao_give macro jud,x,y,person ;static inline gao_give(bool jud, struct point xy, uint8_t person); local gao_give_end ; push ax push bx push cx push dx ; mov jud,0 ;jud = false; gao_judge jud,x,y,map_x1,map_y1,map_x_end,map_y ; .if jud==1 ;if (jud == true) mov [map_over],4 ;map_over = 4; jmp gao_give_end ;goto gao_give_end; .endif ; mov jud,0 ;jud = false; gao_judge [jud],x,y,map_x,map_y_end,map_x2,map_y2 ; .if jud==1 ;if (jud == true) mov [map_over],4 ;map_over = 4; jmp gao_give_end ;goto gao_give_end; .endif ; mov jud,0 ;jud = false; gao_give_judge jud,x,y,person ; .if jud==1 ;if (jud == true) mov [map_over],4 ;map_over = 4; jmp gao_give_end ;goto gao_give_end; .elseif jud==2 ;else if (jud == (bool)2) mov bl,person mov [map_over],bl ;map_over = person; jmp gao_give_end ;goto gao_give_end; .else mov [map_over],5 ;map_over = 5; .if person==1 ;if (person == 1) mov person,2 ;person = 2; .else ;else mov person,1 ;person = 1; .endif .endif ; gao_give_end: pop dx pop cx pop bx pop ax endm ;主输入函数 gao_scanf macro x,y ;static inline gao_scanf(struct point xy); local gao_scanf_end ; push ax push bx push cx push dx ; mov dh,x mov dl,y ;struct point _xy = xy; mov ah,2 mov bh,0 int 10h ;setcursor(_xy); /*Pseudo-code*/ ; mov ah,0h int 16h ;uint8_t scan_key = get_scan_code(); /*Pseudo-code*/ mov bl,2 ;uint8_t step = 2; ; ;switch (scan_key) { .if ah==4bh sub y,bl ;case SCAN_KEY_LEFT: xy.y -= step; break; .elseif ah==4dh add y,bl ;case SCAN_KEY_RIGHT: xy.y += step; break; .elseif ah==48h sub x,bl ;case SCAN_KEY_UP: xy.x -= step; break; .elseif ah==50h add x,bl ;case SCAN_KEY_DOWN: xy.x += step; break; .elseif ah==01h ;case SCAN_KEY_ESC: gao_exit(); break; gao_exit ; ;case SCAN_KEY_ENTER: .elseif (ah==1ch)||(ah==39h);case SCAN_KEY_SPACE: ; gao_judge [jud],x,y,person1_x1,person1_y1,person1_x2,person1_y2 .if [jud]==1 ;if (jud == true) mov [map_over],2 ;map_over = 2; .endif ; gao_judge [jud],x,y,person2_x1,person2_y1,person2_x2,person2_y2 .if [jud]==1 ;if (jud == true) mov [map_over],1 ;map_over = 1; .endif ; gao_judge [jud],x,y,answer_x1,answer_y1,answer_x2,answer_y2 .if [jud]==1 ;if (jud == true) mov [map_over],3 ;map_over = 3; .endif ; gao_judge [jud],x,y,end_x1,end_y1,end_x2,end_y2 .if [jud]==1 ;if (jud == 1) gao_exit ;gao_exit(); .endif ; gao_judge [jud],x,y,map_x1,map_y1,map_x2,map_y2 .if [jud]==1 ;if (jud == 1) gao_give [jud],x,y,[person] .endif ; .endif ;default: ;} ; gao_scanf_end: ; mov bl,2 ;step = 2; .if x<2 add x,bl ;if (xy.x < 2) xy.x += step; .endif .if y<2 add y,bl ;if (xy.y < 2) xy.y += step; .endif .if x>47 sub x,bl ;if (xy.x > 47) xy.x -= step; .endif .if y>77 sub y,bl ;if (xy.y > 47) xy.y -= step; .endif ; pop dx pop cx pop bx pop ax endm ;---------------------------------------------------------------------- ;主函数 .code main proc far void main(); gao_init ;gao_init(); ; mov cx,0 .while cx==0 ;while(1) { gao_build ;gao_build(); gao_print ;gao_print(); ; .while [map_over]>3 ;while (map_over > 3) { gao_scanf [x],[y] ;gao_scanf(x, y); gao_print ;gao_print(); .endw ;} .endw ;} ; gao_exit ;gao_exit(); ; main endp end main ;----------------------------------------------------------------------系列六的bottom half