基于汇编语言实现的贪吃蛇游戏设计
8086 汇编初学之贪吃蛇
前言
一直没想过要去学习汇编,觉得需要用汇编的场合无非三种:
- 与硬件结合很紧密高级语言做不到
- 时空效率要求甚高算法层面已不能优化到
- 逆向破解等只能用某些途径看其汇编指令
其余情况下,用汇编无异于有炮不用偏用鸟枪。
本来准备等自己需求以上场合时再去学,但因为学校举办的汇编比赛,计算机学院都要参加,也算是一个由头,于是开始了我的第一个汇编程序。
运行效果
代码只有 400 行,功能很简略,实现了最基本的游戏流程,看运行效果
概述
本质上用汇编去写一个贪吃蛇和用其他语言去实现没什么区别,不过是换一种方式表达,当然,是一种更加麻烦的方式。
以前用 c++ 实现过 C++ 贪吃蛇和 C++ 俄罗斯方块。所以对于这类小游戏,该怎么切是知道了,剩下的事就是找家伙了。www.biyezuopin.vip
要实现这类简易的小游戏,需要二点:
\1. 定时器
\2. 非阻塞接收按键
有上面两者便可以搞定一切。
但在汇编下,为这两点,耽搁了不少时间。不对,是三点,还有生成随机数(原本很容易的事都变得麻烦了起来)。
定时器
事实上,查了很多资料,但还是不知道怎样去实现定时器,所以这个需求只能变通的解决。
用空循环来控制时间。
非阻塞接受按键
getInput:mov al, 0mov ah, 1int 16h;查看键盘缓冲区是否有数据cmp ah, 1;ah为0表示有,否则没有je getInputEndmov al, 0mov ah, 0int 16h;从缓冲区读取数据;此时值已经在ax里了,做你想做的 getInputEnd:ret
随机数
mov ax, 0h;间隔定时器
out 43h, al;通过端口43h
in al, 40h;
in al, 40h;
in al, 40h;访问3次,保证随机性;如果对范围并不需要精确,可以直接与运算来获得,
;否则,用div取余
mov bl, 18
div bl mov al, ah
mov ah, 0;此时ax的值就是0~18的
代码
assume cs:code,ds:data,ss:stackdata segmentsfood dw 0sdct dw 0sbody dw 400 dup(0)
data endsstack segmentdw 20 dup(0)
stack endscode segmentstart:mov ax, datamov ds, axmov ax, stackmov ss, axmov sp, 20mov ax, 0b800hmov es, axmov si, 4 ;保存数据段偏移量mov cx, 4;初始蛇长度mov ax, 0A04hs:;初始化蛇mov ds:[si], axadd si, 2inc alloop smov ax, 4d00h;向右mov ds:[2], ax;初始化方向call clearBg;清屏call outBg;输出地图边框call outBody;输出蛇call creatFood;输出食物mov cx, 30Game:push cxcall updateBodymov cx, 0Fhaaaa1:push cxmov cx, 0FFFhbbbb:push cxcall getInputpop cxloop bbbbpop cxloop aaaa1;jmp GameEndjmp GameGameEnd: ;退出;call outBodymov ax, 4c00hint 21hupdateBody:mov ax, ds:[2]mov di, sisub di, 2cmp ax, 4800hje shangmov ax, ds:[2]cmp ax, 5000hje xiamov ax, ds:[2]cmp ax, 4b00hje zuomov ax, ds:[2]cmp ax, 4d00hje youshang:mov ax, ds:[di]sub ah, 1jmp checkBodyxia:mov ax, ds:[di]add ah, 1jmp checkBodyzuo:mov ax, ds:[di]sub al, 1jmp checkBodyyou:mov ax, ds:[di]add al, 1;mov ds:[di], axjmp checkBodycheckBody:push ax;判断蛇头是否碰到地图边界cmp ah, 0je GameEndcmp ah, 20je GameEndcmp al, 0je GameEndcmp al, 20je GameEnd;判断蛇头是否碰到蛇身mov cx, sisub cx, 6mov di, 4s0: mov bx, ds:[di]cmp bx, axje GameEndadd di, 2sub cx, 1loop s0pop ax;判断蛇头是否吃到食物mov bx, ds:[0]cmp ax, bxje addBodyjmp updateStartupdateStart:mov cx, sisub cx, 6mov di, 4push axmov dl, ' ';字符mov dh, 0;颜色mov bx, ds:[di]call outStrs5: mov dx, ds:[di+2]mov ds:[di], dxadd di, 2sub cx, 1loop s5mov dl, ' ';字符mov dh, 71h;颜色mov bx, ds:[di]call outStrpop axmov ds:[di], axmov dl, ' ';字符mov dh, 44h;颜色mov bx, ds:[di]call outStrupdateEnd:retaddBody:mov dl, ' ';字符mov dh, 71h;颜色mov bx, ds:[di]call outStrmov ax, ds:[0]mov ds:[si], axmov dl, ' ';字符mov dh, 44h;颜色mov bx, ds:[si]call outStradd si, 2call creatFoodjmp updateEndgetInput:;获取键盘输入mov al, 0mov ah, 1int 16h;接收键盘cmp ah, 1je getInputEndmov al, 0mov ah, 0int 16h;mov cx, ax;键盘值在ax;判断输入cmp cx, 4800hje gshangcmp cx, 5000hje gxiacmp cx, 4b00hje gzuocmp cx, 4d00hje gyoujmp getInputEndgshang:mov ax, ds:[2]cmp ax, 5000hje getInputEndjmp fxgxia:mov ax, ds:[2]cmp ax, 4800hje getInputEndjmp fxgzuo:mov ax, ds:[2]cmp ax, 4d00hje getInputEndjmp fxgyou:mov ax, ds:[2]cmp ax, 4b00hje getInputEndjmp fxfx:;更改方向标志mov ds:[2], cxgetInputEnd:ret;结束outBody:mov cx, sisub cx, 6mov di, 4s1: mov ax, ds:[di]mov dl, ' ';字符mov dh, 71h;颜色mov bl, al;列mov bh, ah;行call outStradd di, 2sub cx, 1loop s1mov dl, ' 'mov dh, 44hmov ax, ds:[di]mov bl, almov bh, ahcall outStrretoutBg:mov dl, ' ';字符mov dh, 71h;颜色mov bl, 0;列mov bh, 0;行mov cx, 20row:push cxpush bxcall outStr;上边界pop bxpush bxadd bh, 20call outStr;下边界pop bxinc bl;列加1pop cxloop rowmov bl, 0;mov bh, 0;mov cx, 21col:push cxpush bxcall outStr;左边界pop bxpush bxadd bl, 20call outStr;右边界pop bxinc bh;行加1pop cxloop colretoutStr: ;在指定位置输出字符mov al, 80mul bh;行乘以80mov bh, 0add bl, bl;add ax, bx;加上列即为偏移量push simov si, axadd si, simov es:[si], dlmov es:[si+1], dhmov es:[si+2], dlmov es:[si+3], dhpop siretcreatFood:;生成食物call getFoodPositionmov dl, ' 'mov dh, 071hmov bx, ds:[0]call outStrretgetFoodPosition:;获取食物位置f1: call getRandmov ds:[0], alcall getRandmov ds:[1], almov cx, sisub cx, 4mov di, 4s11: mov ax, ds:[di]cmp ax, ds:[0]je f1add di, 2sub cx, 1loop s11retgetRand:;获取随机数 范围1~19mov ax, 0h;间隔定时器out 43h, al;通过端口43hin al, 40h;in al, 40h;in al, 40h;访问3次,保证随机性mov bl, 18div bl mov al, ahmov ah, 0inc alretclearBg: ;清屏mov ax, 3hint 10hretcode endsend start
mov di, 4
s11:
mov ax, ds:[di]
cmp ax, ds:[0]je f1add di, 2sub cx, 1loop s11ret
getRand:;获取随机数 范围1~19
mov ax, 0h;间隔定时器
out 43h, al;通过端口43h
in al, 40h;
in al, 40h;
in al, 40h;访问3次,保证随机性mov bl, 18
div bl mov al, ah
mov ah, 0inc alret
clearBg: ;清屏
mov ax, 3h
int 10h
ret
code ends
end start
基于汇编语言实现的贪吃蛇游戏设计相关推荐
- java毕业设计——基于java+J2ME的贪吃蛇游戏设计与实现(毕业论文+程序源码)——贪吃蛇游戏
基于java+J2ME的贪吃蛇游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+J2ME的贪吃蛇游戏设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开题报告P ...
- 基于51单片机的贪吃蛇游戏设计
1绪 论 1.1本课题研究的背景及意义 随着当今社会的发展,人们的生活节奏变得越来越快,人们开始逐渐的融入全球化的世界.人们已经不再局限于一小块天地,加班,出差已经占据了现代人生活的绝大部分.这个时候 ...
- 基于verilog贪吃蛇游戏设计
概述 基于verilog贪吃蛇游戏设计.使用verilog语言 小游戏主要分为以下几个模块:顶层模块.VGA显示模块.蛇身控制模块.苹果控制模块. 系统主要分为顶层模块.VGA显示模块.蛇身控制模块. ...
- c语言贪吃蛇游戏的论文,基于c语言的贪吃蛇游戏论文.doc
基于c语言的贪吃蛇游戏论文 第 PAGE \* Arabic \* MERGEFORMAT 15 页第 PAGE \* Arabic \* MERGEFORMAT 15 页 学校代码 学号 分 类 号 ...
- 【STM32单片机】贪吃蛇游戏设计
文章目录 一.主要功能 二.硬件资源 1.硬件准备 2.硬件连接 四.软件设计 1.软件结构 2.主要代码 五.实验现象 联系作者 一.主要功能 系统运行后,TFTLCD触摸屏显示游戏界面,通过按键任 ...
- 字符版本贪吃蛇游戏设计及算法
字符版本贪吃蛇游戏设计及算法 贪吃蛇,是一款经典的益智游戏.我们可以通过算法捕捉和传递智能,设计出能自动跑着吃食物的智能蛇. 有不少人对此研究,设计出了很棒的算法,如图: 归纳一些比较高级的算法为三类 ...
- 基于linux的贪吃蛇游戏设计_贪吃蛇还能这么玩?绝对是你从未体验过的全新版本(上)...
上个月 Gitee 宣布推出「Python 贪吃蛇魔改大赛」的活动,受到了众多开发者们的欢迎.半个多月后,我们收到了共计 42 个参赛作品,有的作品创意无限,有的作品视觉效果极佳,看看下面的作品一览, ...
- 贪吃蛇游戏设计准备(实验准备)
一.实验目的 1)实现贪吃蛇游戏基本功能,屏幕上随机出现一个"食物",称为豆子,上下左右 控制"蛇"的移动,吃到"豆子"以后"蛇& ...
- 使用C语言gtk编程一个贪吃蛇游戏设计与实现
使用C语言以及gtk编程设计一个贪吃蛇游戏. 功能需求: (1)窗口界面设计:创建各种窗口和按钮标签等: (2)小蛇移动控制:按键盘上的上下左右键控制小蛇上下左右移动: (3)游戏进程控制:若小蛇碰到 ...
最新文章
- 视觉三维重建的关键技术及实现思路汇总
- iOS:自己写的一个星级评价的小Demo
- CentOS安装高版本gcc
- python拆分列表元素_Python将列表拆分为一个元素 - python
- Ext.form.TextArea文本区
- 认证拦截功能需求分析
- 序列化的高阶认识-简单认识一下 Java 原生序列化
- 数据重塑_人工智能能否重塑全球力量平衡?
- 中国石油大学(华东)计算机/软件考研经验分享
- linux打开文件脚本,linux脚本文件实现的功能有哪些剧本用工具打开
- vue 简单实现组件自动注册
- 隆中对,程序员修炼之道,技术学习前进之路
- 千锋逆战1903班Days13上课代码以及笔记
- 惯性动作捕捉之工业设计
- oracle数据库数据传输
- 【图像插值】基于matlab稀疏拉普拉斯滤波器图像插值【含Matlab源码 2055期】
- Internet技巧两则
- 深入hotstuff与pbft协议的核心
- Coding and Paper Letter(四十五)
- php 使用guzzle发送异步的HTTP请求
热门文章
- The last packet sent successfully to the server was 0 milliseconds ago 解决
- C#SharpDevelop如何开发插件详细记录
- 73939133——“我穿越了无数条世界线,却看不到我要的未来”
- 【深入浅出IOS开发】设置图片水印
- 实时车道线检测和智能告警 | 车距 + 弯道 + 车道线
- redis的多路复用原理
- 笔记本式计算机处理器,问答:笔记本电脑如何选择处理器
- 路何去何从-第三方Oracle服务商
- 如果要用运营的姿势,发支付宝红包
- 机器学习-朴素贝叶斯-垃圾邮件