贪吃蛇游戏的源代码(汇编)

 DATA SEGMENT PARA PUBLIC 'DATA'
     X        DW 40
     Y        DW 40
     MUL_RAX  DB 3
     GEWEI    DB 0  ;个位
     SHIWEI   DB 0  ;十位
     BAIWEI   DB 0  ;百位
     QIANWEI  DB 0  ;千位
     WANWEI   DB 0  ;万位
     S_HEAD_X DW ?             ;蛇头X轴坐标
     S_HEAD_Y DW ?             ;蛇头Y轴坐标
     S_TAIL_X DW ?             ;蛇尾X轴坐标
     S_TAIL_Y DW ?             ;蛇尾Y轴坐标
     S_LENGTH DW 100           ;蛇初始长度为100
     EGG_X    DW 50            ;初始化蛋的X轴坐标
     EGG_Y    DW 150           ;初始化蛋的Y轴坐标
     EGG_X_D  DW ?
     EGG_Y_R  DW ?
     S_DIRTIN DB 4             ;蛇头的方向,上1(X--,Y),下2(X++,Y)
                               ;            左3(X,Y--),右4(X,Y++)
     C_SPEED  DB 'GAME SPEED(1-5):$'
     SPEED    DW 100
     S_RADIX  DB ?
     TEMP_DIR DB 4
     TEMPX    DW ?             ;蛇尾X轴坐标的临时存放单元
     TEMPY    DW ?             ;蛇尾Y轴坐标的临时存放单元
     CHAR   DB 'Play Again?(Y/N)$'
     UP     DB ?           ;上
     DOWN   DB ?           ;下
     LEFT   DB ?           ;左
     RIGHT  DB ?           ;右
     SUP    EQU 48H        ;上的扫描码
     SDOWN  EQU 50H        ;下的扫描码
     SLEFT  EQU 4BH        ;左的扫描码
     SRIGHT EQU 4DH        ;右的扫描码
     SESC   EQU 01H        ;ESC的扫描码
     SKEYN  EQU 31H        ;N的扫描码
     SKEYL  EQU 26H        ;L的扫描码
     SKEYS  EQU 1FH        ;S的扫描码
     SKEYQ  EQU 10H        ;Q的扫描码
     NGAME  DB 'New game',0AH,0DH,'$'
     LGAME  DB 'Load game',0AH,0DH,'$'
     SGAME  DB 'Save game',0AH,0DH,'$'
     QGAME  DB 'Quit game$'
     GMENU  DW 8 DUP (?)
DATA ENDS

STACK SEGMENT PARA STACK 'STACK'
      DW 256 DUP (0)
STACK ENDS

CODE SEGMENT PARA PUBLIC 'CODE'
     PROC1 PROC FAR
    ASSUME CS:CODE,DS:DATA,SS:STACK
 START: PUSH DS
 MOV AX,0
 PUSH AX
 MOV AX,DATA
 MOV DS,AX
 AGAIN: MOV GEWEI,0
 MOV SHIWEI,0
 MOV BAIWEI,0
 MOV QIANWEI,0
 MOV WANWEI,0
 MOV EGG_X,50
 MOV EGG_Y,150
 MOV S_DIRTIN,4
 MOV TEMP_DIR,4
 MOV AH,6
 MOV BH,0
 MOV AL,0
 XOR CX,CX
 MOV DX,184FH
 INT 10H        ;清屏

 MOV AH,0
 MOV AL,12H
 INT 10H         ;设置显示模式为640*480,16色

