【算法】五子棋游戏的制作.doc

上传人:asd****56 文档编号:70324886 上传时间:2023-01-19 格式:DOC 页数:6 大小:86KB
返回 下载 相关 举报
【算法】五子棋游戏的制作.doc_第1页
第1页 / 共6页
【算法】五子棋游戏的制作.doc_第2页
第2页 / 共6页
点击查看更多>>
资源描述

《【算法】五子棋游戏的制作.doc》由会员分享,可在线阅读,更多相关《【算法】五子棋游戏的制作.doc(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

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窗口中用put命令查看它们的内容和规

4、律,就会理解,这将为后面的走棋和判断胜负做准备。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, 0, 0, 0, 0, 0, 0

5、, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0二.移子走棋,以及判断游戏胜负后1.接下来介绍移动棋子代码:要实现的是,用户用鼠标按住来移动棋子,并当用户松开鼠标后,对当前棋子位置的判断,看是否足够靠近离其最近的一个可放点,如果是就会自动放置好。移动棋子的代码相对简单,这里就重点介绍是否足够靠近离其最近的一个可放点:定义相关属性并初始化。property pmousedown,sel,poldloc,moveEnable,OnlinePoson beginsprite mesel=sprite(me.spritenum) -代表自身poldloc=sel.loc -棋子的原始

6、位置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 abs(myLoc1-loclistij

7、1)10 and abs(myLoc2-loclistij2)10 and onlistij=0 then -如果找到一个开放点,则放置到该位置上sel.loc=loclistij-不能在被移动sel.moveEnable=0 if sel.member.name = white then -棋子信息列表记录该点棋子信息t=1onlistij=tOnlinePos=i,j,t elset=-1onlistij=tOnlinePos=i,j,tend if -检测是否有玩家获胜(具体代码稍后在讲)checkIT(i,j,t) -找到点并放置好后就可以中止后面剩下的循环判断操作了,否则一直扫描完

8、exit end ifend repeat end repeat-在上面,如果没有一个点靠得足够近,就会回原位sel.loc=poldloc end2. 判断游戏胜负:用checkIT(i,j,t)程序检测是否有玩家获胜。(即判断否至少有一个方向存在连续5个或以上的同色棋子)实际操作时我们根据当前点确定我们可以确定四条直线(实际上是四个列表),这里我们需要对四个直线逐一进行判断。这四条直线分别是,水平方向,垂直方向和倾斜方向(45度和135度)。参考下图中的四条蓝色的粗线。on checkIT i,j,num -水平方向:-所在点横线扫描,扫描水平信息列表scan(onlisti)-垂直方向-

9、所在点纵向扫描tlist=repeat with m=1 to 18add tlist,onlistmj -通过循环获取纵向信息列表end repeatscan(tlist) -进行扫描-所在点斜率为1的直线扫描(y=x-b),即倾斜方向45度b=i-jtlist= repeat with y=1 to 18repeat with x=1 to 18if x=y-b then add tlist,onlistyx -通过循环获取有该点决定的斜率为1的直线信息列表 end repeat end repeatscan(tlist) -进行扫描-所在点斜率为-1的直线扫描(y=-x+b),即倾斜方向

10、135度b=i+jtlist= repeat with y=1 to 18repeat with x=1 to 18if x=-y+b then add tlist,onlistyx -通过循环获取有该点决定的斜率为-1的直线信息列表 end repeat end repeat scan(tlist) -进行扫描setUser(num)endon scan(t) -扫描列表程序,看是否有一方以获胜(即累计数目等于5)blackNum=0whiteNum=0 repeat with n=1 to t.countif tn 0 then if tn=1 thenblackNum=blackNum+

11、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.介绍一下棋子的布置。初始时舞台上没有棋子,我们通过puppetsprite 来动态的根据需要把棋子放在舞台上并激活移动用户使用,这样不必在舞台上拖大量的精

12、灵,时游戏显得混乱。我们这里用41及41以后的通道来共摆放棋子。具体运用时我们在电影脚本里面定义一个函数来完成这一需要多次用到的操作:根据nowNum的值来设置,为1是设置为黑子用户走子,-1则为白子用户。on setUser nowNumif nowNum=1 then nextname=blackmember(info).text=黑子走 elsenextname=whitemember(info).text=白子走 end ifrepeat with o=41 to the lastchannel-从41通道开始找到第一个memberNum为空的演员,来对其关联给对应的演员if spri

13、te(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 = script(chess).new()-因为设置scriptInstanceList时,不能覆盖已有的元素,固需要加入 sprite(o).scriptInstanceList= sprite(o).sc

14、riptInstanceList= sprite(o).scriptInstanceList.add(x)-强迫初始化sendsprite o,#beginsprite exit repeat end if end repeat end每次下完一颗棋子后,当没有玩家获胜时,则调用setUser(num)出现下一颗棋子让玩家移动。2.后悔按钮,就是把棋盘上的最近放置的一颗棋子去掉,并设置新的当前玩家。on mouseup mepuppetsound 1,regret -播放音效repeat with i= the lastchannel down to 42 -从最好一个通道往前面扫描-找到第一

15、个memberNum不为空的通道,即最近放置的棋子if sprite(i).memberNum0 then Pos=sprite(i-1).OnlinePos -得到棋子的位置信息onlistPos1Pos2=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到此位置,整个游戏的关键代码就介绍完了。

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

当前位置:首页 > 生活休闲 > 休闲娱乐

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