本来这个项目做的方向是贪吃蛇,详见:【汇编语言】贪吃蛇游戏(二)和【汇编语言】贪吃蛇游戏(一)
但是有个大三的学长拜托我帮他做个东西,我就根据我的贪吃蛇v1.0和v1.1改了下。做了一个汇编西邮地图。
先看下效果:
这张是真实地图
这个地图中的黑点就是玩家当前的位置,按wasd可以移动位置。而且只有土黄色的地方可以走,比方说黑点右边是绿色区域,那么按d是没有任何反应的。包括边框,玩家走到最下方还按s,那就不会有任何反应。
放代码:
assume cs : code, ds : data, ss : stack
data segment
pos dw 24 * 160, 104
dire dw 0, 2
data ends
stack segment
db 256 dup(0)
stack ends
code segment
start:
mov ax, data
mov ds, ax
mov ax, stack
mov ss, ax
mov sp, 256
mov ax, 0b800H
mov es, ax
call init
s0:
mov ah, 0
int 16H
cmp al, 'w'
je w
cmp al, 'a'
je a
cmp al, 's'
je s
cmp al, 'd'
je d
cmp al, 'q'
jne s0
mov ax, 4c00H
int 21H
w:
mov dire[0], -160
mov dire[2], 0
jmp move
a:
mov dire[0], 0
mov dire[2], -2
jmp move
s:
mov dire[0], 160
mov dire[2], 0
jmp move
d:
mov dire[0], 0
mov dire[2], 2
jmp move
move:
mov dx, pos[0]
add dx, dire[0]
mov ax, pos[2]
add ax, dire[2]
cmp dx, 0
jl re
cmp dx, 25 * 160
jge re
cmp ax, 0
jl re
cmp ax, 160
jge re
mov si, dx
add si, ax
cmp es : [si], 0010000000000000B
je re
mov pos[0], dx
mov pos[2], ax
mov word ptr es : [bx + di], 0110000000000000B
mov bx, pos[0]
mov di, pos[2]
mov word ptr es : [bx + di], 0000000000000000B
re:
jmp s0
e0:
mov ax, 4c00H
int 21H
init:
push bx
push es
push cx
mov cx, 2000
mov bx, 0
s1:
mov word ptr es : [bx], 0010000000000000B
add bx, 2
loop s1
; 图书馆南边那个从东区能走天桥到西区最西边的路
mov cx, 80
mov bx, 0
s2:
mov word ptr es : [bx + 160 * 10], 0110000000000000B
add bx, 2
loop s2
; 子午大道
mov cx, 25
mov bx, 0 * 160
s3:
mov word ptr es : [52 + bx], 0110000000000000B
add bx, 160
loop s3
; 通往逸夫楼的路
mov cx, 6
mov bx, 10 * 160
s4:
mov word ptr es : [24 + bx], 0110000000000000B
add bx, 160
loop s4
; 逸夫楼南面那条路
mov cx, 5
mov bx, 24
s5:
mov word ptr es : [bx + 160 * 16], 0110000000000000B
add bx, 2
loop s5
; 逸夫楼西面那条路
mov cx, 5
mov bx, 16 * 160
s6:
mov word ptr es : [34 + bx], 0110000000000000B
add bx, 160
loop s6
; 逸夫楼北面那条路
mov cx, 18
mov bx, 0
s7:
mov word ptr es : [bx + 21 * 160], 0110000000000000B
add bx, 2
loop s7
; 东区西门进来的路
mov cx, 8
mov bx, 36
s8:
mov word ptr es : [bx + 18 * 160], 0110000000000000B
add bx, 2
loop s8
; 直达图书馆的路
mov cx, 10
mov bx, 15 * 160
s9:
mov word ptr es : [104 + bx], 0110000000000000B
add bx, 160
loop s9
; 斜着去美光吃饭的路
mov cx, 15
mov bx, 104
mov di, 25 * 160
s10:
mov word ptr es : [bx + di], 0110000000000000B
mov word ptr es : [bx + di - 160], 0110000000000000B
add bx, 2
sub di, 160
loop s10
; 往北直达图书馆的路
mov cx, 11
mov bx, 5 * 160
s11:
mov word ptr es : [120 + bx], 0110000000000000B
add bx, 160
loop s11
; 从西边来图书馆的路
mov cx, 8
mov bx, 104
s12:
mov word ptr es : [bx + 15 * 160], 0110000000000000B
add bx, 2
loop s12
; 旭日苑北边的路和宿舍之间的路
mov cx, 45
mov bx, 70
s13:
mov word ptr es : [bx + 5 * 160], 0110000000000000B
mov word ptr es : [bx + 2 * 160], 0110000000000000B
add bx, 2
loop s13
mov cx, 5
mov bx, 0 * 160
s14:
mov word ptr es : [100 + bx], 0110000000000000B
mov word ptr es : [124 + bx], 0110000000000000B
add bx, 160
loop s14
; 大圆一
mov cx, 5
mov bx, 104
mov di, 23 * 160
s15:
mov word ptr es : [bx + di], 0110000000000000B
mov word ptr es : [bx + di - 2], 0110000000000000B
mov word ptr es : [bx + di - 160 - 2], 0110000000000000B
mov word ptr es : [bx + di - 160 - 4], 0110000000000000B
sub bx, 6
sub di, 160
loop s15
; 大圆二
mov cx, 5
mov bx, 18 * 160
s16:
mov word ptr es : [74 + bx], 1110000000000000B
sub bx, 160
loop s16
; 大圆三
mov cx, 3
mov bx, 13 * 160
mov di, 74
s17:
mov word ptr es : [bx + di], 0110000000000000B
mov word ptr es : [bx + di - 160], 0110000000000000B
add bx, 2
sub di, 160
loop s17
pop cx
pop es
pop bx
ret
code ends
end start
没有任何游戏性。不过也无所谓,我做这个是为了巩固硬件、计组、汇编相关知识。不是为了做出好玩的游戏,为了做出好玩的游戏我直接用前端写,还方便,何必用汇编呢。
不够好看,但其实也无所谓,和上面同样原因。但美化方案我都想好了,判定条件改成不是土黄色就不能往前走,然后给其他地方涂上各种颜色,而不是单一的绿色。
代码过于冗长。这才是要命的地方,代码冗长说明我学得还不够好。
但总的来说我还是很满意的,毕竟这可是大三学生都不一定能做出来的。汇编语言的学习到这里就结束了。重心还是要放到考研上,毕竟我之所以学汇编也是因为考研计组第四章有一定概率出相关题目。