找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3266|回复: 0
收起左侧

8086汇编双人贪食蛇游戏

[复制链接]
ID:290298 发表于 2018-3-11 09:53 | 显示全部楼层 |阅读模式
突然找到4年前自己写的纯8086汇编语言双人贪食蛇游戏,绝对原创代码纯手打。分享给有需要参考的童鞋!
源码:game1205.asm
可运行文件:GAME1205.EXE ( Windows XP 32bit 环境下测试成功 )

字库文件:HZK24
位图图片:256.bmp


主要涉及以下几大难点:
1,8086汇编语言语法
2,BIOS/DOS系统中断功能调用
3,中断向量表修改与恢复(定时中断)
4,BMP图片的解码与显示
5,汉字库文件的解码与显示
6,贪食蛇游戏数据结构与算法实现
一,调用系统中断切换为VGA256显示模式
  1. VIDEO           equ     0a000h      ;VGA256模式下的视频存储区段基址

  2. setvga          macro
  3.                 push    ax
  4.                 mov     ah,00h
  5.                 mov     al,13h
  6.                 int     10h         ;进入VGA256图形模式
  7.                 mov     ax,VIDEO    ;设置es为段基址
  8.                 mov     es,ax
  9.                 pop     ax
  10.                 endm
复制代码


切换为VGA256显示模式后,我们的屏幕分辨率为320*200,每个像素都对应内存的一个字节空间。这是后面所有操作的基础。所有的界面效果都是通过操作内存实现!
二,Bmp图片解码与显示
20140528221942421.jpg
Windows自带画图工具便可创建一张320*200的Bmp图片。Bmp文件格式包括:文件头区,调色板数据区,文件图像区。
三,鼠标上下键选择 单打/双打,按Enter键确定
20140528222217875.jpg
这里主要完成汉字的显示。可以网上找到 HZK24 汉字库点阵文件(24*24字模)。
汉字区位码与汉字库文件偏移量的 换算式子:72 * ((left - 161)* 94 + right - 161)
;输出中文单个字符函数;主导为24*24字模;参数:[si]:left,right,xxxx,yyyy,color
  1. put_hz          proc    near

  2.                 push    ax
  3.                 push    bx
  4.                 push    cx
  5.                 push    dx
  6.                 push    si
  7.                 push    di

  8.                 ;为读打开文件
  9.                 mov     ah,3dh
  10.                 mov     al,0
  11.                 mov     dx,offset filename
  12.                 INT     21H
  13.                 mov     hzkfile,ax
  14.                 jc      putexit      ;如果打开文件失败,则退出

  15.                 ;计算文件指针偏移量
  16.                 mov     al,[si]
  17.                 sub     al,161       ;left - 161
  18.                 mov     dx,94        ;(left - 161)* 94
  19.                 mov     ah,0
  20.                 mul     dx           ;结果存入dx:ax
  21.                 add     al,[si+1]    ;(left - 161)* 94 + right
  22.                 adc     ah,0
  23.                 adc     dx,0
  24.                 sub     ax,161       ;(left - 161)* 94 + right - 161
  25.                 sbb     dx,0
  26.                 mov     bx,dx        ;暂存入bx
  27.                 ;
  28.                 mov     cx,WORDSIZE  ;24*24字模
  29.                 mul     cx           ;72 * ((left - 161)* 94 + right - 161)
  30.                 add     dx,bx
  31.                 xchg    ax,dx
  32.                 mov     cx,ax         ;cx:dx为文件指针位移量

  33.                 ;文件指针偏移
  34.                 mov     ah,42h
  35.                 mov     al,0          ;从文件头开始偏移
  36.                 mov     bx,hzkfile
  37.                 int     21h

  38.                 ;开始边读文件边输出中文
  39.                 mov     hzkwidth,WORDWIDTH

  40. nextrow:
  41.                 ;读取字模的一行,一次读3个字节;读取后,文件指针自动向后移
  42.                 mov     ah,3fh
  43.                 mov     bx,hzkfile
  44.                 mov     cx,WIDTHBYTE    ;一行有3个字节
  45.                 mov     dx,offset datatemp
  46.                 int     21h
  47.                
  48.                 ;按照数组输出一行
  49.                 mov     al,WIDTHBYTE    ;一行3个字节
  50.                 mov     bx,offset datatemp

  51. nextbyte:
  52.                 mov     ah,8            ;一个字节有8位
  53.                 mov     dl,[bx]         ;datatemp
  54.                 mov     di,offset bit

  55. nextbit:
  56.                 test    dl,[di]                ;bit
  57.                 jz      nono
  58.                 call        disp            ;显示出来

  59. nono:
  60.                 inc     di
  61.                 dec     ah
  62.                 jnz     nextbit
  63.                 ;
  64.                 inc     bx
  65.                 dec     al
  66.                 jnz     nextbyte
  67.                 ;
  68.                 dec     hzkwidth
  69.                 jnz     nextrow
  70.                 ;
  71.                 ;关闭文件
  72.                 mov     ah,3eh
  73.                 mov     bx,hzkfile
  74.                 int     21h

  75.                 pop     di
  76.                 pop     si
  77.                 pop     dx
  78.                 pop     cx
  79.                 pop     bx
  80.                 pop     ax
  81. putexit:
  82.                 ret
复制代码

四,不同等级代表贪食蛇的移动速度( 菜鸟级/入门级/提高级/大师级/骨灰级 )
20140528222323656.jpg
五,游戏中两蛇分别计分。撞墙或者相撞,会导致Game Over。
按Enter键暂停游戏,按Esc键退出游戏
20140528222354109.jpg
---- end ----

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表