1、五子棋游戏的制作五子连珠,在民间俗称”五子棋” ,是一种流传很广的益智棋类游戏,游戏规则非常简单,适合各个年龄段的朋友玩,相信大家以前也一定玩过此游戏,下面我们就来学习使用 Director 来制作一个简单的五子棋个游戏。本文分为三个部分来介绍,界面比较简单,主要是和大家讨论一下制作的思路。1 从游戏的玩法开始讨论游戏的制作思路。2 lingo 代码的设计,移子走棋,以及判断游戏胜负后。3 lingo 代码的设计,棋子布置和后悔按钮的代码设计。一游戏制作思路我们这里介绍的的是一种最简单的五子棋游戏,玩法很简单,黑白双方交替用鼠标拖动棋子来下棋,看谁先摆好连续的五粒,包括水平方向,垂直方向和倾斜
2、方向(45 度和 135 度) ,但是不能有拐点,必须是一条直线,哪一方先连好,则胜利。画面如图:之所以简单是因为我们这里没有涉及到人和电脑下,没有人工智能(AI) ,如果要涉及到 AI,算法就会麻烦一点,而没有 AI的话,主要就是扫描检测了.现在就和大家一起讨论制作思路:1首先要有一个交叉点列表(loclist )棋盘上每个交叉点的坐标值,我们这里为 18*18 的棋盘(每个格子宽 20 个象素)完成记录。2由于需要游戏过程中判断该位置是否有棋子,所以还需要一个同样是二维的列表(onlist)来记录棋子信息,为了方便我们没有棋子的地方为 0,黑子为 1,白子为-1,初始化时全部为 0。上面的
3、代码均在电影脚本中书写:global loclist,onlist on startMovie loclist=onlist=repeat with i=1 to 18tlist=ttlist=repeat with j=1 to 18add tlist,point(20*j,20*i)add ttlist,0end repeatadd loclist,tlistadd onlist,ttlistend repeat end 这段代码让我们得到并初始化了两个关键的二维列表(两个全局变量) loclist 和 onlist 分别记录交叉点位置信息 和 棋子信息。我们可以在 message 窗口中
4、用 put 命令查看它们的内容和规律,就会理解,这将为后面的走棋和判断胜负做准备。put loclistpoint(20, 20), point(40, 20), point(60, 20), point(80, 20), point(100, 20), point(120, 20), point(140, 20), point(160, 20), point(180, 20), point(200, 20), point(340, 360), point(360, 360)put onlist0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5、 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0二.移子走棋,以及判断游戏胜负后1接下来介绍移动棋子代码:要实现的是,用户用鼠标按住来移动棋子,并当用户松开鼠标后,对当前棋子位置的判断, 看是否足够靠近离其最近的一个可放点,如果是就会自动放置好。移动棋子的代码相对简单,这里就重点介绍是否足够靠近离其最近的一个可放点:定义相关属性并初始化。property pmousedown,sel,poldloc,moveEnable,OnlinePoson beginsprite mesel=sprite (me.spritenum) -代表自身pold
6、loc=sel.loc -棋子的原始位置pmousedown=0 -是否鼠标按下moveEnable= 1 -是否可以移动OnlinePos= -移动的历史记录:记录我移动完成后的位置信息和我的棋子信息(黑棋还是白棋) ,End这里的判断原则是扫描所有交叉点,找到一个距离适当(与该点水平坐标差和垂直坐标差都要小于 10),并没有棋子(即onlistij=0)的点来放好棋子。on ifcloseenough me cursor -1 -通过一个二重循环来遍历二维列表中的每个坐标点repeat with i =1 to 18repeat with j=1 to 18myLoc=sel.loc if
7、 abs(myLoc1-loclistij1) 0 then if tn=1 thenblackNum=blackNum+ 1whiteNum= 0 if blackNum=5 then -是否黑方获胜win(1)abort end if elsewhiteNum=whiteNum+ 1blackNum= 0if whiteNum=5 then -是否白方获胜win(-1)abort end if end if elseblackNum= 0whiteNum= 0 end if end repeat end由以上我们就可以判断游戏胜负了。三.棋子布置和后悔按钮的代码设计1介绍一下棋子的布置。初
8、始时舞台上没有棋子,我们通过 puppetsprite 来动态的根据需要把棋子放在舞台上并激活移动用户使用,这样不必在舞台上拖大量的精灵,时游戏显得混乱。我们这里用 41 及 41 以后的通道来共摆放棋子。具体运用时我们在电影脚本里面定义一个函数来完成这一需要多次用到的操作:根据 nowNum 的值来设置,为 1 是设置为黑子用户走子,-1 则为白子用户。on setUser nowNumif nowNum=1 then nextname=“black“member(“info“).text =“黑子走“ elsenextname=“white“member(“info“).text =“白子
9、走“ end ifrepeat with o=41 to the lastchannel-从 41 通道开始找到第一个 memberNum 为空的演员,来对其关联给对应的演员if sprite(o).memberNum=0 then -开始控制该通道puppetsprite o,true-设置位置等相关精灵属性sprite(o).loc=point( 322,390)sprite(o).ink= 36sprite(o).width= 18sprite(o).height=18-设置对应 membersprite(o).member=member(nextname)-添加按钮脚本x = scri
10、pt(“chess“).new()-因为设置 scriptInstanceList 时,不能覆盖已有的元素,固需要加入 sprite(o).scriptInstanceList= sprite(o).scriptInstanceList = sprite(o).scriptInstanceList .add(x)-强迫初始化sendsprite o,#beginsprite exit repeat end if end repeat end每次下完一颗棋子后,当没有玩家获胜时,则调用 setUser(num)出现下一颗棋子让玩家移动。2后悔按钮,就是把棋盘上的最近放置的一颗棋子去掉,并设置新的
11、当前玩家。on mouseup mepuppetsound 1,“regret“ -播放音效repeat with i= the lastchannel down to 42 -从最好一个通道往前面扫描-找到第一个 memberNum 不为空的通道,即最近放置的棋子if sprite(i).memberNum0 then Pos=sprite(i- 1).OnlinePos -得到棋子的位置信息onlistPos 1Pos2=0 -将 onlist 对应位置恢复,表示该位置为空了-清空最近一颗棋子的脚本和演员sprite(i).scriptInstanceList=sprite(i).memberNum=0 -停止对最近一颗棋子所在通道的控制puppetsprite i,0 exit repeat end ifend repeat setUser(-Pos3 ) -如果舞台上只剩一颗棋子,则不应由后悔按钮了if i=42 then sel.visible=0 end到此位置,整个游戏的关键代码就介绍完了。