private bool IsValidMove(HanoiDisc disc, DiscStack toStack) { if ((stacks[toStack].Count > 0 && stacks[toStack].Peek().Size > disc.Size)) { disc.SetValue(Canvas.TopProperty, disc.OriginalTop); disc.SetValue(Canvas.LeftProperty, disc.OriginalLeft); if (App.GameData.GameSettings.VibrateOnInvalidMove) { VibrateController.Default.Start(TimeSpan.FromSeconds(.25)); } return false; } if (disc.DiscStack != toStack) { moves++; } if (App.GameData.GameSettings.PlaySounds) { float volume = Convert.ToSingle(App.GameData.GameSettings.SoundVolume / 100); effect.Play(volume, 0f, 0f); } return true; }
private static void LoadDiscData(List<HanoiDisc> col1, List<SaveDiscData> listSaveDiscData) { for (int i = 0; i <= listSaveDiscData.Count - 1; i++) { SaveDiscData discData = listSaveDiscData[i]; HanoiDisc hanoiDisc = new HanoiDisc(); hanoiDisc.OriginalLeft = discData.OriginalLeft; hanoiDisc.OriginalTop = discData.OriginalTop; hanoiDisc.SetValue(Canvas.LeftProperty, discData.Left); hanoiDisc.SetValue(Canvas.TopProperty, discData.Top); hanoiDisc.Size = discData.Size; hanoiDisc.DiscStack = discData.DiscStack; col1.Add(hanoiDisc); } }
private void BuildStack(List<HanoiDisc> discs, DiscStack discStack, int count, bool reload) { for (int i = 0; i <= count; i++) { HanoiDisc hanoiDisc; if (!reload) { hanoiDisc = new HanoiDisc(); discs.Add(hanoiDisc); } else { hanoiDisc = discs[i]; } double left = ((double)(hanoiDisc.GetValue(Canvas.LeftProperty)) == 0 ? leftSpacing : (double)hanoiDisc.GetValue(Canvas.LeftProperty)); double top = ((double)(hanoiDisc.GetValue(Canvas.TopProperty)) == 0 ? topStart : (double)hanoiDisc.GetValue(Canvas.TopProperty)); hanoiDisc.SetValue(Grid.ColumnProperty, 0); hanoiDisc.VerticalAlignment = System.Windows.VerticalAlignment.Bottom; hanoiDisc.HorizontalAlignment = System.Windows.HorizontalAlignment.Center; hanoiDisc.CacheMode = new BitmapCache(); if (hanoiDisc.Size == 0) hanoiDisc.Size = i; double scalex = (hanoiDisc.Size * .058); double scaley = (hanoiDisc.Size * .0549); hanoiDisc.RenderTransform = new ScaleTransform() { ScaleX = 1 - scalex, ScaleY = 1 - scaley }; hanoiDisc.ScaleX = scalex; hanoiDisc.ScaleY = scaley; if (i > 0 && !reload) { HanoiDisc previousDisc = discs[i - 1]; top = (double)previousDisc.GetValue(Canvas.TopProperty) - (topSpacing - (topSpacing * scaley)); left = leftSpacing + ((double)previousDisc.LayoutRoot.Width * scalex) / 2; } hanoiDisc.Color = hanoiDisc.Size % 2 > 0 ? "Gold" : "Grey"; hanoiDisc.SetValue(Canvas.LeftProperty, left); hanoiDisc.SetValue(Canvas.TopProperty, top); hanoiDisc.SetValue(Canvas.ZIndexProperty, 100 + hanoiDisc.Size); hanoiDisc.DiscStack = discStack; if (!stackRows.ContainsKey(hanoiDisc.Size)) stackRows.Add(hanoiDisc.Size, top); } }
public void SetCurrentDiscStack(HanoiDisc current) { DiscStack stack = current.DiscStack; double currentWidth = current.LayoutRoot.Width; double left = (double)current.GetValue(Canvas.LeftProperty) + ((currentWidth - (currentWidth * current.ScaleX)) / 2); stack = GetDiscStackDestination(stack, left); MoveDiscToStack(current, stack); }
public void MoveDiscToStack(HanoiDisc disc, DiscStack toStack) { if (!IsValidMove(disc, toStack)) return; stacks[disc.DiscStack].Pop(); double top = topStart; if (stacks[toStack].Count > 0) { top = (double)stacks[toStack].Peek().GetValue(Canvas.TopProperty) - (topSpacing - (topSpacing * disc.ScaleY)); } else { top = (topStart + (topSpacing * disc.ScaleY)); } App.Current.RootVisual.Dispatcher.BeginInvoke(() => { double left = stackColumns[toStack] + ((double)disc.LayoutRoot.Width * disc.ScaleX) / 2; disc.SetValue(Canvas.TopProperty, top); disc.SetValue(Canvas.LeftProperty, left); }); stacks[toStack].Push(disc); disc.DiscStack = toStack; if (MoveCompleted != null) MoveCompleted(this, new MoveCompletedEventArgs(moves)); CheckForWin(); }
public bool IsCurrentDiscOnTop(HanoiDisc current) { if (stacks[current.DiscStack].Peek() == current) return true; return false; }
public int GetDiscIndex(HanoiDisc current) { HanoiDisc[] discs = stacks[current.DiscStack].ToArray(); return Array.IndexOf(discs, current); }
public HanoiDisc GetDiscBelowCurrent(HanoiDisc current) { HanoiDisc[] discs = stacks[current.DiscStack].ToArray(); int index = Array.IndexOf(discs, current); if (index - 1 > 0) { return discs[index - 1]; } return null; }