小游戏,汇编小游戏

关于打地鼠游戏的一些说明
开发工具:MASM6.11 和 Virtual PC 2007
开发所在系统:windows 9X
一些难点和思想:
首先,由于这些所有的东西都涉及到了中断操作,所以我们的环境不能搭建在windows7下面,因为这些后面来的系统已经把安全性能提高到了很高的境界,除非你去破解他,否则是没有办法进行实值模式操作的,所以,无奈的,我们只能在98下面进行所有的操作,又因为现在的机子很多都已经不能支撑这么古老的而又让人怀念的系统了,包括驱动,反正我的两台电脑都装不了,一台是根本装不了,另外一台是没有驱动的尴尬,导致键盘不能使用,所以,我们只能选择在虚拟机环境下进行操作了,虽然虚拟机环境下面的操作感变得很差了,但是没办法了,因为我们没有办法找到更好的版本了,这些硬件都太新了,找不到十几年前的驱动是很正常的。
那好,接下在再来说下虚拟机的选择,这里一共有三个虚拟机,一个是vmware,一个是vpc,一个是vbox,第三个基本可以排除在外了,oracle对98的支持很差,开源了也不咋地。另外来说下vmware,这个是我长期使用的虚拟机,但是由于它对98的兼容性主要包括显卡驱动真的没搞好,所以会导致我在测试游戏的时候一顿一卡的,这个我也只能说忍痛割爱了,用上了vpc,vpc确实好多了,在xp下(放弃win7是因为他让我死机了N次,害我代码一直处于丢失状态。),游戏正常运行,这是一件好事。总的来说,工欲善其事,必先利其器。准备工作是非常重要的,不然你会因为前期准备不足而导致后期一直影响你的思路。
开发步骤:
首先,一个游戏要有一个界面,根据打地鼠的游戏常态来看,我们就给他个9个方格,方格之类的就用制表符进行代替,因为98和后来系统的一些词库的问题,导致我的游戏拷贝出来在win7下使用的会出现乱码现在,所以,这里开始我就不再讨论系统问题了,全部放在98下进行测试。
制表符大家可以看这些代码
1 ;//------------------------------------------ 2 3 ShowTheGraph PROC 4 5 ;// 显示场地的函数 6 7 ;//------------------------------------------ 8 9 .data 10 11 str1 byte "┏━━━━━┳━━━━━┳━━━━━┓",0 12 13 str3 byte "┣━━━━━╋━━━━━╋━━━━━┫",0 14 15 str4 byte "┗━━━━━┻━━━━━┻━━━━━┛",0 16 17 18 19 .code 20 21 mov dh,4 22 23 mov dl,20 24 25 call Gotoxy 26 27 mov dx,offset str1 28 29 call writestring 30 31 mov dh,9 32 33 mov dl,20 34 35 call Gotoxy 36 37 mov dx,offset str3 38 39 call WriteString 40 41 mov dh,14 42 43 mov dl,20 44 45 call gotoxy 46 47 mov dx,offset str3 48 49 call writestring 50 51 mov dh,19 52 53 mov dl,20 54 55 call gotoxy 56 57 mov dx,offset str4 58 59 call writestring 60 61 call crlf 62 63 ret 64 65 ShowTheGraph ENDP
如上函数就行进行界面显示的函数了,为了节省资源,我们对其界面显示在整个游戏时间内只进行一次,不然每次用clrscr在show一下,会导致画面延迟卡顿。这样子是跟设计相反的。当画面设计好之后,我们同样要加入两样东西,速度和分数,这是这个游戏非常关键的部分,
1 ;//------------------------------------------ 2 3 ShowTheSCoreAndSpeed PROC 4 5 ;// 显示分数和速度的函数 6 7 ;//------------------------------------------ 8 9 .data 10 11 str5 byte "Speed:",0 12 13 str6 byte "Score:",0 14 15 str7 byte "Hit The Mouse Game",0 16 17 .code 18 19 mov dh,0 20 21 mov dl,29 22 23 call gotoxy 24 25 mov dx,offset str7 26 27 call writestring 28 29 mov dh,2 30 31 mov dl,9 32 33 call gotoxy 34 35 mov dx,offset str6 36 37 call writestring 38 39 mov ax,ScoreOfGame 40 41 call writedec 42 43 mov dh,2 44 45 mov dl,60 46 47 call gotoxy 48 49 mov dx,offset str5 50 51 call writestring 52 53 mov eax,SpeedOfGame 54 55 call writedec 56 57 ret 58 59 ShowTheSCoreAndSpeed ENDP
这里的显示分数和速度的函数在固定位置,每次都进行刷新显示,由于分数会越来越多位,所以我们在这里不进行blank操作,显得没有意义。
好了,接下来我们界面就已经基本搭建好了,那么在接下来就是显示地鼠了,显示地鼠说来简单,就是在每个方格给每个地鼠一个固定的编号,每次显示地鼠函数去匹配那个编号,如果编号相同,那么就把被被隐藏的光标移动到指定位置,然后显示地鼠,如果地鼠在某些时候触发了一些判断语句,那么同样的,会调用一个隐藏地鼠函数,对指定位置的地鼠进行隐藏,他那个样的,代码如下:
1 ;//------------------------------------------ 2 3 ShowTheMouse PROC 4 5 ;// 显示老鼠的函数 6 7 ;//------------------------------------------ 8 9 .data 10 11 str31 byte " ******* ",0 12 13 str32 byte "* + + *",0 14 15 str33 byte "* = *",0 16 17 str34 byte " ******* ",0 18 19 .code 20 21 .IF MouseOfNumber == 0 22 23 mov dh,5 24 25 mov dl,22 26 27 .ENDIF 28 29 .IF MouseOfNumber == 1 30 31 mov dh,5 32 33 mov dl,34 34 35 .ENDIF 36 37 .IF MouseOfNumber == 2 38 39 mov dh,5 40 41 mov dl,45 42 43 .ENDIF 44 45 .IF MouseOfNumber == 3 46 47 mov dh,10 48 49 mov dl,22 50 51 .ENDIF 52 53 .IF MouseOfNumber == 4 54 55 mov dh,10 56 57 mov dl,34 58 59 .ENDIF 60 61 .IF MouseOfNumber == 5 62 63 mov dh,10 64 65 mov dl,45 66 67 .ENDIF 68 69 .IF MouseOfNumber == 6 70 71 mov dh,15 72 73 mov dl,22 74 75 .ENDIF 76 77 .IF MouseOfNumber == 7 78 79 mov dh,15 80 81 mov dl,34 82 83 .ENDIF 84 85 .IF MouseOfNumber == 8 86 87 mov dh,15 88 89 mov dl,45 90 91 .ENDIF 92 93 ;////*****************************show the graph of mouse 94 95 call gotoxy 96 97 push dx 98 99 mov dx,offset str31 100 101 call writestring 102 103 pop dx 104 105 106 107 inc dh 108 109 call gotoxy 110 111 push dx 112 113 mov dx,offset str32 114 115 call writestring 116 117 pop dx 118 119 120 121 inc dh 122 123 call gotoxy 124 125 push dx 126 127 mov dx,offset str33 128 129 call writestring 130 131 pop dx 132 133 134 135 inc dh 136 137 call gotoxy 138 139 push dx 140 141 mov dx,offset str34 142 143 call writestring 144 145 pop dx 146 147 148 149 ;////*****************************END Show the graph of mouse 150 151 152 153 ret 154 155 ShowTheMouse ENDP
1 ;//------------------------------------------ 2 3 HideTheMouse PROC 4 5 ;// 隐藏老鼠的函数 6 7 ;//------------------------------------------ 8 9 .data 10 11 Blank byte " ",0 12 13 .code 14 15 .IF MouseOfNumber == 0 16 17 mov dh,5 18 19 mov dl,22 20 21 .ENDIF 22 23 .IF MouseOfNumber == 1 24 25 mov dh,5 26 27 mov dl,34 28 29 .ENDIF 30 31 .IF MouseOfNumber == 2 32 33 mov dh,5 34 35 mov dl,45 36 37 .ENDIF 38 39 .IF MouseOfNumber == 3 40 41 mov dh,10 42 43 mov dl,22 44 45 .ENDIF 46 47 .IF MouseOfNumber == 4 48 49 mov dh,10 50 51 mov dl,34 52 53 .ENDIF 54 55 .IF MouseOfNumber == 5 56 57 mov dh,10 58 59 mov dl,45 60 61 .ENDIF 62 63 .IF MouseOfNumber == 6 64 65 mov dh,15 66 67 mov dl,22 68 69 .ENDIF 70 71 .IF MouseOfNumber == 7 72 73 mov dh,15 74 75 mov dl,34 76 77 .ENDIF 78 79 .IF MouseOfNumber == 8 80 81 mov dh,15 82 83 mov dl,45 84 85 .ENDIF 86 87 ;////*****************************Hide the graph of mouse 88 89 call gotoxy 90 91 push dx 92 93 mov dx,offset Blank 94 95 call writestring 96 97 pop dx 98 99 100 101 inc dh 102 103 call gotoxy 104 105 push dx 106 107 mov dx,offset Blank 108 109 call writestring 110 111 pop dx 112 113 114 115 inc dh 116 117 call gotoxy 118 119 push dx 120 121 mov dx,offset Blank 122 123 call writestring 124 125 pop dx 126 127 128 129 inc dh 130 131 call gotoxy 132 133 push dx 134 135 mov dx,offset Blank 136 137 call writestring 138 139 pop dx 140 141 142 143 ;////*****************************END Hide the graph of mouse 144 145 ret 146 147 HideTheMouse ENDP
刚才也提到了一个函数,那就是隐藏光标,这里的隐藏光标是用了书上来的一个例子
1 ;//------------------------------------------ 2 3 HideCursor PROC 4 5 ;// 隐藏光标 6 7 ;//------------------------------------------ 8 9 mov ah,3 10 11 int 10h 12 13 or ch,30h 14 15 mov ah,1 16 17 int 10h 18 19 ret 20 21 HideCursor ENDP 22 23 ;//-------------------------------------------------------
红色部分是关键,因为他把光标的大小设置为非法的值,导致了光标没有办法正常显示,这里来进行个扫盲:何为隐藏光标,大家如果正在用word看我的文档,鼠标随便点击下页面,很明显的,是不是可以看到一个闪烁的东西,同样的,在命令行界面下,当你用里面的东西输出一个文本的时候,也是会有光标一直跟随在你的文本后面的,而同样的,我们所说的图形也只不过是用文本填充出来的而已,同样的,再高级的程序,也是这样子出来的,我现在只不过是可以直接接触到他的底层而已。所以还是很有成就感的。所以当你输出完一只地鼠之后,如果看到一个光标猛闪,肯定会印象分大打折扣对不,所以用函数在适当时机,把它隐藏了是必须的。不然就不叫游戏了。
接下来如果地鼠都能正常显示以及隐藏了。最后我们就要进入到游戏的关键部分,随机函数,坐标换算,鼠标捕获等等之类的问题了,待我来为你一一解说:
随机函数,
1 ;//------------------------------------------ 2 3 RendomOfMouse PROC 4 5 ;// 随机出现一个老鼠号码的函数 6 7 ;//------------------------------------------ 8 9 reRendom: 10 11 call randomize 12 13 mov eax,9 14 15 call randomrange 16 17 cmp MouseOfNumber,eax 18 19 je reRendom 20 21 mov MouseOfNumber,eax 22 23 ret 24 25 RendomOfMouse ENDP 26 27 ;//------------------------------------------
随机函数对大家来说应该是没有什么技术含量了,这里就不多做叙说了,只要注意的就是只能产生九个随机数,多的那就说明函数有误了,而且函数必须是真正随机的,不然就导致地鼠重复。
坐标切换:
1 ;//------------------------------------------ 2 3 TranslateTheCoord PROC 4 5 ;// 换算坐标到方格的算法 6 7 ;//------------------------------------------ 8 9 mov PressMouseOfNumber,0 10 11 .IF ((Y_coord >=32) && (Y_coord <=64)) 12 13 add PressMouseOfNumber,0 14 15 .ENDIF 16 17 .IF ((Y_coord >=72) && (Y_coord <=104)) 18 19 add PressMouseOfNumber,3 20 21 .ENDIF 22 23 .IF ((Y_coord >=112) && (Y_coord <=144)) 24 25 add PressMouseOfNumber,6 26 27 .ENDIF 28 29 .IF ((X_coord >= 168) && (X_coord <= 248)) 30 31 add PressMouseOfNumber,0 32 33 .ENDIF 34 35 .IF ((X_coord >= 256) && (X_coord <= 336)) 36 37 add PressMouseOfNumber,1 38 39 .ENDIF 40 41 .IF ((X_coord >= 352) && (X_coord <= 432)) 42 43 add PressMouseOfNumber,2 44 45 .ENDIF 46 47 ret 48 49 TranslateTheCoord ENDP
同理,因为我们鼠标捕获的是一个坐标,是没有办法直接跟地鼠的所在位置进行匹配比较的,所以我们要把它转化成一个可以比较的东西,看图:
小游戏,汇编小游戏
坐标切换可以看上图上是怎么说的,这里就不做过多的诠释了。
鼠标捕获:
;//------------------------------------------ GetMousePress PROC ;// 返回鼠标左键最后按压坐标 ;//------------------------------------------ mov ax,5 mov bx,0 int 33h test ax,1 jz skip ;//左键没有按下就跳这个 mov X_coord,cx mov Y_coord,dx jmp return1 skip: mov X_coord,0 mov X_coord,0 return1: ret GetMousePress ENDP
鼠标捕获是根据当前鼠标缓冲区是否有右键按下,有的话就把鼠标的状态取出来放进指定的临时变量里面,如果没有的话,那么就把鼠标临时临时变量的x_coord和Y_coord全部设置为,这时候根据游戏的判断,如果都为零就判断为没有按键按下,继续循环等待按键循环,如果是已经有了的话,就进行判断是否跟地鼠的坐标一致,这些上面都已经进行完整叙述了。
接下来呢,就是整个程序的运行流程图了:
小游戏,汇编小游戏
接下来是一些测试函数和一些美化函数,大家可以自己看下:
1 ;//------------------------------------------ 2 3 ShowTheCoord PROC 4 5 ;// 显示坐标 6 7 ;//------------------------------------------ 8 9 mov ax,3 10 11 int 33h 12 13 push dx 14 15 mov dh,22 16 17 mov dl,30 18 19 call gotoxy 20 21 pop dx 22 23 mov ax,cx 24 25 call writedec 26 27 push dx 28 29 mov dh,23 30 31 mov dl,35 32 33 call gotoxy 34 35 pop dx 36 37 mov ax,dx 38 39 call writedec 40 41 ret 42 43 ShowTheCoord ENDP
1 ;//------------------------------------------ 2 3 ShowEndScreen PROC 4 5 ;// 显示结尾画面 6 7 ;//------------------------------------------ 8 9 .data 10 11 AllScore byte "You Last Score is:",0 12 13 .code 14 15 call HideCursor 16 17 call clrscr 18 19 mov dh,10 20 21 mov dl,17 22 23 call gotoxy 24 25 mov dx,offset AllScore 26 27 call writestring 28 29 mov ax,ScoreOfGame 30 31 call writedec 32 33 mov eax,10000 34 35 call delay 36 37 call HideCursor 38 39 ret 40 41 ShowEndScreen ENDP
FULL.code:
TITLE The game of Assambly (.asm) ;// This program ;// Last update: INCLUDE Irvine16.inc .data SpeedOfGame dword 0 ScoreOfGame word 0 MouseOfNumber dword 8 PressMouseOfNumber dword ? TheStartTime dword ? X_coord word 0 Y_coord word 0 startgame byte "Press the Mouse Left Key to Start The game",0 madeby byte "Made By :HXH",0 onlyfor byte "Warning:This game is _disibledevent=> mSec DWORD ? .code push ebx push ecx push edx ;// get system time (see Section 13.2.4) mov ah,2Ch int 21h mov hours,ch mov minutes,cl mov seconds,dh mov hhss,dl ;// (mSec = hours * 3600000) movzx eax,hours mov ebx,3600000 mul ebx mov mSec,eax ;// mSec = mSec + (minutes * 60000) movzx eax,minutes mov ebx,60000 mul ebx add mSec,eax ;// mSec = mSec + (seconds * 1000) movzx eax,seconds mov ebx,1000 mul ebx add mSec,eax ;// mSec = mSec + (hundredths * 10) movzx eax,hhss mov ebx,10 mul ebx add mSec,eax ;// Return mSec in EAX mov eax,mSec pop edx pop ecx pop ebx ret GetMseconds ENDP ;//------------------------------------------ GetMousePress PROC ;// 返回鼠标左键最后按压坐标 ;//------------------------------------------ mov ax,5 mov bx,0 int 33h test ax,1 jz skip ;//左键没有按下就跳这个 mov X_coord,cx mov Y_coord,dx jmp return1 skip: mov X_coord,0 mov X_coord,0 return1: ret GetMousePress ENDP ;//------------------------------------------ TranslateTheCoord PROC ;// 换算坐标到方格的算法 ;//------------------------------------------ mov PressMouseOfNumber,0 .IF ((Y_coord >=32) && (Y_coord <=64)) add PressMouseOfNumber,0 .ENDIF .IF ((Y_coord >=72) && (Y_coord <=104)) add PressMouseOfNumber,3 .ENDIF .IF ((Y_coord >=112) && (Y_coord <=144)) add PressMouseOfNumber,6 .ENDIF .IF ((X_coord >= 168) && (X_coord <= 248)) add PressMouseOfNumber,0 .ENDIF .IF ((X_coord >= 256) && (X_coord <= 336)) add PressMouseOfNumber,1 .ENDIF .IF ((X_coord >= 352) && (X_coord <= 432)) add PressMouseOfNumber,2 .ENDIF ret TranslateTheCoord ENDP ;//------------------------------------------ ShowTheCoord PROC ;// 显示坐标 ;//------------------------------------------ mov ax,3 int 33h push dx mov dh,22 mov dl,30 call gotoxy pop dx mov ax,cx call writedec push dx mov dh,23 mov dl,35 call gotoxy pop dx mov ax,dx call writedec ret ShowTheCoord ENDP ;//------------------------------------------ InitScreen PROC call HideCursor ;////------------------Begain init screen ShSt: mov dh,10 mov dl,17 call gotoxy mov dx,offset startgame call writestring mov dh,23 mov dl,62 call gotoxy mov dx,offset madeby call writestring mov dh,0 mov dl,38 call gotoxy mov dx,offset _disibledevent=>
小游戏,汇编小游戏
小游戏,汇编小游戏
小游戏,汇编小游戏
小游戏,汇编小游戏
Tags:  单机小游戏 在线小游戏 3366小游戏 4399小游戏 小游戏

延伸阅读

最新评论

发表评论