基于80x86汇编实现的双任务管理系统-贪吃蛇小游戏

Gappsong

发布日期: 2019-02-13 17:40:41 浏览量: 362
评分:
star star star star star star star star star_border star_border
*转载请注明来自write-bug.com

一、题目设计

双任务系统设计

二、设计内容

采用8086汇编语言,设计并实现双任务系统设计,对两个任务(两个窗口)进行管理和调度,能够实现任务之间的切换,保存上下文信息。任务调度程序使用循环程序来完成。在左边显示窗口,能够运行简单的贪吃蛇游戏,在右边显示窗口,能够画出等边三角形。

三、需求分析

  • 贪吃蛇游戏采用键盘按键控制贪吃蛇前进方向,如“W、S、A、D”键分别为上下左右方向控制按键

  • 游戏终止条件为贪吃蛇碰触窗口边框、蛇头碰触身体、身体长度达到上限,以“R”键为游戏重新开始。若游戏进行当中无键按下,则贪吃蛇保持当前方向不变直至撞墙

  • 等边三角形位置在该显示区域的中部,参数边长由键盘输入确定

  • 三角形每次根据输入的参数,在该窗口将三角形重新绘制出来

  • 初始工作窗口为右边显示窗口,以后每按一次Tab键切换至旁边显示窗口

  • 当某个显示窗口被选中时,则焦点停留在该窗口,键盘输入对当前窗口有效

  • 整个系统按ESC键退出,返回DOS操作系统界面

四、概要设计

4.1 方案设计

4.2 模块功能说明

4.2.1 I/O模块说明

  • getInt() 读入整数函数:键盘输入一串字符,检测该字符是否为数字字符。若不是数字字符,则做无效处理。直至输入完整的数值字符保存在AX中并将ZF置1(调用者可用JZ判断是否发生特殊情况)。并做如下处理:①若键盘输入Esc键,返回AX=0,并将ZF置0。②若键盘输入Tab键,返回AX=1,并将ZF置0

  • getchar() 函数:输入一个字符,回显

  • puts() 函数:输出字符串

  • getch() 函数:输入一个字符,不回显

  • putInt() 函数:将AX寄存器中的数字以十进制的形式输出

4.2.2 控制模块说明

  • movCursor() 移动光标模块:将光标移动至y行x列

  • sDelay() 延时函数模块:控制贪吃蛇移动速度

  • kbhit() 模块:检测键盘有无输入

  • rand() 随机数发生模块:生成一定范围内的随机数

五、详细设计及运行结果

5.1 流程图

三角形模块流程图

贪吃蛇模块流程图

5.2 函数之间相互调用的图示

函数内部调用图

顶层调用图示

5.3 程序设计主要代码

任务切换

  1. yield proc
  2. pushf ;先保存一下flags
  3. cmp ax,0 ;判断是否是esc
  4. jne yEls1
  5. mov AH, 4CH ;esc exit
  6. int 21h
  7. yEls1:
  8. ;是tab,先在它自己的栈里保存寄存器,
  9. push ax
  10. push bx
  11. push cx
  12. push dx
  13. push di
  14. push si
  15. push bp
  16. ;再切换栈,恢复另一组寄存器
  17. cmp yFunc,0 ;当前是tri?
  18. je yTri
  19. mov stack_snake_sp,sp
  20. mov sp,stack_tri_sp ;当前是1:snake,要切换成tri
  21. mov ax,STACK_RTI
  22. mov ss,ax
  23. mov yFunc,0
  24. jmp yTriEd
  25. yTri:
  26. mov stack_tri_sp,sp
  27. mov sp,stack_snake_sp ;当前是0:tri,要切换成snake
  28. mov ax,STACK_SNAKE
  29. mov ss,ax
  30. mov yFunc,1
  31. ;恢复寄存器
  32. yTriEd:
  33. pop bp
  34. pop si
  35. pop di
  36. pop dx
  37. pop cx
  38. pop bx
  39. pop ax
  40. popf
  41. ret ;切换
  42. yield endp

