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

📄 car.asm

📁 一个用x86汇编语言编写的模拟赛车游戏。实现了基本的键盘交互和菜单选择
💻 ASM
📖 第 1 页 / 共 2 页
字号:
gdisplay mess7,9,101eh,0f6h
mov ah,0
int 16h

mov dx,old_cs1c
mov ds,old_ip1c
mov ax,251ch
int 21h;恢复原中断向量

mov ah,0
mov al,3
int 10h
mov ax,4c00h
int 21h

nextt1:
jmp end_x1
nextb1:
cmp y1,550
jl nextb2
jmp end_x1
nextb2:
inc yy1
inc yy11
inc yy2
inc yy22
xor cx,cx
mov cl,buspeed
add y1,cx
add y2,cx
mov ah,01
int 16h
jz next
call getchar
next:
jmp loop_x1
end_x1:
ret
cbus1 endp

;第二车道卡车
cbus2 proc near
mov ccur,32
mov xx1,100
mov yy1,80
mov xx2,150
mov yy2,90;左边绿化带初始坐标值
mov xx11,450
mov yy11,80
mov xx22,500
mov yy22,90;右边绿化带初始坐标值
mov x1,260
mov y1,-280
mov x2,340
mov y2,-50;卡车初始坐标值
loop_x2:
push x1
push y1
push x2
push y2
add y1,60
rectangle x1,y1,x2,y2,12
add x1,10
sub y1,80
sub x2,10
sub y2,200
rectangle x1,y1,x2,y2,12
add x1,10
add y1,80
add y2,200
vline x1,y1,y2,12
add x1,20
vline x1,y1,y2,12
add x1,20
vline x1,y1,y2,12
pop y2
pop x2
pop y1
pop x1
call ltree
call rtree
push x1
push y1
push x2
push y2
add y1,60
rectangle x1,y1,x2,y2,12
add x1,10
sub y1,80
sub x2,10
sub y2,200
rectangle x1,y1,x2,y2,12
add x1,10
add y1,80
add y2,200
vline x1,y1,y2,12
add x1,20
vline x1,y1,y2,12
add x1,20
vline x1,y1,y2,12
pop y2
pop x2
pop y1
pop x1
cmp sgin,1
jz c2
jmp nextb12
c2:
mov di,y2
cmp cy1,di
jle d3
jmp nextb12
d3:
mov di,cy2
cmp y1,di;检测是否与卡车碰撞
jle d4
jmp nextb12
d4:
sound 494
daly 4240h,000fh
nosound;发声
call blood;减少生命值

cmp lx1,0;生命值为0吗?
jle b2
jmp nextt2;否,继续
b2:
cscreen 7
gdisplay mess7,9,101eh,0f6h

mov ah,0
int 16h
mov dx,old_cs1c
mov ds,old_ip1c
mov ax,251ch
int 21h;恢复原中断向量

mov ah,0
mov al,3
int 10h
mov ax,4c00h
int 21h

nextt2:
jmp end_x2
nextb12:
cmp y1,550
jl nextb22
jmp end_x2
nextb22:
inc yy1
inc yy11
inc yy2
inc yy22
xor cx,cx
mov cl,buspeed
add y1,cx
add y2,cx
mov ah,01
int 16h
jz next_x2
call getchar
next_x2:
jmp loop_x2
end_x2:
ret
cbus2 endp

;第三车道卡车
cbus3 proc near
mov ccur,42
mov xx1,100
mov yy1,80
mov xx2,150
mov yy2,90;左边绿化带初始坐标值
mov xx11,450
mov yy11,80
mov xx22,500
mov yy22,90;右边绿化带初始坐标值
mov x1,360
mov y1,-280
mov x2,440
mov y2,-50;卡车初始坐标值
loop_x3:
push x1
push y1
push x2
push y2
add y1,60
rectangle x1,y1,x2,y2,12
add x1,10
sub y1,80
sub x2,10
sub y2,200
rectangle x1,y1,x2,y2,12
add x1,10
add y1,80
add y2,200
vline x1,y1,y2,12
add x1,20
vline x1,y1,y2,12
add x1,20
vline x1,y1,y2,12;画卡车
pop y2
pop x2
pop y1
pop x1
call ltree
call rtree
push x1
push y1
push x2
push y2
add y1,60
rectangle x1,y1,x2,y2,12
add x1,10
sub y1,80
sub x2,10
sub y2,200
rectangle x1,y1,x2,y2,12
add x1,10
add y1,80
add y2,200
vline x1,y1,y2,12
add x1,20
vline x1,y1,y2,12
add x1,20
vline x1,y1,y2,12;清除卡车
pop y2
pop x2
pop y1
pop x1
cmp sgin,2
jz c3
jmp nextb13
c3:
mov di,y2
cmp cy1,di
jle d5
jmp nextb13
d5:
mov di,cy2
cmp y1,di;检测是否与卡车碰撞
jle d6
jmp nextb13
d6:
sound 494
daly 4240h,000fh
nosound
call blood

