在本篇中,我们将讨论空当接龙游戏开发中的基础编程工作。
一、定义全局变量
本游戏中使用的关键数据结构列举如下:
private int nMaxMovingCards=13;
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数组,用于记录下部的8叠扑克。
InverseBehaviorArray:一个InverseColorClickBehavior数组,用于关联到52张扑克中以实现反色效果。
关于另外几个变量的作用,在此不再赘述。在接下来的文章中将结合代码介绍其作用。
二、选择移动多张扑克的对话框
在空当接龙游戏中,当你可能要移动多张扑克时将弹出一个对话框MoveMultiCardsDlg,如下图所示。你可以根据情况,选择移动一张还是多张。
注意到,在上图游戏主界面中,在我们刚刚单击过的下部栈区存在一组有序的扑克,而当前单击的这一列为空。此时将弹出一个相关对话框提示你想要把一张还是多张扑克移动到这个空栏。而移动扑克的实际张数依赖于可用的中介单元的总数而定。
三、初始化占位符
为了方便确定扑克的位置,我们在本游戏中也引入了一个称为PlaceHolder的List列表。我们共定义了16个占位符,它们的初始化是在游戏初始化的InitPlaceHolder方法中实现的。主要实现代码如下:
private void InitPlaceHolder(){
PlaceHolder=new List(16);
PlaceHolder.添加(新矩形(3 +填充、0 +填充、宽度、边界=?”Height1));//cell1
//÷云渌?/p>
占位符。添加(新矩形(343 +填充,0 +填充、宽度、边界=?”Height1));//topright1
//÷云渌?/p>
占位符。添加(新矩形(114 + 0 +填充,填充、宽度、边界=?”Height2));//bottom1
//÷云渌?/p>
}
16个占位符中,4个相应于左上方的可用单元,4个相应于右上方的回收单元,剩下的8个对应于下部8列。
下面,我们来讨论如何使用上面定义好的数据结构来生成扑克与发牌的问题。
<强>四、生成扑克与发牌强>
首先,发牌操作是在GenerateAndDealCards方法中实现的。
(1)生成52张随机顺序的扑克
首先,应当以随机的顺序生成52张扑克:
私人空GenerateAndDealCards () {
卡[]arrPoker=新卡[52];[]
卡OrderPoker=新卡[52];
int [] RandomI=new int [52];
int curNum;
RandomKDiffer(0, 51岁,52岁,RandomI);
(int i=0;我& lt;52个;我+ +){
curNum=我& lt;13吗?我+ 1:((i + 1) % 13==0 ?13:(i + 1) % 13);//范围1 ~ 13
如果(我& lt;13)//经历
OrderPoker[我]=新卡(curNum Suits.Clubs);
else if(我& lt;26)//这边是