上一篇 | 下一篇

五子棋游戏的制作(上)

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

五子连珠,在民间俗称”五子棋”,是一种流传很广的益智棋类游戏,游戏规则非常简单,适合各个年龄段的朋友玩,相信大家以前也一定玩过此游戏,下面我们就来学习使用Director来制作一个简单的五子棋个游戏。
?!S*\$L8XV4wCB
,D)R+ic8WR6a 本文分为三个部分来介绍,界面比较简单,主要是和大家讨论一下制作的思路。奥古多媒体6q d'Y6]6qu9c}

Z3r jP+R6kA:\9Cr 1.. 从游戏的玩法开始讨论游戏的制作思路。
7Z BU\ h!w
?.`E)b? j 2.. lingo 代码的设计,移子走棋,以及判断游戏胜负后。
7|pV b\^ c{9Zf)N
b*~3L'K2v w.|'~ 3.. lingo 代码的设计,棋子布置和后悔按钮的代码设计。
3^*LjQMcu
$W]#Uiu"|7f 一.游戏制作思路
|j8m5Pj m
n#agr$MgS1` 我们这里介绍的的是一种最简单的五子棋游戏,玩法很简单,黑白双方交替用鼠标拖动棋子来下棋,看谁先摆好连续的五粒,包括水平方向,垂直方向和倾斜方向(45度和135度),但是不能有拐点,必须是一条直线,哪一方先连好,则胜利。画面如图:奥古多媒体`6\{Vp,ES mHi
奥古多媒体*tQ H)N8{!]a
奥古多媒体p6Y4GJIbS._
之所以简单是因为我们这里没有涉及到人和电脑下,没有人工智能(AI),如果要涉及到AI,算法就会麻烦一点,而没有AI的话,主要就是扫描检测了.奥古多媒体 v6v%Di*Wn/C

kEE{ LT'Q { 现在就和大家一起讨论制作思路:奥古多媒体U,O~jL*zM
奥古多媒体Cz K3Z&vU/Y^
1..首先要有一个交叉点列表(loclist)棋盘上每个交叉点的坐标值,我们这里为18*18的棋盘(每个格子宽20个象素)完成记录。奥古多媒体5`n8S^3E+T1TC

$~n*Q1xJ Lb#R)v9r 2..由于需要游戏过程中判断该位置是否有棋子,所以还需要一个同样是二维的列表(onlist)来记录棋子信息,为了方便我们没有棋子的地方为0,黑子为1,白子为-1,初始化时全部为0。奥古多媒体\0A;t{P/~h:~r
奥古多媒体isN ],?X
上面的代码均在电影脚本中书写:
"l7Rd0X{J(xG? 奥古多媒体|2NM&{)s
global loclist,onlist 奥古多媒体R#?'l9A{*J5C,e|
on startMovie 奥古多媒体 `Z a%?5`i k8m
  loclist=[]奥古多媒体&m G7g"X!B2@mrY"ga
  onlist=[]
N;w(eVx4nD6g]a   repeat with i=1 to 18
+T/UiaN n/T&E)Hq.E     tlist=[]
Z,F]"w+e\`     ttlist=[]
4O?\H*fn$G     repeat with j=1 to 18
"d{ rhK {'gl       add tlist,point(20*j,20*i)
1F[*^d"o*i+E4e       add ttlist,0奥古多媒体y"k tyDrwM*B
    end repeat
3fy+eNq     add loclist,tlist
lR]&q&]9fNw     add onlist,ttlist奥古多媒体P,c#MDB3Y
  end repeat 奥古多媒体VYXD/?wr8OH
end奥古多媒体/B#pl_B
奥古多媒体+@0|S u$xyP?

0`$a/br f%B'h 这段代码让我们得到并初始化了两个关键的二维列表(两个全局变量) loclist 和 onlist 分别记录交叉点位置信息 和 棋子信息。奥古多媒体[']2d;~V!b l \w
奥古多媒体0z5wjSV%a w)x`
我们可以在message窗口中用put命令查看它们的内容和规律,就会理解,这将为后面的走棋和判断胜负做准备。奥古多媒体"aOI x\xWY4W@y

m$fj0Ai put loclist
9] [2nB9c)_-O5u [[point(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)]]奥古多媒体$f5D JKMA%V'K*p
奥古多媒体0m2AK(sx9q Q Q}$F
put onlist
-I ?]\8g[T\l [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], …… 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]奥古多媒体C%tFx1a Z4s

5QK!E)|F q
x\9s;t@4I 二.移子走棋,以及判断游戏胜负后奥古多媒体-S6g)x/s+V+C@

