
第7天 凤凰涅槃诞生神鸟,扫雷重识善待游戏
知识点:编程素材选择
学习编程中非常重要的一点,要有好的编程素材。只有这样,才能做到有程可编。游戏是一个不错的选择,令你感兴趣的小游戏是非常好的编程素材。
两个版本的扫雷游戏就这样就都做出了,两个版本差别很大,从原先的麻烦(手式做64个按钮)和呆板(只有64)个按钮,到简洁(一个按钮)和灵活(任意多的按钮),编程其实就这么简单。其实在这中间还有一些细节:
第一步调整:将64个按钮手工制做到程序制做,从手工调位置到程序调位置。
这一步在本质上和V1.0没太大的区别,区别从程序执行上和我们玩上都看不到,但这一步中其实已包含了一种整体思考的思想,控件的位置是有联系的,内部也有一定的规律。行列关系是这一步的关键。
第二步调整:做一个任意长度任意宽度的雷区,但还是以8*8为蓝本。
只要对1的行列关系把握好了,只要将其中的和行列对应的位置放入我们的行列变量,这一步就完成了。此步是整体思考和发生质变的第一步。
第三步调整:初始载入的扫雷也就是程序运行时的第一次扫雷
将初始载入的部分,即Form_Load(),中和8*8相联系的部分调整。
第四步调整:第2到任意次的扫雷
在第三步和第四步找到其相同点和不同点,将共同点总结,合并成一个子程序,实际该步是对第三步的重调整和重新开始按钮的代码改写,改写的过程中自然是对和8*8相联系的数据用行列变量rowNum和LineNum来替换。该步调整完成,代码发生了质变,而界面还未发生。
第五步调整:将和8*8相联系的相应量进行调整和变换直到任意的量
数组要调整,界面也要调整,使程序运行过程中真正地可以直接利用行列值和地雷数完成一个新的游戏,这一步,界面发生变化,操作也发生变化,程序从外表到内部都了生了质变,也是调试任务最重的一个环节。
计算机干的工作是什么样的呢?麻烦和呆板的,而人们做的呢?动脑筋找规律,动手找办法,将麻烦的东东的麻烦部分用简单的计算机语言描述给电脑做,让呆板的部分通过系统的思考变得灵活起来。人的工作是命令性质的,是指挥的工作。
改动的项目总结如下:
(1)命名,使程序有了比较好的风格。
(2)数组使用方式,从固定数组到可变数组。
(3)控件使用方式,控件数组的形式和普通变量数组不太一样,需加载,并且加载只有一次,不用的多余的,最好、卸载掉,不然它可能起不到好作用而成了在捣乱。
(4)子程序或函数,将重复性的具有特定功能的工作,重新界定其功能,用统一的子程序或函数来实现,使程序结构更加清晰。
(5)公共变量的作用。多窗体中,在模块中进行定义的公用变量是窗体与窗体间交流的通道。
其实通过两个版本的比较也不难看出,编程过程中刚开始的麻烦呆板也是正常的,暂时处理不了的东东,可以用低一级的要求处理完成。好多初学编程的朋友往往容易陷入这样的境地,自己的功夫不行,对自己的要求却特高,有了一个问题,想得万分复杂,想了几个月后还未下上手,到头来再慨叹程序太难编。这是眼高手低症。
有时还是要妥协一下的,化繁就简也有许多好处,既然太复杂的临时做不出,那就退一步,先做一个功能少的,变化也少的。这样,原先的很复杂的问题就变得简单和容易上手了。
二、期待V3.0的出现
有了V2.0,程序的95%以上的框架就有了,但这并不能说明它已是完美无缺的了。在玩的过程中我们不难发现它的这样那样的缺撼,怎样对其进行修改呢?下面我们再找一下看看。
1、不能左右键同时开工对已标雷区域进行处理;
2、挖雷过程中对空白区域的处理不彻底;
3、游戏排行榜还未设立。
下面,我们将以第1点为例,对2.0进行进一步改进,使这个游戏更加好玩。
怎样共用鼠标左右键呢?要想对其共用,必须了解编程的过程中二者的特点。在VB中左键的值是1,右键的值是2,那么二者同时按下时其值将成为3,但事实上这样是不可能的,要做到这两个键同时按下,除非超人,否刚我们很难做到。
所以实现左右键共用,也是有一个时间问题的,有一个键用的时间早一些,另一个晚一些,而我们就是通过计算二者的和值来实现左右键共用的。
既然明确了左右键共用的本质问题,下面就可以编程来解决了。究竟是针对哪一个事件来编程呢?对比click等事件,还是选择MouseDown和MouseUp两个事件来组合使用,这个事件中包含着对鼠标键的控制。再一个问题是针对哪一个控件来编程。在挖雷的过程中,应该是在已经控开一个区域的情况下,并且8个格中的雷的位置已判断好并做上了标志,所以执行左右键共用的控件不是命令按钮,而成了标签,也就是LabNum。
下面就是左右键共用的最主要代码:
Private Sub LabNum_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
'v30左右键共用 挖雷
If Button = 3 Then
'因为两键同时按下非常人能为,所以 Print "SupperMan"
Print "Supper Man"
Else
If OldButton + Button = 3 Then
'Print "BingGo"
‘执行挖开其他区域
If JudgeqNum(Index) = -FlagNum(Index) Then
Call JudgeqNo(Index)
End If
End If
OldButton = Button
End If
End Sub
Private Sub LabNum_MouseUp(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
OldButton = 0 'v30左右键共用
End Sub
此功能在具体实现上,用到了一个函数和一个子程序,函数JudgeqNum()用来计算某已挖开雷区周围8格中已标志的地雷数目,只有这个数目同该区的地雷数相同时,才可将非雷区挖开,子程序JudgeqNo()则是用来挖开非雷区的。
不论上面的函数和子程序其结构和我们前面用到的某区域周围雷数目计算函数JudgeNum()和挖开大片无雷区的子程序JudgeNo()的结构上是相似的。
JudgeqNum()的实现比较简单,只要将右键记录数组Flagrmouse()和某区域周围的格子对应起来就行了,而对于JudgeqNo()的处理,需对原程序cmdboom_Click()子程序的最外层加上一个:
If FlagRMouse(Index) = False Then
‘原程序
endif
通过这个分支对已标志为雷的按钮将不再挖开。相应的调整还发生在对右键记录数组的处理上:
Private Sub cmdboom_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single) '右键功能
'定义右键功能,右键的BUTTON值为2
i = Button
If i = 2 Then '右键 v3.0调整
If FlagRMouse(Index) = False Then
CmdBoom(Index).Caption = "?"
FlagRMouse(Index) = True
Else
CmdBoom(Index).Caption = ""
FlagRMouse(Index) = False
End If
End If
这里的调整,可以保证flagrmouse()只有两种结果真(-1)和假(0)。
函数和子程序的代码如下:
(1)函数JudgeqNum(),求?号数目函数,也即求已标出的地雷数目 v30用函数
(2)子程序JudgeqNo(),已标志雷区处理处理子程序 ,9分类情况
通过上面的两个函数、子程序以及对主程序做的相应调整,这样,扫雷游戏的修改又进了一步,可以通过左右键共用挖雷了。
此功能的实现和右键状态记录数组FlagRMouse()密切相关,我们在程序中定义其为两种状态,True(-1),false(0),分别对应于有雷和无雷,正是因为该数组的存在,我们可以判断某格周围区域已标记(?)为雷的数目,如果此数目和该处通过放在flagnum()数组中对应的值相等,其它的未挖开区域可以直接通过程序来完成,而不用一个一个通过人将其挖开。
其他的细节问题在上面我们做了简单介绍,请通过源程序再仔细看一下。
三、热爱游戏,热爱编程
游戏是非常好的编程素材,为什么这么说呢?原因有四:
之一:玩乃人之天性,兴趣是人的最好的老师。
游戏恰恰将二者合而为一,真正体现了寓教于乐的思想,我编程是因为我感兴趣,更是因为我快乐。
君不见程序员们对待编程的热情所至,又不是一个热爱所能了得的。废寝忘食那是小Kiss,夜以继日那是寻常事。那里面也不仅仅是一个钱字能说明的,编程的目的其实在这种状态下,经济利益成了其次的事情。
编程是件苦差事,更是件乐差事,众多程序员的孜孜不倦的行动是最好的说明。
之二:有比写代码更重要的工作
编程,用来搞一下名词解释,无非是编写程序,又可理解为编写代码。其实在写代码之前还有非常重要的工作,那就是详细了解我们要对之编程的对象,用一个名词来说叫做系统分析。系统分析一般来说是一项枯燥繁琐可能出力不讨好的工作。对游戏编程来说可能就变了。
因为是游戏,所以都有“游戏规则”,这是游戏好玩的地方。踏踏实实地认识一下游戏规则,其实是在学习另一种玩法。何乐而不为呢。
我想,我们没有理由不选择它。
其三:游戏规则的把握与嬗变。
陈规陋习令人厌恶不堪,一个游戏放在了你的手底下,活儿随你的心意转变。也许一个新游戏一种新玩法又诞生了。
这叫做创造的过程。不论什么人,对创造都是有期望的,那种感觉和步人后尘是完完全全的两种感觉。那是一种成就感,虽小却使人觉得很舒坦。
其四:好的游戏,一个好的开始。
相信吧,选择一个好的游戏,你会有一个好的开始;请相信,在兴趣的强大支持下,苦与乐的结合下,你定会成为一名优秀的程序员。
当前位置: