按键精灵教程之俄罗斯方块.doc_第1页
按键精灵教程之俄罗斯方块.doc_第2页
按键精灵教程之俄罗斯方块.doc_第3页
按键精灵教程之俄罗斯方块.doc_第4页
按键精灵教程之俄罗斯方块.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

前言:喵你们相信按键精灵除了能做游戏辅助脚本外,还能做一个游戏玩玩吗?这是真的吗?小猫告诉你,是真的,编程是无所不能的,只要你敢想,就能实现!游戏下载地址:喵用按键精灵做的游戏更新至1.11.0701技术:1.多线程2.窗口句柄工具:按键精灵8361的窗口插件mp9999ddd的多线程互斥锁插件俄罗斯方块百度感谢以上两位高人提供的插件喵。游戏背景图片: 2011-8-4 22:14 上传下载附件 (527.4 KB) 思路: 要写一个游戏,必须要对游戏有一定的了解,而不是简简单单的知道怎么玩。现在小猫要写的是俄罗斯方块,那么小猫需要知道以下几个数据:“游戏的边框长短,各个方块的具体形状,每次变形后的形状,得分的算法,游戏的规则。”那怎么获得这些数据呢?对,活用百度谷歌,具体内容看上面的俄罗斯方块百科,已经写的很清楚了,游戏是10x20大小的,方块有S、Z、L、J、I、O、T这7种形状,得分的大致算法。OK,游戏的一些大致数据已经收集好了,现在要利用这些数据了。 小猫刚开始的时候,是想用91的写屏插件,通过清屏和写屏两种功能完成游戏的,后来才发现,这个思路的代码和算法太复杂,于是果断放弃,转为使用361的窗口插件,通过创建一个游戏背景区域和多个方块(按钮),然后使用移动窗口和关闭窗口实现方块的移动和消除,而判断方法则是采用判断上下左右句柄得到。正文: 首先,我们要创建一个游戏区域,游戏原本是边框10x20,方块1x1的,我们将其放大30倍,即变为边框300x600,方块30x30,我们还要计算好游戏区域的左上角坐标,在这里,小猫电脑分辨率是1280x800的,小猫为了游戏区域在屏幕中间,故设置游戏区域的左上角坐标为489,99。接着,大家注意找下361窗口插件中的“CreateCustomRgn 创建不规则区域”功能,简单的说,这个就是放置一张图片大小的窗口,只不过他会将指定颜色挖空。在这里,我们使用上面那张300x600的背景图片,创建这个游戏区域即可。注意,停止脚本的时候,关闭这个窗口1. setGameLeftUpX = 489 : setGameLeftUpY = 992. FKPath=Attachment:3. BGPath = Background.bmp4. MainHwnd = Plugin.WindowEx5_01.CreateCustomRgn(0, setGameLeftUpX, setGameLeftUpY, FKPath & BGPath, FF00FF)5.6. Sub OnScriptExit() 7. HwndArray=Plugin.WindowEx5_01.EnumWindowA(0,0,361Du*Class3,2)8. For i = 0 To UBound(HwndArray)9. Call Plugin.WindowEx5_01.SetWindowState(HwndArray(i), 0) 10. Next11. End Sub复制代码 第二,游戏区域创建好了,现在要创建方块了,大家看下361窗口插件中的“CreateButton 创建按钮”功能,我们就用他来创建方块,并得到每个方块的句柄。所有的形状都是由4个方块组成,那么我们可以通过一个带参数的子程序来完成创建工作,先从最简单的O形方块开始。这个方块的形状是“田”字形的,即2X2,游戏刚开始的时候,这个方块应该是在游戏区域的正上方中间等待下降的。故他的左上角坐标应该是609,39,根据一个方块为30x30大小,推出其他3个方块的坐标,创建4个方块窗口,并将这4个窗口句柄分别保存起来。1. OO = 609,39,639,39,609,69,639,692. Call Create(OO)3.4. Sub Create(FKZuoBiao)5. TracePrint 创建方块6. CreateZB = Split(FKZuoBiao, ,) 7. getFKHWnd1 = getCreateFK(CreateZB(0), CreateZB(1)8. getFKHWnd2 = getCreateFK(CreateZB(2), CreateZB(3)9. getFKHWnd3 = getCreateFK(CreateZB(4), CreateZB(5)10. getFKHWnd4 = getCreateFK(CreateZB(6), CreateZB(7)11. End Sub复制代码 第三,现在游戏背景和O形方块都创建好了,我们先要让他自动落下,怎么弄呢?很简单,每隔一段时间,获取四个方块窗口的当前坐标,然后依次向下移动一次,一次是移动30个像素,对吧?OK,子程序代码如下:1.2. Sub FKStatic()3. getFKRect1 = Plugin.WindowEx5_01.GetWindowInfo(getFKHWnd1, 2)4. getFKRect2 = Plugin.WindowEx5_01.GetWindowInfo(getFKHWnd2, 2)5. getFKRect3 = Plugin.WindowEx5_01.GetWindowInfo(getFKHWnd3, 2) 6. getFKRect4 = Plugin.WindowEx5_01.GetWindowInfo(getFKHWnd4, 2) 7. End Sub8.9. Sub FallFK()10. TracePrint 下落11. Call FKStatic()12. Call Plugin.WindowEx5_01.MoveWindow(getFKHWnd1, getFKRect1(0), getFKRect1(1) + 30)13. Call Plugin.WindowEx5_01.MoveWindow(getFKHWnd2, getFKRect2(0), getFKRect2(1) + 30)14. Call Plugin.WindowEx5_01.MoveWindow(getFKHWnd3, getFKRect3(0), getFKRect3(1) + 30)15. Call Plugin.WindowEx5_01.MoveWindow(getFKHWnd4, getFKRect4(0), getFKRect4(1) + 30)16. End Sub复制代码 第四,现在问题来了,我们发现方块不停的掉下去,不会停止在游戏区域内,怎么办?这里,我们要用到这个功能-GetPointWindow 获得包含了指定点的窗口句柄-它的作用就是得到指定坐标上的窗口句柄。有什么用呢?这样想,我们只要得到四个方块下一格的句柄,如果这个句柄不是方块的句柄也不是游戏背景区域的句柄(这里大家思考下,为什么还要加上不是方块的句柄这个条件),那么我们就可以判断出这个方块已经到达了最底部了。1.2. Function CheckFK()/检查方块的下一格句柄3. Call FKStatic()4. getCheckHwnd1 = getPointHwnd(getFKRect1(2) - 15, getFKRect1(3) + 15)5. getCheckHwnd2 = getPointHwnd(getFKRect2(2) - 15, getFKRect2(3) + 15) 6. getCheckHwnd3 = getPointHwnd(getFKRect3(2) - 15, getFKRect3(3) + 15) 7. getCheckHwnd4 = getPointHwnd(getFKRect4(2) - 15, getFKRect4(3) + 15)8. If getCheckHwnd1 getFKHwnd1 and getCheckHwnd1 getFKHwnd2 and getCheckHwnd1 getFKHwnd3 and getCheckHwnd1 getFKHwnd4 and getCheckHwnd1 MainHwnd Then 9. TracePrint 110. CheckFK = false11. ElseIf getCheckHwnd2 getFKHwnd1 and getCheckHwnd2 getFKHwnd2 and getCheckHwnd2 getFKHwnd3 and getCheckHwnd2 getFKHwnd4 and getCheckHwnd2 MainHwnd Then 12. TracePrint 213. CheckFK = false14. ElseIf getCheckHwnd3 getFKHwnd1 and getCheckHwnd3 getFKHwnd2 and getCheckHwnd3 getFKHwnd3 and getCheckHwnd3 getFKHwnd4 and getCheckHwnd3 MainHwnd Then 15. TracePrint 316. CheckFK = false17. ElseIf getCheckHwnd4 getFKHwnd1 and getCheckHwnd4 getFKHwnd2 and getCheckHwnd4 getFKHwnd3 and getCheckHwnd4 getFKHwnd4 and getCheckHwnd4 MainHwnd Then 18. TracePrint 419. CheckFK = false20. Else 21. CheckFK = true22. End If23. End Function复制代码 第五,下落问题解决了,这次我们要对方块进行左右移动,既要让方块保持下落,又要让方块左右移动,怎么办?这里就需要用到多线程了,另外,由于每个形状是由4个方块组成的,则就意味着,每次移动都要移动4个方块,问题来了,如果下落的同时,又左移了,会不会造成混乱呢?比如方块错位之类的。这里有一个知识点,多线程互斥锁,打个比方,有两个线程,一个线程对变量a进行自增1运算,一个线程对同一个变量a进行自减1运算,那么a的值变化如何?肯定是很混乱的,一会儿加,一会儿减的,这个时候,如果我想让他自增1运算10次后,再自减1,怎么办呢?造成混乱的原因就是,两个线程抢着用变量a,如果当一个线程在使用a的时候,另外一个线程无法使用a,那么这问题不就解决了?这就是线程互斥锁。刚开始的时候,小猫是用环境变量来实现的,后来发现按键精灵的多线程不怎么稳定,哪怕使用了环境变量,还是容易造成方块混乱,于是这里就要用到了mp9999ddd的多线程互斥锁插件这个插件。1. Sub MoveFK()/移动方块2. Do3. MoveKey = 04. If SpeedUp = 0 or SpeedUp = 1 Then 5. TracePrint SpeedUp & SpeedUp6. MoveKey = WaitKey()7. Call Plugin.jcqm.jMutexLock(Lock)8. TracePrint 移动9. Select Case MoveKey10. Case 3711. getCheckFK = CheckFK()12. If getCheckFK Then13. Call MoveLeft()14. End If15. Case 3916. getCheckFK = CheckFK()17. If getCheckFK Then 18. Call MoveRight()19. End If20. Case 3821. Call Change()22. End Select23. Call Plugin.jcqm.jMutexUnLock(Lock)24. Delay 5025. End If26. Loop 27. End Sub28.29. Sub MoveLeft()/左移30. Call FKStatic()31. Call Plugin.WindowEx5_01.MoveWindow(getFKHWnd1, getFKRect1(0) - 30, getFKRect1(1) 32. Call Plugin.WindowEx5_01.MoveWindow(getFKHWnd2, getFKRect2(0) - 30, getFKRect2(1)33. Call Plugin.WindowEx5_01.MoveWindow(getFKHWnd3, getFKRect3(0) - 30, getFKRect3(1)34. Call Plugin.WindowEx5_01.MoveWindow(getFKHWnd4, getFKRect4(0) - 30, getFKRect4(1)35. End Sub36.37. Sub MoveRight()右移38. Call FKStatic()39. Call Plugin.WindowEx5_01.MoveWindow(getFKHWnd1, getFKRect1(0) + 30, getFKRect1(1) 40. Call Plugin.WindowEx5_01.MoveWindow(getFKHWnd2, getFKRect2(0) + 30, getFKRect2(1)41. Call Plugin.WindowEx5_01.MoveWindow(getFKHWnd3, getFKRect3(0) + 30, getFKRect3(1)42. Call Plugin.WindowEx5_01.MoveWindow(getFKHWnd4, getFKRect4(0) + 30, getFKRect4(1)43. End Sub44.45. Sub MoveDown()/下降46. Call FKStatic()47. Call Plugin.WindowEx5_01.MoveWindow(getFKHWnd1, getFKRect1(0), getFKRect1(1) + 30) 48. Call Plugin.WindowEx5_01.MoveWindow(getFKHWnd2, getFKRect2(0), getFKRect2(1) + 30)49. Call Plugin.WindowEx5_01.MoveWindow(getFKHWnd3, getFKRect3(0), getFKRect3(1) + 30)50. Call Plugin.WindowEx5_01.MoveWindow(getFKHWnd4, getFKRect4(0), getFKRect4(1) + 30)51. End Sub复制代码 第六,现在我们已经把下降和左右移动写好了,现在要写消除代码了,思路很简单,判断一行是不是都为方块,如果是,则消除,并且上面的方块集体下移。如何判断呢?我们通过抓抓获取的句柄可知,方块窗口的类是“361DuButtonClass3”,我们可以通过同一行的窗口的类是不是都为这个,如果是,则消除这一行,并且上面的方块都掉下来,注意一点,这个只要判断当前落下方块的范围下是否一行都是方块即可,顺便把得分算法也写了。1.2. Sub ClearFKLine()3. TracePrint 消除4. Call FKStatic()5. ScoreExp = -1 6. MinToMaxArr = Array(getFKRect1(1), getFKRect2(1), getFKRect3(1), getFKRect4(1)7. MinToMax = lib.算法.结构数组排序(MinToMaxArr,0)8. FKMinToMaxY = 数组去重(split(MinToMax, )9. For CheckFKLineJ = 0 To UBound(FKMinToMaxY)10. If CheckFKLine(FKMinToMaxY(CheckFKLineJ) Then11. For UnCreateI = 1 To 1012. Call UnCreate(CheckFKLineHwndArr(UnCreateI)13. Next14. Call ClearDown(FKMinToMaxY(CheckFKLineJ)15. ScoreExp = ScoreExp + 116. ClearRow = ClearRow + 1 17. End If18. Next19. LEv*l = Int(ClearRow / 20) + 1 20. If ScoreExp -1Then 21. getScore = (2 ScoreExp) * 10 * LEv*l 22. Score = Score + getScore23. End If24. End Sub25.26. Function CheckFKLine(CheckFKLineY)27. For CheckFKLineI = 1 To 1028. CheckFKLineHwndArr(CheckFkLineI) = getPointHwnd(489 + 30 * CheckFKLineI - 15, CheckFKLineY + 15)29. CheckFKClass = Plugin.WindowEx5_01.GetWindowInfo(CheckFKLineHwndArr(CheckFkLineI), 1) 30. If CheckFKClass = 361DuButtonClass3 Then 31. CheckFKLine = True32. Else 33. CheckFKLine = false34. Exit For35. End If36. Next37. End Function38.39. Sub ClearDown(ClearDownY)40. ClearDownNum = (ClearDownY - 99) / 3041. TracePrint ClearDownNum42. If ClearDownNum 0 Then 43. For ClearDownI = 1 To ClearDownNum44. ClearStop = 0 45. For ClearDownJ = 1 To 1046. ClearDownHwnd = getPointHwnd(489 + 30 * ClearDownJ - 15, ClearDownY - 30 * ClearDownI + 15)47. ClearDownClass = Plugin.WindowEx5_01.GetWindowInfo(ClearDownHwnd,1)48. If ClearDownClass = 361DuButtonClass3 Then 49. getCDRect = Plugin.WindowEx5_01.GetWindowInfo(ClearDownHwnd, 2)50. Call Plugin.WindowEx5_01.MoveWindow(ClearDownHwnd, getCDRect(0), getCDRect(1) + 30)51. ElseIf ClearStop = 10 Then52. Exit Sub53. ElseIf ClearDownHwnd = MainHwnd Then54. ClearStop=ClearStop+155. End If56. Next57. Next 58. End If59. End Sub60.复制代码 第八,落下,移动,消除,都有了,就差变形了,怎么变呢?小猫通过百度

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论