按键精灵教程之俄罗斯方块.doc

上传人:sk****8 文档编号:3186494 上传时间:2019-05-24 格式:DOC 页数:11 大小:231.50KB
下载 相关 举报
按键精灵教程之俄罗斯方块.doc_第1页
第1页 / 共11页
按键精灵教程之俄罗斯方块.doc_第2页
第2页 / 共11页
按键精灵教程之俄罗斯方块.doc_第3页
第3页 / 共11页
按键精灵教程之俄罗斯方块.doc_第4页
第4页 / 共11页
按键精灵教程之俄罗斯方块.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

1、前言:喵你们相信按键精灵除了能做游戏辅助脚本外,还能做一个游戏玩玩吗?这是真的吗?小猫告诉你,是真的,编程是无所不能的,只要你敢想,就能实现!游戏下载地址: 喵用按键精灵做的游戏更新至 1.11.0701技术:1.多线程2.窗口句柄工具:按键精灵 8361 的窗口插件mp9999ddd 的多线程互斥锁插件俄罗斯方块百度感谢以上两位高人提供的插件喵。游戏背景图片: 思路:要写一个游戏,必须要对游戏有一定的了解,而不是简简单单的知道怎么玩。现在小猫要写的是俄罗斯方块,那么小猫需要知道以下几个数据:“游戏的边框长短,各个方块的具体形状,每次变形后的形状,得分的算法,游戏的规则。”那怎么获得这些数据呢

2、?对,活用百度谷歌,具体内容看上面的俄罗斯方块百科,已经写的很清楚了,游戏是10x20 大小的,方块有 S、Z、L、J、I、O、T 这 7 种形状,得分的大致算法。OK,游戏的一些大致数据已经收集好了,现在要利用这些数据了。小猫刚开始的时候,是想用 91 的写屏插件,通过清屏和写屏两种功能完成游戏的,后来才发现,这个思路的代码和算法太复杂,于是果断放弃,转为使用 361 的窗口插件,通过创建一个游戏背景区域和多个方块(按钮),然后使用移动窗口和关闭窗口实现方块的移动和消除,而判断方法则是采用判断上下左右句柄得到。正文:首先,我们要创建一个游戏区域,游戏原本是边框 10x20,方块 1x1 的,

3、我们将其放大 30 倍,即变为边框 300x600,方块 30x30,我们还要计算好游戏区域的左上角坐标,在这里,小猫电脑分辨率是 1280x800 的,小猫为了游戏区域在屏幕中间,故设置游戏区域的左上角坐标为 489,99。接着,大家注意找下 361 窗口插件中的“CreateCustomRgn 创建不规则区域”功能,简单的说,这个就是放置一张图片大小的窗口,只不过他会将指定颜色挖空。在这里,我们使用上面那张 300x600 的背景图片,创建这个游戏区域即可。注意,停止脚本的时候,关闭这个窗口1. setGameLeftUpX = 489 : setGameLeftUpY = 992. FK

4、Path=“Attachment:“3. BGPath = “Background.bmp“4. 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.Windo

5、wEx5_01.SetWindowState(HwndArray(i), 0) 10. Next11.End Sub复制代码第二,游戏区域创建好了,现在要创建方块了,大家看下 361 窗口插件中的“CreateButton 创建按钮”功能,我们就用他来创建方块,并得到每个方块的句柄。所有的形状都是由 4 个方块组成,那么我们可以通过一个带参数的子程序来完成创建工作,先从最简单的 O 形方块开始。这个方块的形状是“田”字形的,即 2X2,游戏刚开始的时候,这个方块应该是在游戏区域的正上方中间等待下降的。故他的左上角坐标应该是 609,39,根据一个方块为 30x30 大小,推出其他 3 个方块的

6、坐标,创建 4 个方块窗口,并将这 4 个窗口句柄分别保存起来。1. OO = “609,39,639,39,609,69,639,69“2. 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

7、(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.W

8、indowEx5_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)

9、, 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复制代码第四,现在问题

