在本篇中,我们将讨论空当接龙游戏开发中的基础编程工作。
一、定义全局变量
本游戏中使用的关键数据结构列举如下:
DispatcherTimer timer;
private Card CurrentCard;
private Card InverseColorCard;
private Card SecondInverseColorCard;
private Card PreviousMatchedCardInSeryAtBottom;
private List topElementList;
Card PreviousMatchedCardInCells;
int iGlobalCellsIII = -1;
List PlaceHolder;
Card[] Cells=new Card[4];
List[] FoundationPiles ;
List[] TableauPiles;
DateTime timeStart;
int zIndexForAll = 0;
private Cursor originalCursor;
private GameOver gameoverDlg;
private MoveMultiCardsDlg MoveMultiCardsDlg;
InverseColorClickBehavior[] InverseBehaviorArray;
int iGlobalBottomColumn = -1;
int iGlobalBottomColumn2 = -1;
int iGlobalCellsColumn = -1;
下面分别给出这些变量的作用介绍。
nMaxMovingCards:用于限制底部可移动的最大扑克数。
timer:一个定时器控件,用于控制游戏总进程。
CurrentCard:用于存储当前扑克。当你单击左上方可用单元或下部发牌区的任意一张扑克(除去右上方的回收单元)时,当前扑克即被存储到此变量中。
InverseColorCard:用于存储当前的反色扑克。
SecondInverseColorCard:用于存储屏幕下部最近出现的反色扑克。
topElementList:用于记录屏幕下部可能存在的有效扑克序列,这个序列中的扑克将从一列移动到另一列上。
PreviousMatchedCardInSeryAtBottom:与变量topElementList联合应用,用于标记下部的有效序列中的第一张扑克。
Cells:一个Card数组,用于记录屏幕左上方右用单元区的4张扑克。
FoundationPiles:一个List
TableauPiles:一个List
InverseBehaviorArray:一个InverseColorClickBehavior数组,用于关联到52张扑克中以实现反色效果。
关于另外几个变量的作用,在此不再赘述。在接下来的文章中将结合代码介绍其作用。
二、选择移动多张扑克的对话框
在空当接龙游戏中,当你可能要移动多张扑克时将弹出一个对话框MoveMultiCardsDlg,如下图所示。你可以根据情况,选择移动一张还是多张。
注意到,在上图游戏主界面中,在我们刚刚单击过的下部栈区存在一组有序的扑克,而当前单击的这一列为空。此时将弹出一个相关对话框提示你想要把一张还是多张扑克移动到这个空栏。而移动扑克的实际张数依赖于可用的中介单元的总数而定。
三、初始化占位符
为了方便确定扑克的位置,我们在本游戏中也引入了一个称为PlaceHolder的List
PlaceHolder = new List(16);
PlaceHolder.Add(new Rect(3 + PADDING, 0 + PADDING, WIDTH, HEIGHT1));//cell1
//……省略其他
PlaceHolder.Add(new Rect(343 + PADDING, 0 + PADDING, WIDTH, HEIGHT1));//topright1
//……省略其他
PlaceHolder.Add(new Rect(0 + PADDING, 114 + PADDING, WIDTH, HEIGHT2));//bottom1
//……省略其他
}
16个占位符中,4个相应于左上方的可用单元,4个相应于右上方的回收单元,剩下的8个对应于下部8列。
下面,我们来讨论如何使用上面定义好的数据结构来生成扑克与发牌的问题。