先看效果

完整代码在此下载/Aimeast/SLAnyHanoi.zip

简单的把设计说明一下

ViewModel 和 Model 的设计如下:

用到了其中的动画效果用的是自己实现的行为(Behavior)。

using System;
using System.Windows;
using System.Windows.Interactivity;
using System.Windows.Media.Animation;namespace AnyHanoi
{public class DiscFluidMoveBehavior : Behavior<FrameworkElement>{public Point Translate{get { return (Point)GetValue(TranslateProperty); }set { SetValue(TranslateProperty, value); }}// Using a DependencyProperty as the backing store for Translate.  This enables animation, styling, binding, etc...public static readonly DependencyProperty TranslateProperty =DependencyProperty.Register("Translate", typeof(Point), typeof(DiscFluidMoveBehavior), new PropertyMetadata(Translate_PropertyChangedCallback));private static void Translate_PropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e){Point p = (Point)e.NewValue;DiscFluidMoveBehavior b = (DiscFluidMoveBehavior)d;try{b.Update(p);}catch { }}private void Update(Point p){Storyboard storyboard = new Storyboard();DoubleAnimation x = new DoubleAnimation();DoubleAnimation y = new DoubleAnimation();x.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath("(UIElement.RenderTransform).(CompositeTransform.TranslateX)"));y.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath("(UIElement.RenderTransform).(CompositeTransform.TranslateY)"));x.Duration = this.Duration;y.Duration = this.Duration;x.To = p.X;y.To = p.Y;Storyboard.SetTarget(x, base.AssociatedObject);Storyboard.SetTarget(y, base.AssociatedObject);storyboard.Children.Add(x);storyboard.Children.Add(y);storyboard.Begin();}public Duration Duration{get { return (Duration)GetValue(DurationProperty); }set { SetValue(DurationProperty, value); }}// Using a DependencyProperty as the backing store for Duration.  This enables animation, styling, binding, etc...public static readonly DependencyProperty DurationProperty =DependencyProperty.Register("Duration", typeof(Duration), typeof(DiscFluidMoveBehavior), new PropertyMetadata(new Duration(TimeSpan.FromSeconds(0.1))));}
}

需要事先引用 Expression 的 System.Windows.Interactivity 程序集。

把这个行为应用到每个Items。

AI的设计如下:

方法是递归求解。

基本思想和标准状态的思想是一样的。把最大的盘子移动到某个目标柱子,需要找到一个暂存柱子。然后按照这一思想进行递归求解。直到剩下最后一个盘子,就可以直接移动。

递归求解的核心代码如下

        private void RecSolve(Puzzle puzzle){int max = 0;Peg maxPeg = null;//找出当前状态下最大盘子所在的柱子foreach (Peg peg in puzzle.PegCollection){if (peg.Count > 0 && max < peg.Buttom){max = peg.Buttom;maxPeg = peg;}}//当前状态只有一个盘子,直接移动if (puzzle.PegA.Count + puzzle.PegB.Count + puzzle.PegC.Count == 1){if (maxPeg.PegID != puzzle.DestPeg)Move(maxPeg, puzzle.GetPeg(puzzle.DestPeg));return;}//当前状态有多个盘子if (maxPeg.PegID == puzzle.DestPeg) //最大的盘子就在目标柱子上,不需要移动{RecSolve(puzzle.NewLevelPuzzle(maxPeg.PegID, puzzle.DestPeg));}else //最大的盘子不在目标柱子上,需要移动{//找出临时柱子,即 不是 目标柱子 也不是 最大盘子所在的柱子Pegs tempPagID = Pegs.A;if (tempPagID == maxPeg.PegID || tempPagID == puzzle.DestPeg) tempPagID = Pegs.B;if (tempPagID == maxPeg.PegID || tempPagID == puzzle.DestPeg) tempPagID = Pegs.C;//把当前状态 去掉最大盘子以后的新状态 继续递归处理//这一步把所有盘子都移动到临时柱子上RecSolve(puzzle.NewLevelPuzzle(maxPeg.PegID, tempPagID));//把当前最大盘子移动到目标柱子上Move(maxPeg, puzzle.GetPeg(puzzle.DestPeg));//把上一步处理好的状态 去掉最大的盘子以后的状态//即 所有盘子都在临时柱子 的 状态移动到目标状态RecSolve(puzzle.NewLevelPuzzle(puzzle.DestPeg, puzzle.DestPeg));}}

欢迎大家的评论!

转载于:https://www.cnblogs.com/Aimeast/archive/2011/04/02/2003917.html

【Silverlight】汉诺塔游戏,带AI相关推荐

  1. 汉诺塔游戏(java)

    大家好,今天我们来解决一个很有意思的游戏:汉诺塔游戏. 先来带大家了解下这个汉诺塔游戏吧! 汉诺塔由来:法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一 ...

  2. c语言 汉诺塔游戏下载,使用C语言解决益智游戏——“汉诺塔”

    说明: 文章所有内容截选自实验楼教程[3个C语言实例带你掌握递归方法论],教程里还有两个实例,感兴趣的可以点击查看: 文章主要是带你通过解决这个游戏来利用递归解决实际问题并掌握其核心思想,懂得如何使用 ...

  3. python汉诺塔游戏_Python实战:搭建汉诺塔小游戏,快和小伙伴一起玩玩吧

    汉诺塔游戏:看谁能在短时间内将排好顺序的圈,按同样的顺放在另一根柱子上,每次只能动一个. 今天用python搭建汉诺塔小游戏(简约版) 代码亲测有效!源代码如下: #左中右塔用一个列表存储 left ...

  4. 【使用递归玩通关汉诺塔游戏】算法01-递归(斐波那契数列、汉罗塔问题)-java实现

    递归 定义:在一个方法(函数)的内部调用该方法(函数)本身的编程方式 简而言之就是 "自己调自己" 在玩游戏之前让我们先对递归有一个简单的了解吧! 5.1 递归简介 递归必须有一个 ...

  5. Py:递归求解汉诺塔,简单的几行编程可以搞定很高层的三柱汉诺塔游戏

    Py:递归求解汉诺塔,简单的几行编程可以搞定很高层的三柱汉诺塔游戏 目录 输出结果 核心代码 输出结果 核心代码 def hanoi(n,x,y,z):if n==1:print(x,'--→',z) ...

  6. 汉诺塔游戏的python实现——递归函数

    汉诺塔游戏python实现 def move(n, a, b, c): if n == 1: print('move', a, '-->', c) else: move(n-1, a, c, b ...

  7. Python案例:汉诺塔游戏

    Python案例:汉诺塔游戏 游戏规则: (1)一次只能移动一个环 (2)小环必须在大环之上

  8. CCF NOI1070 汉诺塔游戏

    问题链接:CCF NOI1070 汉诺塔游戏. 时间限制: 1000 ms  空间限制: 262144 KB 题目描述 汉诺塔由编号为1到n大小不同的圆盘和三根柱子a,b,c组成,编号越小盘子越小.开 ...

  9. 要理解递归,得先理解递归--用Java语言由浅入深讲解汉诺塔游戏

    2019独角兽企业重金招聘Python工程师标准>>> 一.递归是什么? 定义:程序调用自身的编程技巧称为递归.它分为调用阶段和回退阶段,递归的回退顺序是它调用顺序的逆序. 递归使用 ...

  10. python玩汉诺塔游戏攻略

    def hanio(n,x,y,z):'汉诺塔游戏攻略'if n == 1:print('%s-->%s'%(x,z))else:#将n-1个从x放到y上 借助zhanio(n-1,x,z,y) ...

最新文章

  1. python爬虫项目实例-Python爬虫开发与项目实战
  2. Hadoop前期准备--centos7
  3. 猫狗收养所问题(指针模拟)
  4. c 对一个mysql数据库进行操作_用C语言操作MySQL数据库
  5. MySQL动态行转列
  6. php程序员学什么语言好就业_2019年初中毕业生学什么专业好?学什么专业好就业?...
  7. Selenium2+python自动化35-获取元素属性
  8. STM32平台SD卡的FatFS文件系统开发
  9. c语言结构体定义常量,C语言结构体
  10. Spring boot整合人大金仓(KingBaseEs)国产数据库
  11. 投影仪服务器响应失败,投影仪几种常见问题现象分析,投影仪故障问题
  12. 基于Node.js实现一个小小的爬虫
  13. 【登录界面】vue、element-ui登录界面模板
  14. 怎样查看计算机注册表上的游戏,win7 32位旗舰版电脑中如何通过注册表修复游戏登陆问题...
  15. 波束形成算法学习笔记之一(Endfire,broadside)
  16. Prometheus监控以及告警配置
  17. 【机械仿真】基于matlab打桩机运动学仿真【含Matlab源码 2101期】
  18. 如何更新服务器系统教程,服务器操作系统如何更新
  19. Webview 打开qq聊天窗口,申请进群
  20. 设计模式之美总结(创建型篇)

热门文章

  1. 计算机底层书籍三件套--大话计算机
  2. golang中的collection
  3. golang中的strings.Split
  4. CMSIS对异常和中断标识符、中断处理函数名以及中断向量异常号都有严格的要求。
  5. 技术领导力实战笔记一
  6. netty-阻塞模式,非阻塞模式
  7. leetcode 1: 找出两个数相加等于给定数 two sum
  8. 基于可靠消息方案的分布式事务(四):接入Lottor服务
  9. 2.14 文件和目录权限chmod
  10. 助你成长为优秀的程序员 杰出的软件工程师、设计师、分析师和架构师