REINPUT:MOV AH,2
 MOV BH,0
 MOV DH,0
 MOV DL,0
 INT 10H
 MOV AH,9
 MOV DX,OFFSET C_SPEED
 INT 21H
 MOV SPEED,10
 MOV AH,1
 INT 21H
 SUB AL,30H
 CMP AL,1
 JAE N23
 MOV AH,2
 MOV BH,0
 MOV DH,0
 MOV DL,16
 INT 10H
 MOV DX,' '
 INT 21H
 JMP REINPUT
 N23: CMP AL,5
 JBE N24
        MOV AH,2
 MOV BH,0
 MOV DH,0
 MOV DL,16
 INT 10H
 MOV DX,' '
 INT 21H
 JMP REINPUT
 N24: MUL MUL_RAX
 MOV CL,AL
 SHL SPEED,CL ;设置游戏速度

        MOV AH,0
 MOV AL,12H
 INT 10H

 MOV CX,29
 MOV DX,29
 LH1: MOV AH,0CH
 MOV BH,0
 MOV AL,0FH
 INT 10H
 INC DX
 CMP DX,449
 JBE LH1
 MOV DX,29
 ADD CX,500
 CMP CX,640
 JA LV1
 JB LH1
 LV1: MOV DX,29
 MOV CX,29
 LV2: MOV AH,0CH
 MOV BH,0
 MOV AL,0FH
 INT 10H
 INC CX
 CMP CX,529
 JBE LV2
 MOV CX,29
 ADD DX,420
 CMP DX,480
 JA INIT
 JB LV2           ;画边框,左上角坐标(29,29)右下角坐标(449,529)

 INIT:  MOV S_HEAD_X,350
 MOV S_HEAD_Y,150
 MOV S_TAIL_X,350
 MOV S_TAIL_Y,50
 MOV DX,S_TAIL_X
 MOV CX,S_TAIL_Y
 A: MOV AH,0CH
 MOV AL,2
 MOV BH,0
 INT 10H
 INC CX
 CMP CX,150
 JBE A  ;初始蛇的位置

 MOV DX,EGG_X
 BCA: MOV CX,EGG_Y
 ABC: MOV AH,0CH      ;初始蛋的位置
 MOV AL,0CH
 MOV BH,0
 INT 10H
 INC CX
 CMP CX,156
 JBE ABC
 INC DX
 CMP DX,56
 JBE BCA
   ;结束初始蛋的位置

 MOV AH,2
 MOV BH,0
 MOV DH,3
 MOV DL,68
 INT 10H
 MOV AH,9
 MOV DX,OFFSET NGAME
 INT 21H
 MOV AH,2
 MOV BH,0
 MOV DH,4
 MOV DL,68
 INT 10H
 MOV AH,9
 MOV DX,OFFSET LGAME
 INT 21H
 MOV AH,2
 MOV BH,0
 MOV DH,5
 MOV DL,68
 INT 10H
 MOV AH,9
 MOV DX,OFFSET SGAME
 INT 21H
 MOV AH,2
 MOV BH,0
 MOV DH,6
 MOV DL,68
 INT 10H
 MOV AH,9
 MOV DX,OFFSET QGAME
 INT 21H   ;在右上角显示菜单

 MOV AH,2
 MOV BH,0
 MOV DH,0
 MOV DL,0
 INT 10H
 MOV AH,2
 MOV DX,30H
 INT 21H
        MOV AH,2
 MOV BH,0
 MOV DH,0
 MOV DL,1
 INT 10H
 MOV AH,2
 MOV DX,30H
 INT 21H
        MOV AH,2
 MOV BH,0
 MOV DH,0
 MOV DL,2
 INT 10H
 MOV AH,2
 MOV DX,30H
 INT 21H
        MOV AH,2
 MOV BH,0
 MOV DH,0
 MOV DL,3
 INT 10H
 MOV AH,2
 MOV DX,30H
 INT 21H
        MOV AH,2
 MOV BH,0
 MOV DH,0
 MOV DL,4
 INT 10H
 MOV AH,2
 MOV DX,30H
 INT 21H

 JMP BG

 TTTT:  JMP RP

 BG:    INC X
 CMP X,400
 JBE CONT1
 MOV X,40
 CONT1: INC Y
 CMP Y,500
 JBE CONT2
 MOV Y,40

 CONT2: CMP S_DIRTIN,1
 JZ S_UP
 CMP S_DIRTIN,2
 JZ S_DOWN
 CMP S_DIRTIN,3
 JZ S_LEFT
 CMP S_DIRTIN,4
 JZ S_RIGHT

 S_UP:  CMP TEMP_DIR,2
 JNZ QUIT1
 MOV S_DIRTIN,2
 JMP S_DOWN
 QUIT1: MOV BX,SPEED        ;延迟
 Y1: MOV CX,10        ;延迟
 X1: LOOP X1
 DEC BX
 JNZ Y1
 DEC S_HEAD_X
 CMP S_HEAD_X,29
 JBE TTTT
 JMP NEXT
 S_DOWN:CMP TEMP_DIR,1
 JNZ QUIT2
 MOV S_DIRTIN,1
 JMP S_UP
 QUIT2: MOV BX,SPEED        ;延迟
 Y2: MOV CX,10        ;延迟
 X2: LOOP X2
 DEC BX
 JNZ Y2
 INC S_HEAD_X
 CMP S_HEAD_X,449
 JAE RP
 JMP NEXT
 S_LEFT:CMP TEMP_DIR,4
 JNZ QUIT3
 MOV S_DIRTIN,4
 JMP S_RIGHT
 QUIT3: MOV BX,SPEED        ;延迟
 Y3: MOV CX,10        ;延迟
 X3: LOOP X3
 DEC BX
 JNZ Y3
 DEC S_HEAD_Y
 CMP S_HEAD_Y,29
 JBE RP
 JMP NEXT
 S_RIGHT:CMP TEMP_DIR,3
  JNZ QUIT4
  MOV S_DIRTIN,3
  JMP S_LEFT
 QUIT4:  MOV BX,SPEED       ;延迟
 Y4:  MOV CX,10       ;延迟
 X4:  LOOP X4
  DEC BX
  JNZ Y4
  INC S_HEAD_Y
  CMP S_HEAD_Y,529
  JAE RP
  JMP NEXT
