Silverlight游戏开发系列:Silverlight实现"宝石迷阵"游戏
提示功能需要当前关卡所得分数超过100分才能使用。
宝石迷阵这个游戏的规则很简单,通过交换两个相连宝石的位置,使横着或竖着的相连并相同的宝石超过三个,然后消除它们,相同的越多,所得分数就越高。当交换位置后没有可消除的宝石,就把这两个相连的宝石的位置还原。
用bijou 类 来表示宝石,宝石具有Column、Row这两个属性。像这两个属性赋值时,也就修改了宝石在Grid控件里的位置:
bijou.cs
/// <summary>
/// 宝石所在的列
/// </summary>
public int Column
{
get
{
return this._column;
}
set
{
Grid.SetColumn(this, value);
this._column = value;
}
}
private int _row;
/// <summary>
/// 宝石所在的行
/// </summary>
public int Row
{
get
{
return this._row;
}
set
{
Grid.SetRow(this, value);
this._row = value;
}
}
用一个二维数组来存储所有宝石的信息
private bijou[,] bijous = new bijou[MaxColumn, MaxRow];
现在,要实现通过bijous[Column, Row] 来得到指定行和列的宝石的引用。就要保证每一个宝石在bijous中的位置不会错误,并且在Gird中的行和列也要和bijous数组的索引值一样。为此,我实现了一个索引器
索引器
/// <summary>
/// 通过列号和行号获取bijou
/// </summary>
/// <param name="Column">列号</param>
/// <param name="Row">行号</param>
/// <returns>bijou</returns>
public bijou this[int Column, int Row]
{
get
{
return bijous[Column, Row];
}
set
{
if (value != null)
{
value.Column = Column;
value.Row = Row;
bijous[Column, Row] = value;
if (!LayoutRoot.Children.Contains(value))
{
this.LayoutRoot.Children.Add(value);
}
}
else
{
bijous[Column, Row] = null;
}
}
}
在游戏中,每一个宝石都可以上下左右移动(除了位置在边缘的宝石),所以,我写了4个方法,作用是把指定宝石向四个方向移动,并指定其在没有可消除宝石的情况下是否还原。