贪吃蛇移动

  1. sMove proc
  2. pushf
  3. push ax
  4. push bx
  5. push di
  6. mov ah,0
  7. mov al,sbody_move
  8. mov di,ax
  9. ;擦除身体最后一节
  10. shl di,1
  11. mov bl,sbody[di] ;x di*2+0
  12. inc di
  13. mov al,sbody[di] ;y
  14. call movCursor
  15. cmp bl,-1
  16. jz SMEls0
  17. mov al,' '
  18. call putchar
  19. SMEls0:
  20. mov ah,0
  21. mov al,sbody_move
  22. mov bx,ax
  23. mov al,x
  24. mov di,bx
  25. shl di,1
  26. mov sbody[di],al
  27. mov al,y
  28. inc di
  29. mov sbody[di],al
  30. dec sbody_move
  31. cmp sbody_move,0
  32. ja sMElse1 ;手动取余
  33. mov al,blength
  34. mov sbody_move,al
  35. sMElse1:
  36. ;不需要擦除头部
  37. ;switch(m)
  38. cmp m,'s'
  39. je sMCs1
  40. cmp m,'a'
  41. je sMCs2
  42. cmp m,'d'
  43. je sMCs3
  44. cmp m,'w'
  45. je sMCs4
  46. ;case
  47. sMCs1: inc y
  48. jmp SCsEd1
  49. sMCs2: dec x
  50. jmp SCsEd1
  51. sMCs3: inc x
  52. jmp SCsEd1
  53. sMCs4: dec y
  54. jmp SCsEd1
  55. SCsEd1: ;end of switch-case
  56. mov al,y ;重新绘制头部
  57. mov bl,x
  58. call movCursor
  59. mov al,HEAD_CHAR
  60. call putchar
  61. cmp HEAD_CHAR,'#'
  62. jne sMElse2
  63. mov HEAD_CHAR,'*'
  64. jmp sMIfEd2
  65. sMElse2:
  66. mov HEAD_CHAR,'#'
  67. sMIfEd2:
  68. ;移动光标
  69. mov bl,0
  70. mov al,SCY
  71. call movCursor
  72. pop di
  73. pop bx
  74. pop ax
  75. popf
  76. ret
  77. sMove endp

画三角形主要流程

  1. triangle proc near
  2. pushf
  3. push AX
  4. push BX
  5. push CX
  6. push DX
  7. mov triLenth,AX ;记录AX输入的边长
  8. call triHypotenuse ;第一次call画左边
  9. call triHypotenuse ;第二次call画右边
  10. call triBase ;画横线
  11. pop DX
  12. pop CX
  13. pop BX
  14. pop AX
  15. popf
  16. ret

5.4 运行结果

开始界面

输入等边三角形边长

若输入超出范围,清除输入数据并等待重新输入(此处为500)

输入符合规范(此处为200)

按Enter画等边三角形并重新打印提示信息

可循环读入等边三角形边长(此处为80)

按Enter清除右半部分屏幕并重新打印

按Tab键画等边三角形程序停止,贪吃蛇程序开始运行

食物出现在随机位置,用W A S D键控制贪吃蛇运动

若撞墙或碰到自己游戏结束并暂停

游戏过关

按R键重新开始游戏

按Tab键贪吃蛇程序暂停,画等边三角形程序等待输入

六、总结

6.1 不足和改进

  • 不足

    • 贪吃蛇游戏制作的精细度和画面质量有待提高
    • 贪吃蛇的移动速度无法改变
    • 三角形使用整数近似计算
  • 改进

    • 可以通过改变蛇身的样子和食物的颜色来提高画面质量
    • 可以在界面中设置游戏的速度:慢速 中速 高速
    • 三角形可使用浮点数寄存器进行划线

6.2 体会

在本次竞赛学习过程中,项目经过功能划分、肢解分为一层一层的模块调用。将计算机基本指令和中断调用整合起来形成底层模块,再由底层模块整合起来形成较大的功能模块,再由功能模块进行逻辑组合形成snake和tri模块,使用yield任务切换模块作为桥梁将整个程序整合在一起。

在实际操作中我们认识到熟练掌握汇编语言中的指令的基本用法和组织结构的重要性。只有熟练掌握指令的基本用法,我们才能在实际的编程中像运用高级语言一样灵活的变通,认清计算机组织结构才能灵活设计程序整体架构。汇编语言作为一种低级设计语言,它是最底层的、与计算机内部的结构联系密切,我们在这次竞赛过程中深刻地了解到了这一点。

在贪吃蛇程序和画等边三角形的程序设计中,加深了对计算机体系结构的理解,深刻理解汇编语言和其他语言的不同。在代码设计中也遇到很多的困难,比如一些寄存器使用冲突的问题,还有一些宏的使用问题和两个程序切换的问题等,以及如何对程序调用时对参数和返回值做一系列约定。在这个方面,我们深刻理解了团队协作能力的重要性。

上传的附件 cloud_download 基于80x86汇编实现的双任务管理系统-贪吃蛇小游戏.7z ( 4.73mb, 1次下载 )
error_outline 下载需要16点积分

发送私信

风很清澈,从头到脚都快乐

10
文章数
9
评论数
最近文章
eject