题目要求:

1.系统划分:将显示器的屏幕划分成大小相等的左右两个显示窗口,并画出每个显示窗口的边框,窗口大小适中。若左窗口贪吃蛇游戏正在进行时,切换到右窗口执行俄罗斯方块,则贪吃蛇游戏暂停,以后每按一次Tab键切换至旁边显示窗口,从被中断前的地方继续执行。当某个显示窗口被选中时,则光标在该窗口底部闪烁,键盘输入对当前窗口有效。整个系统按ESC键退出,返回DOS操作系统界面。

2.贪吃蛇:在左边显示窗口,能够运行简单的贪吃蛇游戏,即采用键盘按键控制贪吃蛇前进方向,以”W、S、A、D”键分别为上下左右方向控制按键,以贪吃蛇碰触窗口边框或自身为游戏终止条件,游戏终止后显示结束信息并只响应“R”键,以“R”键为游戏重新开始。若游戏进行当中无键按下,则贪吃蛇保持当前方向不变直至撞墙。

3.俄罗斯方块:以“↑”键旋转物块形状,以“←”、“→”键控制物块左右移动,以“↓”控制物块加速。以“Enter”键为俄罗斯方块游戏重新开始。由小方块组成的不同形状的板块陆续从屏幕上方落下来,玩家通过调整板块的位置和方向,使它们在屏幕底部拼出完整的一条或几条。这些完整的横条会随即消失,给新落下来的板块腾出空间,与此同时,玩家得到分数奖励。没有被消除掉的方块不断堆积起来,一旦堆到屏幕顶端,玩家便告输,游戏结束,显示结束信息,并只响应“Enter”键。

需求分析:

1.窗口划分:将80x25的显示窗口划分为左右两个40x25的两个窗口,两个窗口四面皆有一个单位宽的边框。边框单元采用绿色“*”来显示(其16进制数据为022ah,02为绿色,“*”的ascii码16进制为2ah),将其他非窗口边框位置置为空(0000h)。

2.键盘中断:编写自己的键盘中断例程,接收键盘中断扫描码,在扫描码等于ESC键、Tab键、W键、A键、S键、D键、↑键、↓键、←键、→键、Enter键的扫描码时,分别做出相应的动作。在按下其他按键时,不作任何响应。在任何时刻按下ESC键时,退出程序,返回到命令行。按下Tab键时从一个程序切换到另一个程序。W、A、S、D、R键只响应贪吃蛇程序。↑、↓、←、→、Enter键只响应俄罗斯方块程序。

3.任务切换:在按下Tab键后,响应左右两个程序之间相互切换。程序一开始运行左侧的贪吃蛇游戏,左侧窗口右下角边框为闪烁光标,按下Tab键后,贪吃蛇暂停移动。左侧窗口右下角边框变回“*”,使右侧窗口右下角边框变为闪烁光标,示意要运行右侧程序。然后保存按下Tab键之前运行贪吃蛇时的所有寄存器的值和堆栈中的值,去执行右侧俄罗斯方块程序。在俄罗斯方块下落过程中,此时按下Tab键,俄罗斯方块停止下落,右侧窗口右下角边框变回“*”, 左侧窗口右下角边框变为闪烁光标示意要运行左侧程序。然后保存按下Tab键之前运行俄罗斯方块时的所有寄存器的值和堆栈中的值,恢复之前保存的贪吃蛇的所有寄存器的值和堆栈中的值,去接着中断之前的地方执行,显示为贪吃蛇从暂停的地方继续前进。此后按下Tab键后,要做的事均为切换右下角光标,保存一个程序数据,然后恢复另一个程序数据,接着执行被恢复的程序。

