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

上传人:b****5 文档编号:8278180 上传时间:2023-01-30 格式:DOCX 页数:12 大小:91.31KB
下载 相关 举报
按键精灵教程之俄罗斯方块.docx_第1页
第1页 / 共12页
按键精灵教程之俄罗斯方块.docx_第2页
第2页 / 共12页
按键精灵教程之俄罗斯方块.docx_第3页
第3页 / 共12页
按键精灵教程之俄罗斯方块.docx_第4页
第4页 / 共12页
按键精灵教程之俄罗斯方块.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

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

《按键精灵教程之俄罗斯方块.docx》由会员分享,可在线阅读,更多相关《按键精灵教程之俄罗斯方块.docx(12页珍藏版)》请在冰豆网上搜索。

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

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

前言:

喵~你们相信按键精灵除了能做游戏辅助脚本外,还能做一个游戏玩玩吗?

这是真的吗?

小猫告诉你,是真的,编程是无所不能的,只要你敢想,就能实现!

游戏下载地址:

喵~用按键精灵做的<俄罗斯方块>游戏~[更新至1.11.0701]

技术:

1.多线程

2.窗口句柄

工具:

按键精灵8

361的窗口插件

mp9999ddd的多线程互斥锁插件

俄罗斯方块XX

感谢以上两位高人提供的插件喵。

游戏背景图片:

2011-8-422:

14上传

下载附件(527.4KB)

思路:

 要写一个游戏,必须要对游戏有一定的了解,而不是简简单单的知道怎么玩。

现在小猫要写的是俄罗斯方块,那么小猫需要知道以下几个数据:

“游戏的边框长短,各个方块的具体形状,每次变形后的形状,得分的算法,游戏的规则。

”那怎么获得这些数据呢?

对,活用XX谷歌,具体内容看上面的俄罗斯方块百科,已经写的很清楚了,游戏是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=99

2.FKPath="Attachment:

\"

3.BGPath="Background.bmp"

4.MainHwnd=Plugin.WindowEx5_01.CreateCustomRgn(0,setGameLeftUpX,setGameLeftUpY,FKPath&BGPath,"FF00FF")

5.

6.SubOnScriptExit()  

7.  HwndArray=Plugin.WindowEx5_01.EnumWindowA(0,0,"361Du*Class3",2)

8.  Fori=0ToUBound(HwndArray)

9.      CallPlugin.WindowEx5_01.SetWindowState(HwndArray(i),0)          

10.  Next

11.EndSub

复制代码

   第二,游戏区域创建好了,现在要创建方块了,大家看下361窗口插件中的“CreateButton创建按钮”功能,我们就用他来创建方块,并得到每个方块的句柄。

所有的形状都是由4个方块组成,那么我们可以通过一个带参数的子程序来完成创建工作,先从最简单的O形方块开始。

这个方块的形状是“田”字形的,即2X2,游戏刚开始的时候,这个方块应该是在游戏区域的正上方中间等待下降的。

故他的左上角坐标应该是609,39,根据一个方块为30x30大小,推出其他3个方块的坐标,创建4个方块窗口,并将这4个窗口句柄分别保存起来。

1.OO="609,39,639,39,609,69,639,69"

2.CallCreate(OO)

3.

4.SubCreate(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.EndSub

复制代码

   第三,现在游戏背景和O形方块都创建好了,我们先要让他自动落下,怎么弄呢?

很简单,每隔一段时间,获取四个方块窗口的当前坐标,然后依次向下移动一次,一次是移动30个像素,对吧?

OK,子程序代码如下:

1.

2.SubFKStatic()

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.EndSub

8.

9.SubFallFK()

10.  TracePrint"下落"

11.  CallFKStatic()

12.  CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd1,getFKRect1(0),getFKRect1

(1)+30)

13.  CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd2,getFKRect2(0),getFKRect2

(1)+30)

14.  CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd3,getFKRect3(0),getFKRect3

(1)+30)

15.  CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd4,getFKRect4(0),getFKRect4

(1)+30)

16.EndSub

复制代码

   第四,现在问题来了,我们发现方块不停的掉下去,不会停止在游戏区域内,怎么办?

这里,我们要用到这个功能--GetPointWindow获得包含了指定点的窗口句柄--它的作用就是得到指定坐标上的窗口句柄。