JMP DDD
 RP:    JMP RP1
 DDD:

 NEXT:  MOV AH,0DH
 MOV BH,0
 MOV DX,S_HEAD_X
 MOV CX,S_HEAD_Y
 INT 10H
 CMP AL,2
 JZ RP
 MOV AH,0DH
 MOV BH,0
 MOV DX,S_HEAD_X
 MOV CX,S_HEAD_Y
 INT 10H
 CMP AL,0CH
 JZ ADDTAIL1
 PHEAD: MOV AH,0CH
 MOV AL,2
 MOV BH,0
 MOV DX,S_HEAD_X
 MOV CX,S_HEAD_Y
 INT 10H

 JMP WWW
 ADDTAIL1:JMP ADDTAIL
 WWW:

 MOV AX,S_TAIL_X
 MOV TEMPX,AX
 MOV AX,S_TAIL_Y
 MOV TEMPY,AX
 DEC S_TAIL_X
 MOV AH,0DH
 MOV BH,0
 MOV DX,S_TAIL_X
 MOV CX,S_TAIL_Y
 INT 10H
 CMP AL,2
 JZ NEXT1
 INC S_TAIL_X
 INC S_TAIL_Y
 MOV AH,0DH
 MOV BH,0
 MOV DX,S_TAIL_X
 MOV CX,S_TAIL_Y
 INT 10H
 CMP AL,2
 JZ NEXT1
 INC S_TAIL_X
 DEC S_TAIL_Y
 MOV AH,0DH
 MOV BH,0
 MOV DX,S_TAIL_X
 MOV CX,S_TAIL_Y
 INT 10H
 CMP AL,2
 JZ NEXT1
 DEC S_TAIL_X
 DEC S_TAIL_Y
 MOV AH,0DH
 MOV BH,0
 MOV DX,S_TAIL_X
 MOV CX,S_TAIL_Y
 INT 10H
 JMP NEXT1

 JMP TTT
 NEXT1: JMP NEXT2
 TTT:

 JMP RRR
 ADDTAIL:CALL DISPNUM
  MOV AX,EGG_X
  MOV EGG_X_D,AX
  ADD EGG_X_D,7
  MOV AX,EGG_Y
  MOV EGG_Y_R,AX
  ADD EGG_Y_R,7
  MOV DX,EGG_X
 ZYX:  MOV CX,EGG_Y
 XYZ:    MOV AH,0CH
  MOV BH,0
  MOV AL,0
  INT 10H
  INC CX
  CMP CX,EGG_Y_R
  JB XYZ
  INC DX
  CMP DX,EGG_X_D
  JB ZYX

 REMOVE: MOV AX,X
  MOV EGG_X,AX
  ADD AX,7
  MOV EGG_X_D,AX
  MOV AX,Y
  MOV EGG_Y,AX
  ADD AX,7
  MOV EGG_Y_R,AX

         MOV DX,EGG_X
 BBA:  MOV CX,EGG_Y
 ABB:    MOV AH,0DH
  MOV BH,0
  INT 10H
  CMP AL,2
  JNZ NEXT4
  ADD X,10
  ADD Y,10
  CMP X,400
  JB REMOVE
  JA ZZZ
  CMP Y,500
  JB REMOVE
 ZZZ:  MOV X,40
  MOV Y,40
  JMP REMOVE
 NEXT4:  INC CX
  CMP CX,EGG_Y_R
  JB ABB
  INC DX
  CMP DX,EGG_X_D
  JB BBA
  MOV AX,X
  MOV EGG_X,AX
  ADD AX,7
  MOV EGG_X_D,AX
  MOV AX,Y
  MOV EGG_Y,AX
  ADD AX,7
  MOV EGG_Y_R,AX
  MOV DX,EGG_X
 HJK:  MOV CX,EGG_Y
 KJH:    MOV AH,0CH
  MOV AL,0CH
  MOV BH,0
  INT 10H
  INC CX
  CMP CX,EGG_Y_R
  JB KJH
  INC DX
  CMP DX,EGG_X_D
  JB HJK
  MOV AH,0CH
  MOV BH,0
  MOV AL,2
  MOV DX,TEMPX
  MOV CX,TEMPY
  INT 10H
  MOV AX,TEMPX
  MOV S_TAIL_X,AX
  MOV AX,TEMPY
  MOV S_TAIL_Y,AX
  JMP PHEAD
 RRR:

 NEXT2: MOV AH,0CH
 MOV AL,0
 MOV BH,0
 MOV DX,TEMPX
 MOV CX,TEMPY
 INT 10H

 MOV AH,S_DIRTIN
 MOV TEMP_DIR,AH
 MOV AH,1
 INT 16H
 JZ BG1
 MOV AH,0   ;取走键盘缓冲区中的内容,以便在以后的循环中INT16的1号功能可以接收字符
 INT 16H
 CMP AH,SUP
 JZ SU
 CMP AH,SDOWN
 JZ SD
 CMP AH,SLEFT
 JZ SL
 CMP AH,SRIGHT
 JZ SR
 CMP AH,SESC
 JZ PAUSE
 JMP BG
 SU:    MOV S_DIRTIN,1
 JMP BG
 SD:    MOV S_DIRTIN,2
 JMP BG
 SL:    MOV S_DIRTIN,3
 JMP BG
 SR:    MOV S_DIRTIN,4
 JMP BG

 PAUSE: MOV DX,29
 MENUB2:MOV CX,539
 MENUB1:MOV AH,0CH
 MOV AL,1
 MOV BH,0
 INT 10H
 INC CX
 CMP CX,629
 JB MENUB1
 ADD DX,100
 CMP DX,130
 JB MENUB2

 JMP BBB
 BG1:   MOV DX,29
 MENUB4:MOV CX,539
 MENUB3:MOV AH,0CH
 MOV AL,0
 MOV BH,0
 INT 10H
 INC CX
 CMP CX,629
 JB MENUB3
 ADD DX,100
 CMP DX,130
 JB MENUB4
 MOV CX,539
 MOV DX,29
 MENUA3:MOV AH,0CH
 MOV AL,0
 MOV BH,0
 INT 10H
 INC DX
 CMP DX,130
 JB MENUA3
 MOV CX,629
 MOV DX,29
 MENUA4:MOV AH,0CH
 MOV AL,0
 MOV BH,0
 INT 10H
 INC DX
 CMP DX,130
 JB MENUA4
 JMP BG
 BBB:

 MOV CX,539
 MOV DX,29
 MENUA1:MOV AH,0CH
 MOV AL,1
 MOV BH,0
 INT 10H
 INC DX
 CMP DX,130
 JB MENUA1
 MOV CX,629
 MOV DX,29
 MENUA2:MOV AH,0CH
 MOV AL,1
 MOV BH,0
 INT 10H
 INC DX
 CMP DX,130
 JB MENUA2
 MOV AH,0
 INT 16H
        CMP AH,SESC
 JZ BG1
 CMP AH,SKEYN
 JZ AGAIN1
