五子棋相信大家都玩过,当黑子或者白子横、竖、斜连成五子,游戏结束,获得胜利,但是如何在编程中根据五子棋的规则实现胜负判定还是很难的,更别说实现与人机对战功能了。作为初学者我们可以先实现一个小目标,等掌握更多编程知识后再向更高难度进发。五子棋可以分为人机对战和人人对战两种形式,人机对战需要用到复杂的算法,我们就先尝试制作人人对战,先完成棋盘的绘制,两个玩家用黑子、白子交替落子。至于判断哪一方的五子先连成一条直线也可以放在以后再来想办法完成。
1.绘制棋盘
目标明确后,再来分析目标明确需求。需要先完成五子棋盘的绘制,接下来完成黑(白)子跟随鼠标运动,棋子的圆心要落在棋盘的交点上,双方交替落子,一个交叉点只能落一个棋子,不能在棋盘外落子(图1)。
棋盘由黑色的竖线和横线交叉组成。在舞台上找到一个合适的起始点,画一条竖线,通过循环次数控制线的数量,用继续平移X坐标的方法画出剩下的线,画横线只需交换X和Y轴的变量就可完成。
新建变量“画笔坐标”来控制绘制线条X轴或Y轴的起点,画笔颜色设为黑色。根据舞台大小设置两条线相隔距离为20像素比较合适,这样画16条线就可以铺满舞台。找一个合适的起始点(-198,-160),向上画一条300长的竖线(20×15=300),将“画笔坐标”增加20,下一条线的起点就是在X轴方向平移20。循环16次,画出全部竖线。横线和竖线是一样的画法,只需要调换XY坐标的变量。完成棋盘后广播“黑子”,等待执黑先行落子(图2)。
2.棋子编程
接下来解决黑子和白子的落子问题。在造型中绘制一黑一白两个圆形棋子作为角色。落子我们使用画笔的图章功能,图章功能是只在当前位置画下一个角色的样子,而没有继承角色的代码,这与克隆不同。这部分的难点是解决落子的位置,落子需要在棋盘交点的中心,因为鼠标不可能精准得落在交点中心,所以需要把这个交点附近的落点经过数学计算处理。在绘制棋盘时已经知道每个交叉点的坐标都是20的整数倍,把两个交点间距离平分则一个交点对应半径为10的圆形区域。这样就转化成一个数学取整的问题。假设交叉点坐标为(X,Y),鼠标的坐标可能是(X a,Y b),且-10<a<10,-10<b<10,用鼠标的坐标除以20后得到的数字四舍五入后,再乘20就是这个交叉点的坐标(图3)。
比如,假设交叉点为(40,80),鼠标指针为(43,82)按照上述公式计算可以得出最后的落点位置是交叉点为(40,80)。
解决了落子问题,接下来有几个问题需要大家去思考一下,如何保证落子的棋子不会落在棋盘外面呢?可以根据棋盘的坐标做一个范围判断(图4)。
最后不要忘记了还有最为关键胜负判定,大家可以思考一下,通过什么方式可以实现,这个以后我们再讲。