cmp lx1,0
jle b3
jmp  nextt3
b3:
cscreen 7
gdisplay mess7,9,101eh,0f6h
mov ah,0
int 16h

mov dx,old_cs1c
mov ds,old_ip1c
mov ax,251ch
int 21h;恢复原中断向量

mov ah,0
mov al,3
int 10h
mov ax,4c00h
int 21h

nextt3:
jmp end_x3
nextb13:
cmp y1,550
jl nextb23
jmp end_x3

nextb23:
inc yy1
inc yy11
inc yy2
inc yy22
xor cx,cx
mov cl,buspeed
add y1,cx
add y2,cx

mov ah,01
int 16h;检查键盘缓冲区是否有键
jz next3
call getchar;调用按键判断
next3:
jmp loop_x3
end_x3:
ret
cbus3 endp



;按键的判断
getchar proc near
input:
mov ah,0
int 16h;接收一个字符

cmp ah,01;为ESC键吗?
jne nextg1;否,下一步
call stop;是,转退出判断
nextg1:
cmp ah,30h;为B键吗?
jne nextg2
cmp bloodnum,30h;有血可加吗?
jg nextgg3
jmp nextg3
nextgg3:
call rehp
gdisplay bloodnum,1,0e05h,0f3h
dec bloodnum
gdisplay bloodnum,1,0e05h,0f3h
jmp exitg
nextg2:
cmp ah,22h;为G键吗?
jne nextg3
cmp gasnum,30h;有气可加吗?
jle nextg3
gdisplay gasnum,1,1005h,0f6h
call regas
dec gasnum
gdisplay gasnum,1,1005h,0f6h
jmp exitg
nextg3:
cmp ah,4bh;为左方向键吗?
jnz no_left;否,转下一步
cmp sgin,1;当前为1车道吗?
je dd1;是,转dd1处理

cmp sgin,2;当前为2车道吗?
je dd2;是,转dd2处理

jmp exitg

dd1:
mov sgin,0;当前车道标志置0
mov cx1,280
mov cx2,320
call car;清除二车道的车
mov cx1,180
mov cx2,220
call car;画一车道的车
jmp exitg

dd2:
mov sgin,1;当前车道标志置1
mov cx1,380
mov cx2,420
call car;清除三车道的车
mov cx1,280
mov cx2,320
call car;画二车道的车
jmp exitg

no_left:
cmp ah,4dh;为右方向键吗?
jnz no_right;转下一步

cmp sgin,1;当前为2车道吗?
je d11;是,转d11处理

cmp sgin,0;当前为1车道吗?
je d00;是,转d00处理
jmp exitg

d11:
mov sgin,2;当前车道标志置2
mov cx1,280
mov cx2,320
call car;清除二车道的车
mov cx1,380
mov cx2,420
call car;画三车道的车
jmp exitg

d00:
mov sgin,1;当前车道标志置1
mov cx1,180
mov cx2,220
call car;清除一车道的车
mov cx1,280
mov cx2,320
call car;画二车道的车
jmp exitg

no_right:
cmp ah,48h;为向上方向键吗?
jz nrnext;
jmp no_up;否,转下一步
nrnext:
cmp gx1,0;油气值耗尽了吗?
jg a1;没有,继续
jmp exitg;油气耗尽了,不能前进
a1:
call gas
cmp sgin,1;当前为2车道吗?
jne cnext1;否,转下一步
mov cx1,280
mov cx2,320
call car;清除当前位置的小车
sub cy1,carpeed
sub cy2,carpeed;改变小车纵坐标
mov cx1,280
mov cx2,320
call car;重画小车
jmp exitg

cnext1:
cmp sgin,0;当前为1车道吗?
jne cnext2;否,转下一步
mov cx1,180
mov cx2,220
call car;清除当前位置的小车
sub cy1,carpeed
sub cy2,carpeed;改变小车纵坐标
mov cx1,180
mov cx2,220
call car;重画小车
jmp exitg

cnext2:
mov cx1,380
mov cx2,420
call car;清除当前位置的小车
sub cy1,carpeed
sub cy2,carpeed;改变小车纵坐标
mov cx1,380
mov cx2,420
call car;重画小车
jmp exitg

no_up:
cmp ah,50h;为向下方向键吗?
jz nunext
jmp exitg;否,转下一步
nunext:
cmp gx1,0;油气值耗尽了吗?
jg a2;没有,继续
jmp exitg;油气耗尽了,不能前进
a2:
call gas
cmp sgin,1;当前为2车道吗?
jne cnext12
mov cx1,280
mov cx2,320
call car;清除当前位置的小车
add cy1,carpeed
add cy2,carpeed;改变小车纵坐标
mov cx1,280
mov cx2,320
call car;重画小车
jmp exitg

cnext12:
cmp sgin,0;当前为1车道吗?
jne cnext22
mov cx1,180
mov cx2,220
call car;清除当前位置的小车
add cy1,carpeed
add cy2,carpeed;改变小车纵坐标
mov cx1,180
mov cx2,220
call car;重画小车
jmp exitg

