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

📄 源代码.asm

📁 一个五子棋游戏可以图形显示棋盘和网格线然后选择棋子 有一定智能
💻 ASM
📖 第 1 页 / 共 2 页
字号:
        jne n1
        mov byte ptr mchess[bp][si],'b'  ;for store chess
        call showbchess               ;show backchess
     ;  call stopbtime
       mov exflg,0
       call bjudgechess              ;judge up to five backchess
       cmp exflg,1
       je inmouse1                   ;up to five
       jmp n2
  inmouse2:
       jmp inmouse1
  exit12:               ;out of jump 75byte
        jmp exit1

     ;   call wchesstime
   n2:               ;for white chess
      mov ah,1
      int 16h
      jnz inkey1
      call mousepressed
      cmp ax,1
      jb n2
   ;   shr cx,1
      cmp cx,90
      jb n2
      cmp cx,390
      jb wchesspan1
      cmp cx,515
      jb n2
      cmp cx,605
      ja n2
      cmp dx,77
      jb n2
      cmp dx,288
      ja n2
      jmp inm
  wchesspan1:
      cmp dx,90
      jb n2
      cmp dx,390
      ja n2
  wchesspan2:
      call countmemchess
      cmp byte ptr mchess[bp][si],0
      jne n2
      mov byte ptr mchess[bp][si],'w'
      call showwchess
   ;   call stopwtime
      mov exflg,0
      call wjudgechess
      cmp exflg,1
      je inmouse2
      jmp start1
  exit1:
        ret
       submain endp
 ;------------------------------
 mainfrm2 proc near
    cmp colorflg,1         ;for change chessblock
    ja chang1
    blockpos 3,402,402,78,78
    jmp block1
 chang1:
    cmp colorflg,2
    ja chang2
    blockpos 5,402,402,78,78
    jmp block1
 chang2:
    cmp colorflg,3
    ja chang3
    blockpos 8,402,402,78,78
    jmp block1
 chang3:
    cmp colorflg,4
    ja chang4
    blockpos 7,402,402,78,78
    jmp block1
 chang4:
    mov colorflg,0
    blockpos 2,402,402,78,78
 block1:
    call colorblock    ;for chess background
    call linechess
    ret
   mainfrm2 endp
 ;----------------------------------
  countmemchess proc near   ;for search chess in mem pos
    sub cx,90
    mov bl,20
    mov ax,cx
    div bl
    cmp ah,10
    jb little1
    inc al
  little1:
    mov a1,al
    mov b1,ah
    and ax,00ffh
    mov si,ax          ;for horizion pos
    sub dx,90
    mov bl,20
    mov ax,dx
    div bl
    cmp ah,10      ; < 10 ?
    jb little2
    inc al
  little2:
    mov a2,al
    mov b2,ah
    and ax,00ffh
    mov ccount,al
    mov bl,16
    mul bl
    mov bp,ax
    ret
    countmemchess endp
 ;---------------------------------
 chessopen1 proc near     ; open chess
     blockpos 6,402,402,78,78
     call colorblock
     call linechess
     mov di,0
     mov mflg1,di
  rotate1:
     cmp byte ptr tempmchess[di],'b'
     je showback
     cmp byte ptr tempmchess[di],'w'
     je showwhite
     jmp nextchess
  showback:
     mov cl,tempmchess[di]
     mov mchess[di],cl
     mov ax,di
     mov bl,16
     div bl
     mov ccount,al
     mov dl,ah
     and dx,00ffh
     mov si,dx
     call showbchess
     jmp nextchess
  showwhite:
     mov cl,tempmchess[di]
     mov mchess[di],cl
     mov ax,di
     mov bl,16
     div bl
     mov ccount,al
     mov dl,ah
     and dx,00ffh
     mov si,dx
     call showwchess
 nextchess:
     inc mflg1
     mov di,mflg1
   ;  inc di
     cmp di,256
     jbe rotate1
     ret
     chessopen1 endp