有什么用呢?

这样想,我们只要得到四个方块下一格的句柄,如果这个句柄不是方块的句柄也不是游戏背景区域的句柄(这里大家思考下,为什么还要加上不是方块的句柄这个条件),那么我们就可以判断出这个方块已经到达了最底部了。

1.

2.FunctionCheckFK()//检查方块的下一格句柄

3.     CallFKStatic()

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.      IfgetCheckHwnd1<>getFKHwnd1andgetCheckHwnd1<>getFKHwnd2andgetCheckHwnd1<>getFKHwnd3andgetCheckHwnd1<>getFKHwnd4andgetCheckHwnd1<>MainHwndThen

9.        TracePrint1

10.        CheckFK=false

11.      ElseIfgetCheckHwnd2<>getFKHwnd1andgetCheckHwnd2<>getFKHwnd2andgetCheckHwnd2<>getFKHwnd3andgetCheckHwnd2<>getFKHwnd4andgetCheckHwnd2<>MainHwndThen

12.        TracePrint2

13.        CheckFK=false

14.      ElseIfgetCheckHwnd3<>getFKHwnd1andgetCheckHwnd3<>getFKHwnd2andgetCheckHwnd3<>getFKHwnd3andgetCheckHwnd3<>getFKHwnd4andgetCheckHwnd3<>MainHwndThen

15.        TracePrint3

16.        CheckFK=false

17.      ElseIfgetCheckHwnd4<>getFKHwnd1andgetCheckHwnd4<>getFKHwnd2andgetCheckHwnd4<>getFKHwnd3andgetCheckHwnd4<>getFKHwnd4andgetCheckHwnd4<>MainHwndThen

18.        TracePrint4

19.        CheckFK=false

20.      Else

21.        CheckFK=true

22.      EndIf

23.EndFunction

复制代码

   第五,下落问题解决了,这次我们要对方块进行左右移动,既要让方块保持下落,又要让方块左右移动,怎么办?

这里就需要用到多线程了,另外,由于每个形状是由4个方块组成的,则就意味着,每次移动都要移动4个方块,问题来了,如果下落的同时,又左移了,会不会造成混乱呢?

比如方块错位之类的。

这里有一个知识点,多线程互斥锁,打个比方,有两个线程,一个线程对变量a进行自增1运算,一个线程对同一个变量a进行自减1运算,那么a的值变化如何?

肯定是很混乱的,一会儿加,一会儿减的,这个时候,如果我想让他自增1运算10次后,再自减1,怎么办呢?

造成混乱的原因就是,两个线程抢着用变量a,如果当一个线程在使用a的时候,另外一个线程无法使用a,那么这问题不就解决了?

这就是线程互斥锁。

刚开始的时候,小猫是用环境变量来实现的,后来发现按键精灵的多线程不怎么稳定,哪怕使用了环境变量,还是容易造成方块混乱,于是这里就要用到了mp9999ddd的多线程互斥锁插件这个插件。

1.SubMoveFK()//移动方块

2. Do

3.      MoveKey=0

4.      IfSpeedUp=0orSpeedUp=1Then

5.        TracePrint"SpeedUp  "&SpeedUp

6.        MoveKey=WaitKey()

7.        CallPlugin.jcqm.jMutexLock(Lock)

8.        TracePrint"移动"

9.        SelectCaseMoveKey

10.        Case37

11.          getCheckFK=CheckFK()

12.          IfgetCheckFKThen

13.              CallMoveLeft()

14.          EndIf

15.        Case39

16.          getCheckFK=CheckFK()

17.          IfgetCheckFKThen              

18.              CallMoveRight()

19.          EndIf

20.        Case38

21.          CallChange()

22.        EndSelect

23.        CallPlugin.jcqm.jMutexUnLock(Lock)

24.        Delay50

25.      EndIf

26.  Loop

27.EndSub

28.

29.SubMoveLeft()//左移

30. CallFKStatic()

31.  CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd1,getFKRect1(0)-30,getFKRect1

(1))  

32.  CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd2,getFKRect2(0)-30,getFKRect2

(1))

33.  CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd3,getFKRect3(0)-30,getFKRect3

(1))

34.  CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd4,getFKRect4(0)-30,getFKRect4

(1))

35.EndSub