cnext22:
mov cx1,380
mov cx2,420
call car;清除当前位置的小车
add cy1,carpeed
add cy2,carpeed;改变小车纵坐标
mov cx1,380
mov cx2,420
call car;重画小车
exitg:
ckbuf
ret
getchar endp

;退出提示
stop proc near
push ax
gdisplay mess1,36,0f14h,0f6h;显示退出消息
mov ah,00
int 16h;接收按键
cmp al,'y';是y键吗?
jne nexts;不是,继续游戏

mov dx,old_cs1c
mov ds,old_ip1c
mov ax,251ch
int 21h;恢复原中断向量

mov ah,0
mov al,3
int 10h;设为文本模式

mov ax,4c00h
int 21h;返回DOS状态
nexts:
gdisplay mess1,36,0f14h,0f6h;清除退出消息
pop ax
ret
stop endp
;***************************
;主过程
;***************************
start:
mov ax,data
mov ds,ax
savevecter 1ch;保存原中断向量
setvecter 1ch,newint1c;设置新中断向量
openint 0feh;设置开中断掩码
mov ah,0
mov al,12h
int 10h;设置640*480,16色图形模式
lea di,gall_ms
cscreen 0f6h
call graphic_text;显示图形模式下的字符
mov ah,0
int 16h;接收按键
cscreen  5;清屏
gdisplay mess0,380,0404,0f7h;显示使用信息
mov ah,0
int 16h;接收按键
begin:
cscreen 7;清屏
gdisplay mess2,2,0203h,0f1h;显示HP
gdisplay mess3,3,0403h,0f6h;显示GAS
gdisplay mess4,1,0e03h,0f3h;
gdisplay mess5,1,1003h,0f6h;
gdisplay gasnum,1,1005h,0f6h
gdisplay bloodnum,1,0e05h,0f3h
rectangle lx1,ly1,lx2,ly2,14;生命值边框
fillrectangle lx1,ly1,lx2,ly2,3;生命值
rectangle gx1,gy1,gx2,gy2,3;油气值边框
fillrectangle gx1,gy1,gx2,gy2,0f6h;油气值
mov lx1,150
mov lx2,170;初始化生命值坐标
mov gx1,150
mov gx2,151;初始化油气值坐标

mov cx1,280
mov cx2,320
call car;画小车
call road;画路
call light;画红绿灯
mov ax,hhh
mov vbufh,ax
mov ax,mmm
mov vbufm,ax
mov ax,sss
mov vbufs,ax
gdisplay vbufh,10,0240h,0f7h
loop_m1:
mov ax,hhh
push ax
cmp ax,vbufh
je next_l1
gdisplay vbufh,2,0240h,0f7h
pop ax
mov vbufh,ax
gdisplay vbufh,2,0240h,0f7h
next_l1:
mov ax,mmm
push ax
cmp ax,vbufm
je next_l2
gdisplay vbufm,2,0244h,0f7h
pop ax
mov vbufm,ax
gdisplay vbufm,2,0244h,0f7h
next_l2:
mov ax,sss
push ax
gdisplay vbufs,2,0248h,0f7h
pop ax
mov vbufs,ax
gdisplay vbufs,2,0248h,0f7h

rand 3;随机车道出现车
cmp ah,0
jg rnext1
call cbus1
jmp rnext3
rnext1:
cmp ah,1
jg rnext2
call cbus2
jmp rnext3
rnext2:
call cbus3
rnext3:
dec times
jz next_m1
mov rcur,0
jmp loop_m1
next_m1:
add buspeed,10
inc pass
cmp pass,39h
jle g1
jmp endgame
g1:
gdisplay mess6,4,1020h,0f3h;显示过关信息
display pass,0f6h,1
mov ah,0
int 16h;任意键继续
gdisplay mess6,4,1020h,0f3h;清除过关信息
display pass,0f6h,1
mov times,10;重设循环变量
gdisplay gasnum,1,1005h,0f6h
gdisplay bloodnum,1,0e05h,0f3h
inc gasnum
inc bloodnum
gdisplay gasnum,1,1005h,0f6h
gdisplay bloodnum,1,0e05h,0f3h
jmp loop_m1
endgame:
cscreen 0ffh
gdisplay mess8,36,1016h,0f3h
gdisplay mess9,19,1620H,0f3h
ckbuf
mov ah,0
int 16h
cmp al,'n'
je n1
mov pass,30h
mov lx1,5
mov ly1,20
mov lx2,150
mov ly2,30
mov gx1,5
mov gy1,50
mov gx2,150
mov gy2,60
jmp begin
n1:
mov dx,old_cs1c
mov ds,old_ip1c
mov ax,251ch
int 21h;恢复原中断向量

mov ah,0
mov al,3
int 10h;设为文本模式

mov ax,4c00h
int 21h;返回DOS状态
main endp
;**************************************************************************
;**************************************************************************
pro_nam ends
end start

⌨️ 快捷键说明

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