五、把扑克控件添加到容器控件中
在游戏的开始,仅有屏幕下部存在扑克。其中,从左边起的前4列各有7张随机生成的扑克,后4列放置6张随机生成的扑克。相关代码如下:
for (int i = 7 * column; i < 7 * (column + 1); i++) {
Canvas.SetLeft(arrPoker[i], (double)PlaceHolder[8 + column].X);
Canvas.SetTop(arrPoker[i], (double)PlaceHolder[8 + column].Y + LARGE_OFFSET * (i - 7 * column));
TableauPiles[column].Add(arrPoker[i]);
cardContainer.Children.Add(arrPoker[i]);
}
}
for (int column = 0; column < 4; column++){
for (int i = 6 * column + 28; i < 6 * column + 34; i++){
Canvas.SetLeft(arrPoker[i], (double)PlaceHolder[12 + column].X);
Canvas.SetTop(arrPoker[i], (double)PlaceHolder[12 + column].Y + LARGE_OFFSET * (i - 6 * column - 28));
TableauPiles[column + 4].Add(arrPoker[i]);
cardContainer.Children.Add(arrPoker[i]);
}
}
上面代码通过二个简单的二重foreach循环语句把生成的随机顺序的52张扑克依次添加到容器控件cardContainer中。
六、开始玩游戏
通过菜单控件来控制本游戏的总体流程不但简化了程序设计而且使程序操作类似于传统桌面应用。启动游戏的代码如下所示:
string sText = (sender as MenuItem).MenuText.Trim();
switch (sText) {
case "Start":
InitAndStartGame();
bStart = true;
break;
//…省略其他
七、再次玩游戏
作为一个完整的游戏程序,提供重玩游戏是基本的要求。顾名思义,在重新开始下一场游戏前应当把所有数据结构恢复到其最初的数据状态。事实上,这里面还存在一定的技巧。一方面,恢复工作依赖于你所使用的数据结构;另一方面,恢复工作还依赖于我们从何位置启动这个恢复操作。本游戏中使用的恢复操作相关代码如下:
{
string sText = (sender as MenuItem).MenuText.Trim();
switch (sText) {
case "Start":
InitAndStartGame();
break;
//…省略其他
在此,通过调用一个助理方法InitAndStartGame,把所有内容准备就绪。
下面,我们看一下在纸牌游戏和空当接龙游戏初始化阶段的主要区别。
if (timer != null) {
timer.Tick -= new EventHandler(timer_Tick);
timer.Stop();
timer = null;
}
zIndexForAll = 0;
PlaceHolder = null;
timer = new DispatcherTimer();
timer.Interval = new TimeSpan(0, 0, 1);
timer.Tick += new EventHandler(timer_Tick);
InitPlaceHolder();
TableauPiles = null;
FoundationPiles = null;
TableauPiles = new List[8];
for (int i = 0; i < 8; i++)
TableauPiles[i] = new List();
FoundationPiles = new List[4];
for (int i = 0; i < 4; i++)
FoundationPiles [i] = new List();
InverseBehaviorArray = null;
InverseBehaviorArray = new InverseColorClickBehavior[52];
for (int i = 0; i < 52; i++)
InverseBehaviorArray[i] = new InverseColorClickBehavior();
GenerateAndDealCards();
for (int i = 0; i < 4; i++)
Cells[i] = null;
nMaxMovingCards = 13;
iGlobalCellsIII = -1;
iGlobalBottomColumn = -1;
iGlobalBottomColumn2 = -1;
iGlobalCellsColumn = -1;
bStart = false;
timeStart = new DateTime();
timeStart = DateTime.Now;
timer.Start();
}
首先,初始化两个重要结构:TableauPiles和FoundationPiles。在此,我们使用数据结构TableauPiles存储游戏主界面底部的8列扑克,而数据结构FoundationPiles用于存储回收单元中的4列扑克。
接下来,我们创建52个InverseColorClickBehavior类型的行为,它们分别用于关联到52张不同的扑克上。再次强调,在Silverlight编程中,一个行为只能关联到一个UI元素上。
最后应当注意的是,鼠标相关事件的订阅是在MainPage控件的MainPage_Loaded方法中完成的,而不是在上面的InitAndStartGame方法中,恕不再赘举有关代码。