10、来了,我们发现方块不停的掉下去,不会停止在游戏区域内,怎么办?这里,我们要用到这个功能-GetPointWindow 获得包含了指定点的窗口句柄-它的作用就是得到指定坐标上的窗口句柄。有什么用呢?这样想,我们只要得到四个方块下一格的句柄,如果这个句柄不是方块的句柄也不是游戏背景区域的句柄(这里大家思考下,为什么还要加上不是方块的句柄这个条件),那么我们就可以判断出这个方块已经到达了最底部了。1.2. Function CheckFK()/检查方块的下一格句柄3. Call FKStatic()4. getCheckHwnd1 = getPointHwnd(getFKRect1(2) - 15,

11、 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 getFKHwnd2 and getCheckHwnd1 getFKHwnd4 and g

12、etCheckHwnd1 getFKHwnd1 and getCheckHwnd2 getFKHwnd3 and getCheckHwnd2 MainHwnd Then 12. TracePrint 213. CheckFK = false14. ElseIf getCheckHwnd3 getFKHwnd2 and getCheckHwnd3 getFKHwnd4 and getCheckHwnd3 getFKHwnd1 and getCheckHwnd4 getFKHwnd3 and getCheckHwnd4 MainHwnd Then 18. TracePrint 419. Check

13、FK = false20. Else 21. CheckFK = true22. End If23.End Function复制代码第五,下落问题解决了,这次我们要对方块进行左右移动,既要让方块保持下落,又要让方块左右移动,怎么办?这里就需要用到多线程了,另外,由于每个形状是由 4 个方块组成的,则就意味着,每次移动都要移动 4 个方块,问题来了,如果下落的同时,又左移了,会不会造成混乱呢?比如方块错位之类的。这里有一个知识点,多线程互斥锁,打个比方,有两个线程,一个线程对变量 a 进行自增 1 运算,一个线程对同一个变量 a 进行自减 1 运算,那么 a 的值变化如何?肯定是很混乱的,一会儿

14、加,一会儿减的,这个时候,如果我想让他自增 1 运算 10 次后,再自减 1,怎么办呢?造成混乱的原因就是,两个线程抢着用变量 a,如果当一个线程在使用 a 的时候,另外一个线程无法使用 a,那么这问题不就解决了?这就是线程互斥锁。刚开始的时候,小猫是用环境变量来实现的,后来发现按键精灵的多线程不怎么稳定,哪怕使用了环境变量,还是容易造成方块混乱,于是这里就要用到了 mp9999ddd 的多线程互斥锁插件这个插件。1. Sub MoveFK()/移动方块2. Do3. MoveKey = 04. If SpeedUp = 0 or SpeedUp = 1 Then 5. TracePrint

15、“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. C

16、ase 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, get

17、FKRect2(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(getFKHWn

18、d1, 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

19、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) +

20、 30)50. Call Plugin.WindowEx5_01.MoveWindow(getFKHWnd4, getFKRect4(0), getFKRect4(1) + 30)51.End Sub复制代码第六,现在我们已经把下降和左右移动写好了,现在要写消除代码了,思路很简单,判断一行是不是都为方块,如果是,则消除,并且上面的方块集体下移。如何判断呢?我们通过抓抓获取的句柄可知,方块窗口的类是“361DuButtonClass3”,我们可以通过同一行的窗口的类是不是都为这个,如果是,则消除这一行,并且上面的方块都掉下来,注意一点,这个只要判断当前落下方块的范围下是否一行都是方块即可,顺便把

21、得分算法也写了。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

22、 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 -1 Then

23、 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.G

24、etWindowInfo(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. I

25、f 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 = “361

26、DuButtonClass3“ 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 Sub 53. ElseIf ClearDownHwnd = MainHwnd Then54. ClearStop=ClearStop+155. End If56. Nex

27、t57. Next 58. End If59.End Sub60.复制代码第八,落下,移动,消除,都有了,就差变形了,怎么变呢?小猫通过百度玩了一会儿的俄罗斯方块,才找出每一种的变形规律,基本上是以一个方块为中心,其余方块按照一个方向同时转动。这里要注意,如果转动的位置上,有方块的话,那么就无法变形了。1. Sub ChangeOO()2. Call Plugin.WindowEx5_01.MoveWindow(getFKHWnd1, getFKRect2(0), getFKRect2(1)3. Call Plugin.WindowEx5_01.MoveWindow(getFKHWnd2, getFKRect3(0), getFKRect3(1)4. Call Plugin.WindowEx5_01.MoveWindow(getFKHWnd3, getFKRect4(0), getFKRect4(1)5. Call Plugin.WindowEx5_01.MoveWindow(getFKHWnd4, getFKRect1(0), getFKRect1(1) 6. End Sub复制代码第九,OK,基本功能都完成了,现在要判断游戏的输赢了,很简单,第一块下来后,如果直接遇到了方块句柄,那就表示游戏结束了。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育教学资料库 > 精品笔记

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。