; CMP AH,SKEYL
; JZ LOADGAME
; CMP AH,SKEYS
; JZ SAVEGAME
 CMP AH,SKEYQ
 JZ QUIT
 JMP PAUSE

 JMP CCC
 AGAIN1:JMP AGAIN
 CCC:


 RP1:   MOV AH,2
 MOV BH,0
 MOV DH,14
 MOV DL,26
 INT 10H
 MOV AH,9
 MOV DX,OFFSET CHAR
 INT 21H
 ASK: MOV AH,0
 INT 16H
 CMP AL,59H
 JZ AGAIN1
 CMP AL,79H
 JZ AGAIN1
 CMP AL,4EH
 JZ QUIT
 CMP AL,6EH
 JZ QUIT
 JMP ASK
 QUIT:
        MOV AH,0
 MOV AL,3
 INT 10H
 RET
     PROC1 ENDP
     DISPNUM PROC NEAR
 PUSH AX
 PUSH BX
 PUSH CX
 PUSH DX

 INC GEWEI
 CMP GEWEI,9
 JBE DISP
 MOV GEWEI,0
 INC SHIWEI
 CMP SHIWEI,9
 JBE DISP
 MOV SHIWEI,0
 INC BAIWEI
 CMP BAIWEI,9
 JBE DISP
 MOV BAIWEI,0
 INC QIANWEI
 CMP QIANWEI,9
 JBE DISP
 MOV QIANWEI,0
 INC WANWEI
 CMP WANWEI,9
 JBE DISP
 MOV WANWEI,0
 DISP:  MOV AH,2
 MOV BH,0
 MOV DH,0
 MOV DL,0
 INT 10H
 MOV AH,2
 MOV DL,WANWEI
 ADD DL,30H
 INT 21H
        MOV AH,2
 MOV BH,0
 MOV DH,0
 MOV DL,1
 INT 10H
 MOV AH,2
 MOV DL,QIANWEI
 ADD DL,30H
 INT 21H
        MOV AH,2
 MOV BH,0
 MOV DH,0
 MOV DL,2
 INT 10H
 MOV AH,2
 MOV DL,BAIWEI
 ADD DL,30H
 INT 21H
        MOV AH,2
 MOV BH,0
 MOV DH,0
 MOV DL,3
 INT 10H
 MOV AH,2
 MOV DL,SHIWEI
 ADD DL,30H
 INT 21H
        MOV AH,2
 MOV BH,0
 MOV DH,0
 MOV DL,4
 INT 10H
 MOV AH,2
 MOV DL,GEWEI
 ADD DL,30H
 INT 21H

 POP DX
 POP CX
 POP BX
 POP AX

 RET
     DISPNUM ENDP

CODE ENDS
     END START


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值