;-----------------------------------------
  showbchess proc near  ;show black chess in pan
    push bp
    push si
    push di
    mov chessrad,10
    mov ax,si       ;calculate x and y
    and ax,00ffh
    mov bl,20
    mul bl
    add ax,90
    mov x,ax
    mov al,ccount
    mov bl,20
    mul bl
    add ax,90
    mov y,ax
    call mouseshut
    mov al,chessrad
    cbw
    mov di,ax
  loopx:
    mov al,chessrad
    cbw
    mov si,ax
  loopy:
    cal si           ;calcuate (x-x0)*(x-x0)
    mov tempt1,ax
    cal di           ;calcuate (y-y)*(y-y0)
    add tempt1,ax
    mov al,chessrad
    cbw
    cal ax
    sub tempt1,ax     ;(x-x0)*(x-x0)+(y-y0)*(y-y0)-R*R
    jns nextd         ; if > 0 ?
    mov dx,y           ; < 0 in circle
    mov cx,x
    call writeb        ;write pit in (x,y)
    add dx,di
    add cx,si
    call writeb        ;write pit in (x+si,y+di)
    sub cx,si
    sub cx,si
    call writeb        ;write pit in (x-si,y+di)
    mov dx,y
    mov cx,x
    sub dx,di
    sub cx,si
    call writeb         ;write pit in (x-si,y-di)
    add cx,si
    add cx,si
    call writeb         ;write pit in (x+si,y-di)
  nextd:
     dec si
     cmp si,0
     jl nextdb
     jmp loopy
  nextdb:
     dec di
     cmp di,0
     jl exitdb
     jmp loopx
   exitdb:
     call mouseshow
     pop di
     pop si
     pop bp
     ret
     showbchess endp
  ;-------------------------------
  writeb proc near
    mov al,0
    mov ah,0ch
    int 10h
 exitw:
    ret
    writeb endp
 ;------------------------------------
  showwchess proc near ;for show whitechess in pan
    push bp
    push si
    push di
    mov chessrad,10
    mov ax,si
    and ax,00ffh
    mov bl,20
    mul bl
    add ax,90
    mov cx,ax
    mov x,cx
    mov al,ccount
    mov bl,20
    mul bl
    add ax,90
    mov dx,ax
    mov y,dx
    call mouseshut
    mov al,chessrad
    cbw
    mov di,ax
  wloopx:
    mov al,chessrad
    cbw
    mov si,ax
  wloopy:
    cal si
    mov tempt1,ax
    cal di
    add tempt1,ax
    mov al,chessrad
    cbw
    cal ax
    sub tempt1,ax
    jns wnextd
    mov dx,y
    mov cx,x
    call writew
    add dx,di
    add cx,si
    call writew
    sub cx,si
    sub cx,si
    call writew
    mov dx,y
    mov cx,x
    sub dx,di
    sub cx,si
    call writew
    add cx,si
    add cx,si
    call writew
  wnextd:
     dec si
     cmp si,0
     jl wnextdb
     jmp wloopy
  wnextdb:
     dec di
     cmp di,0
     jl wexitdb
     jmp wloopx
  wexitdb:
     call mouseshow
     pop di
     pop si
     pop bp
     ret
     showwchess endp
 ;------------------------------
  writew proc near
 ;   mov ah,0dh
 ;   int 10h
 ;   cmp al,9
 ;   je wexitw
    mov al,0fh
    mov ah,0ch
    int 10h
 wexitw:
    ret
    writew endp
 ;-----------------------------------  
 bjudgechess proc near      ;judge if five black chess
   mov row2,bp
   mov col2,si
 horizion:                  ;judge horizion
   sub si,4
   mov ch,5
  cp1:
    mov cl,0
    mov bx,si
  cp2:
    cmp mchess[bp][si],'b'
    jne unsame1
    inc si
    inc cl
    cmp cl,5
    je exitaa
    jmp cp2
 unsame1:
   inc bx
   mov si,bx
   dec ch
   jnz cp1
  vertical:                 ;judge vertical
   mov bp,row2
   mov si,col2
   sub bp,4*16
   mov ch,5
  cp3:
    mov cl,0
    mov bx,bp
  cp4:
    cmp mchess[bp][si],'b'
    jne unsame2
    add bp,16
    inc cl
    cmp cl,5
    je exitaa
    jmp cp4
  unsame2:
    add bx,16
    mov bp,bx
    dec ch
    jnz cp3
    jmp direct1
  exitaa:
    jmp exita
  direct1:            ;judge direct1
    mov bp,row2
    mov si,col2
    sub bp,4*16
    sub si,4
    mov ch,5
  cp5:
    mov cl,0
    mov bx,bp
    mov di,si
  cp6:
    cmp mchess[bp][si],'b'
    jne unsame3
    add bp,16
    inc cl
    inc si
    cmp cl,5
    je exita
    jmp cp6
  unsame3:
    add bx,16
    inc di
    mov bp,bx
    mov si,di
    dec ch
    jnz cp5
  direct2:            ;judge direct2
    mov bp,row2
    mov si,col2
    sub bp,4*16
    add si,4
    mov ch,5
  cp7:
    mov cl,0
    mov bx,bp
    mov di,si
  cp8:
    cmp mchess[bp][si],'b'
    jne unsame4
    inc cl
    add bp,16
    dec si
    cmp cl,5
    je exita
    jmp cp8
  unsame4:
    add bx,16
    dec di
    mov bp,bx
    mov si,di
    dec ch
    jnz cp7
    jmp exitb
 exita:
    setcursor 15,20  ;for blackwin
    call mouseshut
    showmessage mc
    call mouseshow
    mov exflg,1
 exitb:
    ret
    bjudgechess endp

