突然找到4年前自己写的纯8086汇编语言双人贪食蛇游戏,绝对原创代码纯手打。分享给有需要参考的童鞋!
源码:game1205.asm
可运行文件:GAME1205.EXE ( Windows XP 32bit 环境下测试成功 )
字库文件:HZK24
位图图片:256.bmp
主要涉及以下几大难点:
1,8086汇编语言语法
2,BIOS/DOS系统中断功能调用
3,中断向量表修改与恢复(定时中断)
4,BMP图片的解码与显示
5,汉字库文件的解码与显示
6,贪食蛇游戏数据结构与算法实现
一,调用系统中断切换为VGA256显示模式
- VIDEO equ 0a000h ;VGA256模式下的视频存储区段基址
- setvga macro
- push ax
- mov ah,00h
- mov al,13h
- int 10h ;进入VGA256图形模式
- mov ax,VIDEO ;设置es为段基址
- mov es,ax
- pop ax
- endm
复制代码
切换为VGA256显示模式后,我们的屏幕分辨率为320*200,每个像素都对应内存的一个字节空间。这是后面所有操作的基础。所有的界面效果都是通过操作内存实现!
二,Bmp图片解码与显示
Windows自带画图工具便可创建一张320*200的Bmp图片。Bmp文件格式包括:文件头区,调色板数据区,文件图像区。
三,鼠标上下键选择 单打/双打,按Enter键确定
这里主要完成汉字的显示。可以网上找到 HZK24 汉字库点阵文件(24*24字模)。
汉字区位码与汉字库文件偏移量的 换算式子:72 * ((left - 161)* 94 + right - 161)
;输出中文单个字符函数;主导为24*24字模;参数:[si]:left,right,xxxx,yyyy,color- put_hz proc near
- push ax
- push bx
- push cx
- push dx
- push si
- push di
- ;为读打开文件
- mov ah,3dh
- mov al,0
- mov dx,offset filename
- INT 21H
- mov hzkfile,ax
- jc putexit ;如果打开文件失败,则退出
- ;计算文件指针偏移量
- mov al,[si]
- sub al,161 ;left - 161
- mov dx,94 ;(left - 161)* 94
- mov ah,0
- mul dx ;结果存入dx:ax
- add al,[si+1] ;(left - 161)* 94 + right
- adc ah,0
- adc dx,0
- sub ax,161 ;(left - 161)* 94 + right - 161
- sbb dx,0
- mov bx,dx ;暂存入bx
- ;
- mov cx,WORDSIZE ;24*24字模
- mul cx ;72 * ((left - 161)* 94 + right - 161)
- add dx,bx
- xchg ax,dx
- mov cx,ax ;cx:dx为文件指针位移量
- ;文件指针偏移
- mov ah,42h
- mov al,0 ;从文件头开始偏移
- mov bx,hzkfile
- int 21h
- ;开始边读文件边输出中文
- mov hzkwidth,WORDWIDTH
- nextrow:
- ;读取字模的一行,一次读3个字节;读取后,文件指针自动向后移
- mov ah,3fh
- mov bx,hzkfile
- mov cx,WIDTHBYTE ;一行有3个字节
- mov dx,offset datatemp
- int 21h
-
- ;按照数组输出一行
- mov al,WIDTHBYTE ;一行3个字节
- mov bx,offset datatemp
- nextbyte:
- mov ah,8 ;一个字节有8位
- mov dl,[bx] ;datatemp
- mov di,offset bit
- nextbit:
- test dl,[di] ;bit
- jz nono
- call disp ;显示出来
- nono:
- inc di
- dec ah
- jnz nextbit
- ;
- inc bx
- dec al
- jnz nextbyte
- ;
- dec hzkwidth
- jnz nextrow
- ;
- ;关闭文件
- mov ah,3eh
- mov bx,hzkfile
- int 21h
- pop di
- pop si
- pop dx
- pop cx
- pop bx
- pop ax
- putexit:
- ret
复制代码
四,不同等级代表贪食蛇的移动速度( 菜鸟级/入门级/提高级/大师级/骨灰级 )
五,游戏中两蛇分别计分。撞墙或者相撞,会导致Game Over。
按Enter键暂停游戏,按Esc键退出游戏
---- end ----
|