上一篇 | 下一篇

五子棋游戏的制作(下)

发布: 2007-1-25 15:49 | 作者: 爱伊 | 来源: aougu.net | 查看: 191次

2.. 判断游戏胜负:奥古多媒体j8H A-d4c|Twu8S
奥古多媒体i\sBz
用checkIT(i,j,t)程序检测是否有玩家获胜。(即判断否至少有一个方向存在连续5个或以上的同色棋子)实际操作时我们根据当前点确定我们可以确定四条直线(实际上是四个列表),这里我们需要对四个直线逐一进行判断。
_/[7T(fLOYQ_ 奥古多媒体%Tw@"_}&I m
这四条直线分别是,水平方向,垂直方向和倾斜方向(45度和135度)。奥古多媒体4e f@Z r9_2V%u`ou

_1w\R(?Z \ 参考下图中的四条蓝色的粗线。
&HH&zj$y+W7v;ek 奥古多媒体%AoM]+@ {jz
奥古多媒体}Qyr{
奥古多媒体P?#D%C"] XWCB
on checkIT i,j,num 奥古多媒体5``+B6DUN I
  奥古多媒体3J tjcyC Q"i
  --水平方向:奥古多媒体a&SIWq8Il;P){
  --所在点横线扫描,扫描水平信息列表
[!s&B+P7m.WT$hKS   scan(onlist[i])
B(ZrN#Q7f   奥古多媒体 gq/?z5r:iCe
  --垂直方向
nV;X}A7XY6x!^G   --所在点纵向扫描
T9D+pH6J   tlist=[]
9M"a1[CK[^"frt   repeat with m=1 to 18
kYG:v8F }2NI     add tlist,onlist[m][j] --通过循环获取纵向信息列表
&V7d/MG/yr,j P@ ha9s   end repeat
_\6q i7q.?/~   scan(tlist) --进行扫描奥古多媒体d&|!`0{9f|j+N
  
$K,C/Eflox5v   
7Sz+hX;K-] |d   --所在点斜率为1的直线扫描(y=x-b),即倾斜方向45度
D-nN3j#uO K"\;q   b=i-j
H D6b!U&u2P3LO   tlist=[] 奥古多媒体,T {+}8r3Cq
  repeat with y=1 to 18
R%ikVq UE"e     repeat with x=1 to 18
^KS5f*R%}AX       if x=y-b then add tlist,onlist[y][x] --通过循环获取有该点决定的斜率为1的直线信息列表 奥古多媒体1h'U'Z6Cz-^6L|[/N
    end repeat 奥古多媒体8}h9j,u5BO#~$L}
  end repeat
4N&JG%qiO   scan(tlist) --进行扫描
7n(M_a YgI*\m {   
b bVCF5jUG   --所在点斜率为-1的直线扫描(y=-x+b),即倾斜方向135度
$r6p"K ku5R   b=i+j
+u5_T$c r{.|a,K   tlist=[] 奥古多媒体 y!j~0x1PT |
  repeat with y=1 to 18奥古多媒体;s/|xA,@&e{
    repeat with x=1 to 18
A q _6pQ*xD       if x=-y+b then add tlist,onlist[y][x] --通过循环获取有该点决定的斜率为-1的直线信息列表 奥古多媒体2qfJdU'uc
    end repeat 奥古多媒体P"M^ |fw)\@8J
  end repeat
;[:J$?`3qyk L5^   scan(tlist) --进行扫描奥古多媒体 Mg6ti _;s:R
  setUser(num)奥古多媒体0d0x2y7_8tg
end奥古多媒体YJ'vW*u
奥古多媒体'x8DBV%M%UW`fd-Lj
on scan(t) --扫描列表程序,看是否有一方以获胜(即累计数目等于5)
'k8te8nE Q~$p   blackNum=0
Q"z#n;rl+K8e$P1Z   whiteNum=0 奥古多媒体 ~L J%Q1O T
  repeat with n=1 to t.count奥古多媒体e8c7@B^S%h'G3f
    if t[n] <> 0 then 奥古多媒体BN%j#i?G0T
      if t[n]=1 then奥古多媒体b N!l"S%L8}
        blackNum=blackNum+1奥古多媒体'OF%t;_]#p4S
        whiteNum=0
%J'rdP%ergs         if blackNum=5 then --是否黑方获胜
A f:Q'P.i nN           win(1)
h6v(^ DY,g5f           abort 奥古多媒体o E tGz
        end if
YF;n;b5W"K!u       else
0q$xrvIt^         whiteNum=whiteNum+1
tn:zOp4d         blackNum=0奥古多媒体,Pt{&cG2T d
        if whiteNum=5 then --是否白方获胜
;t3LoPi8v           win(-1)
/fDDM[z&w(e)vgp           abort 奥古多媒体+t|rb%hJ/d8{Mb
        end if 奥古多媒体cM Dx#p{
      end if 奥古多媒体jW_.NO,]8e
    else
``n2f.qIt c^       blackNum=0
o@!K U*Hf       whiteNum=0
6Q(T#U9M`BA$}?     end if 奥古多媒体8Py1e:B6V g
  end repeat
n Lb!h5wD/g)H end奥古多媒体/]\%[U!Yi\a?

fI?3y6N.G*I7~
4|K_ x;Bn*C 由以上我们就可以判断游戏胜负了。奥古多媒体'W4V2Y"{j v
奥古多媒体Y%@@*j4i^
三.棋子布置和后悔按钮的代码设计
[;@m \ k K 奥古多媒体!I'B"\,o3aA%_z
1..介绍一下棋子的布置。奥古多媒体9R ~:o }^N

-B$np0RZ%y~#Ag(y 初始时舞台上没有棋子,我们通过puppetsprite 来动态的根据需要把棋子放在舞台上并激活移动用户使用,这样不必在舞台上拖大量的精灵,时游戏显得混乱。我们这里用41及41以后的通道来共摆放棋子。
'{.ri6P^
!x9kMQUU^ 具体运用时我们在电影脚本里面定义一个函数来完成这一需要多次用到的操作:奥古多媒体'X*RO7LU_:Y
根据nowNum的值来设置,为1是设置为黑子用户走子,-1则为白子用户。
9\O,PW|h4ecS
$NrJ X[Cn:Gj:E#]p;G on setUser nowNum
fWk4U ]^J   奥古多媒体9?L$W5g"Q{O&~6S!W
  if nowNum=1 then 奥古多媒体8oen[;X]#J
    nextname="black"
De3c0I%yq     member("info").text="黑子走"
Js@] Z,G/zYD{   else奥古多媒体r"Q8H|:~+z.F C b
    nextname="white"
I'mP6bZ ]$C     member("info").text="白子走" 奥古多媒体yg q!HP:RW%N/K0L
  end if奥古多媒体D2K"h5YL+v E
  奥古多媒体,Z*eu`a,X7_/pj
  repeat with o=41 to the lastchannel
Ua!I2UE I"s;QA4n0u |     --从41通道开始找到第一个memberNum为空的演员,来对其关联给对应的演员奥古多媒体3Wy8T6P1D A
    if sprite(o).memberNum=0 then
.H:{j#V4q G'HN%y+a       奥古多媒体Y/A1ai{O} U
      --开始控制该通道
2k9lQ["N%v&@1t [.Ua       puppetsprite o,true奥古多媒体U:s?[HR#ym*x5x~ Z
      奥古多媒体g)B wa0VD|j%?2Z
      --设置位置等相关精灵属性奥古多媒体9DbQ,Kc)@Z/j
      sprite(o).loc=point(322,390)
gZtO6m       sprite(o).ink=36奥古多媒体+B5Y F]?`Y$kFV+AO
      sprite(o).width=18
r+[:NT3u,{h"L       sprite(o).height=18奥古多媒体o g _5oD,S(R5iO
      奥古多媒体OvK%~;i0T
      --设置对应member
RA&p | rMF?3_D       sprite(o).member=member(nextname)
$Y4[qq\&e"fdZ       
8T X+}QZ,Z8D       --添加按钮脚本
O+A._ L|po x = script("chess").new()奥古多媒体't{7{%w"e:a4u

!}3n i ]x4Y:|8O       --因为设置scriptInstanceList时,不能覆盖已有的元素,固需要加入 sprite(o).scriptInstanceList=[] 奥古多媒体$d S^rVVj
      sprite(o).scriptInstanceList=[]
+yR&t.lPEv 奥古多媒体F+`,Hv|\WYn|
      sprite(o).scriptInstanceList.add(x)
N s K1S q }!p)^       
M!K!A2yN1j?B       --强迫初始化
*f;}#|P5~-?,Ug       sendsprite o,#beginsprite 奥古多媒体o1u[m2[#w:E
      exit repeat 奥古多媒体 IB7}H$}'w*r
    end if
8nK"?2W-W y   end repeat
7yvoK:X5H.rS w end奥古多媒体qy_"~t?
奥古多媒体L+fc9S }4Rw[ x|

"??:^ jF7P:\[ 每次下完一颗棋子后,当没有玩家获胜时,则调用setUser(num)出现下一颗棋子让玩家移动。
)~+u}uOs
"{s|2N i$CZ}j
Qg:LT])qG\"NN 2..后悔按钮,就是把棋盘上的最近放置的一颗棋子去掉,并设置新的当前玩家。奥古多媒体7X R w)@"?-K5l0j
奥古多媒体(IUk4Mq4aQz*V
on mouseup me奥古多媒体z4R6\[8s
  puppetsound 1,"regret" --播放音效
wuy]qDO}KF|   repeat with i= the lastchannel down to 42 --从最好一个通道往前面扫描奥古多媒体_}$q1iP @.T(?^
    --找到第一个memberNum不为空的通道,即最近放置的棋子奥古多媒体M)l)juo|#F
    if sprite(i).memberNum<>0 then
2_E2@i6}{       Pos=sprite(i-1).OnlinePos --得到棋子的位置信息奥古多媒体g3c:z b| u{/I4Tt4Q
      onlist[Pos[1]][Pos[2]]=0 --将onlist对应位置恢复,表示该位置为空了奥古多媒体8nHx{I
      奥古多媒体7QX oq]!E;L!m
      --清空最近一颗棋子的脚本和演员
4e%QQ4J q"i ?SA]       sprite(i).scriptInstanceList=[]
n7Kl;OK+u)L1N       sprite(i).memberNum=0 奥古多媒体,}9o H"dSdjr
      --停止对最近一颗棋子所在通道的控制
1|5~4jD)i0F E       puppetsprite i,0
6c~ Nk)U(?%[       exit repeat
OE4X^ n!~     end if
Pe0p$`'M$enN[   end repeat
(R]"p{3hk8K:Va   setUser(-Pos[3])
Bozb*?#lN   --如果舞台上只剩一颗棋子,则不应由后悔按钮了奥古多媒体 h uE%NzJ7J\2U
  if i=42 then sel.visible=0 奥古多媒体j/n1C~)h%s
end奥古多媒体xx7~)DR;} QY6U3F
奥古多媒体a&rYPh j6PGr_UP\K-D
奥古多媒体a6x&|mt'W9C1Fy$y2o
到此位置,整个游戏的关键代码就介绍完了,大家在看完本文后,在参考dir源文件分析应该时有所收获的。
xa LUjck
/d$ZH~gG QE"{2C 源程序下载(右键另存为)

字号: | 推荐给好友

 

评分:0

我来说两句

seccode


音乐
落叶 画心 放生 天亮了 牡丹江 那滋味 擦肩而过 怀念过去 北京欢迎你 突然好想你 吻的太逼真 说好的幸福呢 坐上火车去拉萨 如果爱能早些说出来
愚爱 心碎 稻香 带我走 醉赤壁 魔杰座 我还想她 为你而活 一定要爱你 等爱的玫瑰 原谅我一次 越单纯越幸福 最后一次的温柔 给我一首歌的时间
白狐 光荣 火花 下雨天 小酒窝 樱花草 为你写诗 无可取代 无情的温柔 寂寞才说爱 忘不掉的伤 爱上你是个错 陪你一起看草原 地球人都知道我爱你
城府 假如 花海 兰亭序 爱太痛 舍不得 你若成风 女人如烟 外滩十八号 我们的纪念 摇滚怎么了 和寂寞说分手 爱上你是我的错 爱情里没有谁对谁错