;--------------------------
  wjudgechess proc near    ;judge if five white chess
   mov row2,bp
   mov col2,si
 whorizion:                ;judge horizion
   sub si,4
   mov ch,5
  wcp1:
    mov cl,0
    mov bx,si
  wcp2:
    cmp mchess[bp][si],'w'
    jne wunsame1
    inc si
    inc cl
    cmp cl,5
    je wexitaa
    jmp wcp2
 wunsame1:
   inc bx
   mov si,bx
   dec ch
   jne wcp1
  wvertical:           ;judge vertical
   mov bp,row2
   mov si,col2
   sub bp,4*16
   mov ch,5
  wcp3:
    mov cl,0
    mov bx,bp
  wcp4:
    cmp mchess[bp][si],'w'
    jne wunsame2
    add bp,16
    inc cl
    cmp cl,5
    je wexitaa
    jmp wcp4
  wunsame2:
    add bx,16
    mov bp,bx
    dec ch
    jnz wcp3
    jmp wdirect1
  wexitaa:
    jmp wexita
  wdirect1:                ;judge direct1
    mov bp,row2
    mov si,col2
    sub bp,4*16
    sub si,4
    mov ch,5
  wcp5:
    mov cl,0
    mov bx,bp
    mov di,si
  wcp6:
    cmp mchess[bp][si],'w'
    jne wunsame3
    add bp,16
    inc cl
    inc si
    cmp cl,5
    je wexita
    jmp wcp6
  wunsame3:
    add bx,16
    inc di
    mov bp,bx
    mov si,di
    dec ch
    jnz wcp5
 wdirect2:                ;judge direct2
    mov bp,row2
    mov si,col2
    sub bp,4*16
    add si,4
    mov ch,5
  wcp7:
    mov cl,0
    mov bx,bp
    mov di,si
  wcp8:
    cmp mchess[bp][si],'w'
    jne wunsame4
    inc cl
    add bp,16
    dec si
    cmp cl,5
    je wexita
    jmp wcp8
  wunsame4:
    add bx,16
    dec di
    mov bp,bx
    mov si,di
    dec ch
    jnz wcp7
    jmp wexitb
 wexita:
    setcursor 15,20  ;for blackwin
    call mouseshut
    showmessage md
    call mouseshow
    mov exflg,1
 wexitb:
    ret
    wjudgechess endp
 ;--------------------------------------
 chesssave1 proc near
     blockpos 1,64,385,46,173
     call colorblock     ;for save frame color
     setcursor 3,22
     showmessage msave
     setcursor 3,42
     mov al,'Y'      ;for 'Y' output
     mov bl,10110100b
     mov cx,1
     mov ah,9
     int 10h
     setcursor 3,44   ;for or output
     showmessage msor
     setcursor 3,47
     mov al,'N'
     mov bl,10110100b
     mov cx,1
     mov ah,9
     int 10h
wait1:
     mov ah,1
     int 16h
     jz wait1
     cmp ah,15h  ;15h is yes scan code
     je save2
     cmp ah,31h  ;31h is no scan code
     je no_save
     jmp wait1
  save2:
      mov ah,0ch  ; clear buffter
      mov al,0
      int 21h
      lea si,mchess   ;save information
      lea di,tempmchess
      mov cx,256
      cld
      rep movsb
      jmp clsframe
   no_save:
      mov ah,0ch   ;for clear buffter
      mov al,0
      int 21h
  clsframe:
      blockpos 9,64,385,46,173,  ;clear saveframe
      call colorblock
      ret
  chesssave1 endp
 ;---------------------------------------
  chessabout1 proc near
   xor aboutflg,11111111b   ;for is show name
   cmp aboutflg,1
   je hideabout
   setcursor 26,34
   showmessage mprod
   setcursor 27,16
   showmessage mhuang
   setcursor 27,48
   showmessage mzhao
   setcursor 28,4
   showmessage mzhu
   setcursor 28,33
   showmessage mwu
   setcursor 28,63
   showmessage mhong
   jmp t1
 hideabout:
      blockpos 9,468,620,416,32
      call colorblock
   t1:
      ret
    chessabout1 endp
 ;-------------------------------

  code ends
   end start

⌨️ 快捷键说明

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