&S6av.k` m _)i#Y_
+g8v_A+M me]b)E;k(|? 1..接下来介绍移动棋子代码:奥古多媒体 oH*c#u-T(OY2? hYp
奥古多媒体Y!`.D(I%BJ3Y
要实现的是,用户用鼠标按住来移动棋子,并当用户松开鼠标后,对当前棋子位置的判断,看是否足够靠近离其最近的一个可放点,如果是就会自动放置好。移动棋子的代码相对简单,这里就重点介绍是否足够靠近离其最近的一个可放点:
{iMK.?D"S ] xl1@
.FL9`4Yq8`)O 定义相关属性并初始化。
,t4R+LBIwA0g#J
E^J5M@)J/lQ x property pmousedown,sel,poldloc,moveEnable,OnlinePos奥古多媒体C{~,Eo%k!R
on beginsprite me
?SY s0O-vV ?1g:B   sel=sprite(me.spritenum) --代表自身
*a oCH)sS_)c2@   poldloc=sel.loc --棋子的原始位置奥古多媒体^ i-JCH
  pmousedown=0 --是否鼠标按下奥古多媒体;E,KI/z s+\@6w.NY
  moveEnable=1 --是否可以移动奥古多媒体 U D7@ T'a#H
  OnlinePos=[] --移动的历史记录:记录我移动完成后的位置信息和我的棋子信息(黑棋还是白棋),奥古多媒体(~g?blT^Y
End
T#o L$l_+s 奥古多媒体 iHN:SM4Ys)Yp$KOT
奥古多媒体GS6V$`[~
这里的判断原则是扫描所有交叉点,找到一个距离适当(与该点水平坐标差和垂直坐标差都要小于10),并没有棋子(即onlist[i][j]=0)的点来放好棋子。
*[,@g{R
rSt8O&v2nO on ifcloseenough me
Y c^I:EgA"n     cursor -1
$l6V\{u1@ S   --通过一个二重循环来遍历二维列表中的每个坐标点
e%T1v^T:d5h   repeat with i =1 to 18奥古多媒体 eE9X Xi*V
    repeat with j=1 to 18
] y"YZ:TQ V*Ax       奥古多媒体#gF,x&`qx)~N
      myLoc=sel.loc 奥古多媒体E#S A H|
      if abs(myLoc[1]-loclist[i][j][1])<10 and abs(myLoc[2]-loclist[i][j][2])<10 and onlist[i][j]=0 then 奥古多媒体e(P&y`:I6XB&?-[
        
Ps%_/h7_\x         --如果找到一个开放点,则放置到该位置上
&yHyUt/u7Y9n3`3R6JV         sel.loc=loclist[i][j]奥古多媒体`k M&U GU8GA$mG
        --不能在被移动奥古多媒体2OdpU/s
        sel.moveEnable=0 奥古多媒体%Iu.lS` |&xf.Y
        奥古多媒体z3q n+pQ
        if sel.member.name = "white" then --棋子信息列表记录该点棋子信息
r7Rh$`"x$u           t=1
"mDj3g;j+A           onlist[i][j]=t
iX)j+_5mt           OnlinePos=[i,j,t]
UoJaH$w/F         else奥古多媒体;B Y i&o0s%I c,wm8q
          t=-1奥古多媒体h [.Q*K%_M
          onlist[i][j]=t奥古多媒体^dM!FBJ
          OnlinePos=[i,j,t]奥古多媒体3ml5w'mN/oBWP
        end if
Vyp4P(A ?*\*M         奥古多媒体3L;hu_7A
        --检测是否有玩家获胜(具体代码稍后在讲)
L.x^ iE6v%Av         checkIT(i,j,t) 奥古多媒体/X(|'y]2b})B"]_#~
        
U t bDZ2Y:]W-KpQ         --找到点并放置好后就可以中止后面剩下的循环判断操作了,否则一直扫描完
7mU/bd7E_{ [0RT$vuS:FH         exit
XnU%rS H       end if
S0@2B~w]u     end repeat 奥古多媒体@;x,\4sS.Sm:Wl
  end repeat奥古多媒体y w ]-^^y6^0J$yL
  奥古多媒体sI6SD_ c"H1YLo
  --在上面,如果没有一个点靠得足够近,就会回原位奥古多媒体ay0ib3Cm R
  sel.loc=poldloc 奥古多媒体2T5[\s7\;\?
end

字号: | 推荐给好友

 

评分:0

我来说两句

seccode


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