4.贪吃蛇:设定每次初始时贪吃蛇由三个单元组成,一个为蛇尾,一个为蛇身,一个为蛇头,默认向右移动。键盘按下W、S、A、D键后,贪吃蛇分别向上、下、左、右转弯,然后默认保持方向移动。但当按键方向与蛇行进方向相反时,不做响应,例如向右移动时,按下A键时不做响应。在蛇吃到一个食物后,得分加10分,以食物作为新的蛇头继续移动,直到撞墙或撞到自己本身后游戏结束。游戏结束后清除左边窗口,显示游戏得分和结束提示信息,此时只能按R键让贪吃蛇重新开始,在贪吃蛇移动过程中也可以按R键来重新开始贪吃蛇游戏。

5.俄罗斯方块:设定所有方块均由四个小块组合而成,可组成五种形式的俄罗斯方块,其他形式均可由这五种形式旋转得来。游戏一开始,在顶部中间位置生成一个俄罗斯方块,然后默认每隔一秒向下移动一行。直到无法向下移动时(其下一行有其他方块或是底部边框),该俄罗斯方块在此位置保留。然后在顶部重新生成一个新的俄罗斯方块,开始下落,如此循环……,直到新生成的俄罗斯方块不能下落(下一行已有其他方块),表示俄罗斯方块已经积累到了顶端,则表示游戏结束。此时清空右边屏幕,显示俄罗斯方块的游戏得分和游戏结束提示信息。此时只响应Enter键来重新开始俄罗斯方块游戏。

在下落过程中的任意时刻,可按下←键、→键、↓键来使俄罗斯方块向左、向右、向下加速移动,直到无法向左、向右、向下移动(俄罗斯最左侧、最右侧、下一行已经有其他方块或边框),若无法左移、右移或下移时,还强制按左键、右键、下键,则不响应此时的按键移动。

在下落过程中的任意时刻,可按↑键来旋转此俄罗斯方块。旋转时,以该俄罗斯方块的最左下角单元为中心,顺时针旋转90度。此最左下角单元的行列坐标取该俄罗斯方块行的最大值、列的最小值。但当该方块旋转后的下一状态中,只要有一个单元已被占用,则表示该方块在此位置已无法旋转,此时按↓键无任何响应。

在任何一个俄罗斯方块到达无法再向下移动位置时,开始从最底部扫描整个俄罗斯方块屏幕,查看是否有一行已被“*”占满,若有,则将该行消除,得分加38(每行38个“*”),然后从最顶部重新扫描。消除动作实质为,将该行的上面一行代替此行,向上重复,用上面一行代替本行,实现消除后该行以上的所有方块向下下落一行。

概要设计:

如上图所示右侧图为整个系统的结构框图,左侧为存储程序相关的“数据段”部分。

详细设计:

1.窗口划分及初始化详细设计

将窗口划分为两个等大的窗口,显示结果为,第一行和和第25行全部为绿色“*”,其他行均为第1、40、41、80列为绿色“*”。其他位置全为空。将左侧窗口右下角边框置为闪烁光标。

其中要想8086汇编在命令行或doxBox显示内容,则需要从段地址为0b800h、段内偏移地址为0000h处开始存放需要显示的具体内容,可以存放4000个字符内容,标准命令行为80行x25列,即可以看见的有2000个字符,每个字符占两个字节,第一个字节为该字符的ASCII码16进制数据,第二个字节为字符显示时的颜色属性,包括背景色、是否下划线、前景字符颜色、是否闪烁。

其中显示窗口为80*25规格,每行占用内存80*2=160 byte=0a0h byte,第一行从段地址为0b800h开始向后偏移存储,那么第二行可以从段地址为0b80ah开始,段地址取值范围:0b800h~ 0b800h+24*0ah,偏移地址取值范围:0~159;

窗口划分与初始化代码如下:

