/// <summary>
/// 擷取指定的 CardPoint 的 Y 軸方向上的所有 ImageName 為 Global.EmptyImageName 的 CardPoint 集合
/// </summary>
private List<CardPoint> GetYPositions(CardPoint p)
{
var result = new List<CardPoint>() { p };
for (int i = 0; i < Global.ContainerRows; i++)
{
var point = new CardPoint(i * Global.ContainerColumns + p.X);
if (_cards[point.Position].ImageName == Global.EmptyImageName)
result.Add(point);
}
return result;
}
/// <summary>
/// 執行消去兩個卡片的任務
/// 參數為:兩個卡片對象和消去路徑的四個點(此四個點需按路徑方向依次傳入)
private void RemoveCard(CardModel c1, CardModel c2, CardPoint p1, CardPoint p2, CardPoint p3, CardPoint p4)
_cards[c1.Position] = new CardModel(Global.EmptyImageName, c1.Position);
_cards[c2.Position] = new CardModel(Global.EmptyImageName, c2.Position);
Points.Clear();
Points.Add(CardPoint2Point(p1));
Points.Add(CardPoint2Point(p2));
Points.Add(CardPoint2Point(p3));
Points.Add(CardPoint2Point(p4));
Thread thread = new Thread
(
x =>
{
Thread.Sleep(100);
_syncContext.Post
(
y =>
{
Points.Clear();
},
null
);
}
);
thread.Start();
/// CardPoint 轉換成坐标位置 Point
private Point CardPoint2Point(CardPoint cardPoint)
// 38 - 每個正方形卡片的邊長
// 19 - 邊長 / 2
// cardPoint.X * 2 - 卡片的 Padding 為 1 ,是以卡片間的間距為 2
var x = cardPoint.X * 38 + 19 + cardPoint.X * 2;
var y = cardPoint.Y * 38 + 19 + cardPoint.Y * 2;
return new Point(x, y);
/// 檢查目前是否仍然有可消除的卡片
public bool IsActive()
var currentCards = _cards.Where(p => p.ImageName != Global.EmptyImageName).ToList();
for (int i = 0; i < currentCards.Count() - 1; i++)
for (int j = i + 1; j < currentCards.Count(); j++)
if (Match(currentCards[i], currentCards[j], false))
return true;
return false;
/// 重新排列目前卡片集合
/// 并保證有可消卡片
public void Replace()
Random r = new Random();
var count = currentCards.Count;
if (count == 0)
return;
var targetImageNames = currentCards.Select(p => p.ImageName).ToList();
var targetPositions = currentCards.Select(p => p.Position).ToList();
for (int i = 0; i < count; i++)
var index = r.Next(0, count - i);
var targetImageName = targetImageNames.Skip(index).First();
var targetPosition = targetPositions.Skip(i).First();
_cards[targetPosition] = new CardModel(targetImageName, targetPosition);
targetImageNames.RemoveAt(index);
while (!IsActive())
Replace();
/// 清除卡片集合
public void Clear()
_cards.Clear();
/// 目前卡片數量
public int CardCount
get { return _cards.Where(p => p.ImageName != Global.EmptyImageName).Count(); }
/// 連連看的卡片集合
public ObservableCollection<CardModel> Cards
get { return _cards; }
private PointCollection _points;
/// 可消兩卡片的連接配接路徑上的 4 個點的集合
public PointCollection Points
get
if (_points == null)
_points = new PointCollection();
return _points;
set
_points = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("Points"));
public event PropertyChangedEventHandler PropertyChanged;
}
}
OK
<a href="http://down.51cto.com/data/101271" target="_blank">[源碼下載下傳]</a>
本文轉自webabcd 51CTO部落格,原文連結:http://blog.51cto.com/webabcd/345623,如需轉載請自行聯系原作者