天天看點

上接遊戲人生Silverlight(4) - 連連看[Silverlight 2.0(c#)]

/// <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,如需轉載請自行聯系原作者