;功能:初始化左边窗口
;参数:无
;返回:无
init_left_window:
push ax
push ds
push cx
push bxmov ax,0b80ah
mov ds,ax;清空左边窗口
mov cx,23
empty_left_window:
mov bx,2
call empty_a_row_in_half_screen
mov ax,ds
add ax,0ah
mov ds,ax
loop empty_left_window;左窗口底角显示闪烁光标
mov bx,78
mov ax,825fh
call setting_designated_unitpop bx
pop cx
pop ds
pop ax
ret;功能:将某一窗口底角单元设置为指定显示形式
;参数:(bx)为该单元在这一行的偏移地址,(ax)为要显示的内容
;返回:无
setting_designated_unit:
push dx
push dsmov dx,0b8f0h
mov ds,dx
mov ds:[bx],axpop ds
pop dx
ret;功能:初始化右边窗口
;参数:无
;返回:无
init_right_window:
push ax
push ds
push cx
push bxmov ax,0b80ah
mov ds,ax;清空右边窗口
mov cx,23
empty_right_window:
mov bx,82
call empty_a_row_in_half_screen
mov ax,ds
add ax,0ah
mov ds,ax
loop empty_right_windowpop bx
pop cx
pop ds
pop ax
ret;功能:将某半边屏幕某一行清空
;参数:ds:[bx]指向该半边屏幕某一行的最左边(非最左边边框)
;返回:无
empty_a_row_in_half_screen:
push cxmov cx,38
_earihs:
mov word ptr ds:[bx],0
add bx,2
loop _earihspop cx
ret;功能:显示所有边框
;参数:无
;返回:无
show_all_frames:
push ax
push ds
push bx
push cxmov ax,0b800h
mov ds,axmov bx,0;显示横向边框
mov ax,2
show_top_and_bottom_frame:
push cx
mov cx,80
show_a_frame:
mov ah,2
mov al,2ah
mov ds:[bx],ax
add bx,2
loop show_a_framemov ax,0b8e6h
mov ds,ax
pop cx
loop show_top_and_bottom_frame;显示纵向边框
mov ax,0b80ah
mov ds,ax
mov cx,23
show_lengthwise_frame:
push cx
mov bx,0;显示某一行最左边边框
mov ax,022ah
mov ds:[bx],ax
add bx,78;显示某一行中间两列边框
mov word ptr ds:[bx],022ah
add bx,2
mov word ptr ds:[bx],022ah
add bx,78;显示某一行最右边边框
mov ax,022ah
mov ds:[bx],ax
add bx,2pop cx
mov ax,ds
add ax,0ah
mov ds,ax
loop show_lengthwise_framepop cx
pop bx
pop ds
pop ax
ret

后续内容请见:汇编语言贪吃蛇、俄罗斯方块双任务设计实现详解(二)——贪吃蛇详细设计

完整代码:https://download.csdn.net/download/gduyt_gduyt/10924302