36.

37.SubMoveRight()右移

38. CallFKStatic()

39.  CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd1,getFKRect1(0)+30,getFKRect1

(1))  

40.  CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd2,getFKRect2(0)+30,getFKRect2

(1))

41.  CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd3,getFKRect3(0)+30,getFKRect3

(1))

42.  CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd4,getFKRect4(0)+30,getFKRect4

(1))

43.EndSub

44.

45.SubMoveDown()//下降

46. CallFKStatic()

47.  CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd1,getFKRect1(0),getFKRect1

(1)+30)  

48.  CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd2,getFKRect2(0),getFKRect2

(1)+30)

49.  CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd3,getFKRect3(0),getFKRect3

(1)+30)

50.  CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd4,getFKRect4(0),getFKRect4

(1)+30)

51.EndSub

复制代码

     第六,现在我们已经把下降和左右移动写好了,现在要写消除代码了,思路很简单,判断一行是不是都为方块,如果是,则消除,并且上面的方块集体下移。

如何判断呢?

我们通过抓抓获取的句柄可知,方块窗口的类是“361DuButtonClass3”,我们可以通过同一行的窗口的类是不是都为这个,如果是,则消除这一行,并且上面的方块都掉下来,注意一点,这个只要判断当前落下方块的范围下是否一行都是方块即可,顺便把得分算法也写了。

1.

2.SubClearFKLine()

3.  TracePrint"消除"

4.  CallFKStatic()

5.  ScoreExp=-1  

6.  MinToMaxArr=Array(getFKRect1

(1),getFKRect2

(1),getFKRect3

(1),getFKRect4

(1))

7.  MinToMax=lib.算法.结构数组排序(MinToMaxArr,0)

8.  FKMinToMaxY=数组去重(split(MinToMax,""))

9.  ForCheckFKLineJ=0ToUBound(FKMinToMaxY)

10.      IfCheckFKLine(FKMinToMaxY(CheckFKLineJ))Then

11.        ForUnCreateI=1To10

12.          CallUnCreate(CheckFKLineHwndArr(UnCreateI))

13.        Next

14.        CallClearDown(FKMinToMaxY(CheckFKLineJ))

15.        ScoreExp=ScoreExp+1

16.        ClearRow=ClearRow+1        

17.      EndIf

18.  Next

19.  LEv*l=Int(ClearRow/20)+1  

20.  IfScoreExp>-1  Then

21.      getScore=(2^ScoreExp)*10*LEv*l        

22.      Score=Score+getScore

23.  EndIf

24.EndSub

25.

26.FunctionCheckFKLine(CheckFKLineY)

27.  ForCheckFKLineI=1To10

28.      CheckFKLineHwndArr(CheckFkLineI)=getPointHwnd(489+30*CheckFKLineI-15,CheckFKLineY+15)

29.      CheckFKClass=Plugin.WindowEx5_01.GetWindowInfo(CheckFKLineHwndArr(CheckFkLineI),1)      

30.      IfCheckFKClass="361DuButtonClass3"Then

31.        CheckFKLine=True

32.      Else

33.        CheckFKLine=false

34.        ExitFor

35.      EndIf

36.  Next

37.EndFunction

38.

39.SubClearDown(ClearDownY)

40.  ClearDownNum=(ClearDownY-99)/30

41.  TracePrintClearDownNum

42.  IfClearDownNum>0Then

43.      ForClearDownI=1ToClearDownNum

44.        ClearStop=0        

45.        ForClearDownJ=1To10

46.          ClearDownHwnd=getPointHwnd(489+30*ClearDownJ-15,ClearDownY-30*ClearDownI+15)

47.          ClearDownClass=Plugin.WindowEx5_01.GetWindowInfo(ClearDownHwnd,1)

48.          IfClearDownClass="361DuButtonClass3"Then                            

49.              getCDRect=Plugin.WindowEx5_01.GetWindowInfo(ClearDownHwnd,2)

50.              CallPlugin.WindowEx5_01.MoveWindow(ClearDownHwnd,getCDRect(0),getCDRect

(1)+30)

51.          ElseIfClearStop=10Then

52.              ExitSub  

53.          ElseIfClearDownHwnd=MainHwndThen

54.              ClearStop=ClearStop+1

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 可爱清新

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1