汇编语言贪吃蛇、俄罗斯方块双任务设计实现详解(一)——整体系统设计相关推荐

  1. 汇编语言贪吃蛇、俄罗斯方块双任务设计实现详解(三)——俄罗斯方块详细设计

    详细设计: 3.俄罗斯方块详细设计:下图所示,左下角为主程序的调用情况,左边上侧和右侧为俄罗斯方块相关数据在teris段中的存储情况 下图所示,左侧为俄罗斯方块具体子程序,右侧为俄罗斯方块程序运行流程 ...

  2. 汇编语言贪吃蛇、俄罗斯方块双任务设计实现详解(二)——贪吃蛇详细设计

    详细设计: 2.贪吃蛇详细设计: 如下图所示左下角为主程序对贪吃蛇相关子程序的调用,程序中init_left_window子程序功能为将左侧窗口非边框部分置为空.左边上侧和右侧是贪吃蛇段中,贪吃蛇程序 ...

  3. C\C++真桌面贪吃蛇,桌面操控,有音乐音效“详解”

    C\C++真桌面贪吃蛇,桌面操控,有音乐音效"详解" 1. 桌面图标贪吃蛇!采用HOOK技术HOOK桌面,可以以桌面为焦点运行贪吃蛇.有背景音乐和音效,采用管道技术,实现音乐音效混 ...

  4. c语言课程设计贪吃蛇报告,贪吃蛇C语言课程设计报告.doc

    贪吃蛇C语言课程设计报告 贪吃蛇游戏设计 姓名: 张力 学号: 完成日期: 月 日 一.设计目的 贪吃蛇游戏程序功能的实现主要是建立在二维数组和图形界面的应用上,通过编写游戏程序能够熟悉掌握相关数组和 ...

  5. C++/QT 贪吃蛇小游戏 界面设计

    C++/QT 贪吃蛇小游戏 界面设计 前言:本文所写的贪吃蛇是笔者初学QT练手的小项目,做出来的界面较为粗糙.由于很久没有接触C++,程序中类封装的不是很规范.写这篇文章,权当是记录生活了,手动狗头. ...

  6. 手机快充芯片及其技术标准和设计原理详解

    手机快充芯片及其技术标准和设计原理详解 智能手机对于宽带无线通信.图像处理等多方面的需求导致实际耗电呈指数增长.未来5G通信带宽将比4G增加10倍,4K/8K等高清视频技术逐渐应用,CPU.GPU等运 ...

  7. 16位汇编语言第二讲系统调用原理,以及各个寄存器详解

    16位汇编语言第二讲系统调用原理,以及各个寄存器详解 昨天已将简单的写了一下汇编代码,并且执行了第一个显示到屏幕的helloworld 问题? helloworld怎么显示出来了. 一丶显卡,显存的概 ...

  8. FPGA串口(UART)通信协议制定与设计思路详解示例

    串口(UART)通信协议制定与设计思路详解 1 概述 本文用于描述规定的串口通信协议,以及传输内容. 2 项目关于串口的要求 a) 支持BIT自检,1路UART上报BIT信息: b) 1路UART接口 ...

  9. pcb设计单点接地示意图_PCB设计接地详解

    PCB设计接地详解 来源:华强电子网 作者:华仔 浏览:432 时间:2016-08-10 14:18 标签: 摘要: 模拟地/数字地以及模拟电源/数字电源只不过是相对的概念.提出这些概念的主要原因是 ...

最新文章

  1. 访问数据库_如何访问虚拟主机中的数据库
  2. 左右上下都能滚动的效果
  3. 安装eAccelerator
  4. 每日一皮:程序员的神逻辑...
  5. 苹果公司有“内鬼”!ID被盗后每条只卖10元钱
  6. Hook技术之Hook Activity
  7. 管理节点连接不上sql节点_质量成本管理:成本控制、成本分析、费用使用流程与节点说明...
  8. 百度SEO站群PHP进销存源码ERP多仓库管理源码
  9. 作业 给计算机编号 winform
  10. (5)Linux进程调度-CFS调度器
  11. Android 中的Intent的某些用法
  12. 微信H5支付跳转问题
  13. Windows中I/O完成端口机制详解
  14. 用c语言编程一个滑稽图案,滑稽,用C语言搞个鼠标连点器
  15. 电商api全境,Python网络爬虫与数据采集
  16. 今日头条信息流 - 橙子建站
  17. EBS 个性化:个性化简介
  18. 用ping让对方电脑堵塞瘫痪
  19. android实现九宫格拼图小游戏
  20. inprivate浏览是什么意思_打开浏览器无痕是什么意思

热门文章

  1. 快速云:超融合基础架构(HCI),低成本改变数据中心
  2. 车载软件日志查看相关命令
  3. 微博php学历限制,微博输入字数限制功能
  4. Site-to-Site VPN配置和调试实践:构建安全的远程网络连接
  5. PipeDream: Generalized Pipeline Parallelism for DNN Training
  6. PCB Stack设计规范
  7. 蓝桥杯大赛 青少年创意编程 第十三届 C++组
  8. 怎么连接PI数据库连接
  9. java读取excel总是有小数点的解决方案
  10. 电源完整性仿真流程梳理