前言:算法
近來在學習silverlight ,WPF,天天都沉浸在編程和設計的海洋中。感受光學不練習沒成就感啊,因此決定來這裏寫點東西,畢竟好久沒寫文章了,哈哈哈。好了,廢話很少說了,開始silverlight與遊戲中的人工智能之旅啦~~~express
本課的重點是追逐和閃躲,相信玩過遊戲的都知道,不管你是玩太空戰機的射擊遊戲,仍是策略模擬遊戲,或者是角色扮演遊戲,遊戲中的非玩家角色,也就是NPC若是有機會,都會來追殺你,或者看到本身的生命值很少的時候,逃離你。編程
追逐和閃躲主要由兩部分組成:windows
1.作出追或者逃跑的策略。less
2.開始追逐,或者逃跑。函數
若是更加複雜一些的話,除了這個以外。還包括一部分,就是在追逐或者逃跑的過程當中避開障礙物。這一部分,今天咱們不考慮,之後再說,嘿嘿。學習
如今咱們的目的已經明確了,而後,相信聰明的你一下就能想出解決的方法:人工智能
在每次遊戲循環中,更新追逐者的座標,讓追逐者的座標離被追的愈來愈近(^^ 追女孩子也是這樣的),緊追不捨啊。。。這種方法雖然簡單,可是是不考慮追逐者和被追的各自的行進方向和速度的。所以在實際應用中,遊戲中須要整合實時的物理引擎,而後考慮位置和速度,讓追逐者試着攔截被追的,而不是像如今同樣一直傻乎乎的追逐下去,若是速度同樣,就追不到了~~今天咱們就利用silverlight這個美女(我感受silverlight是女的,不知道是否是~?~)來設計咱們的第一個追逐閃躲程序。spa
開發環境:Silberlight 4 ,Visual Studio 2010,windows7;設計
1.首先建立一個Silberlight Application----命名有SLAI—lesson1;
2.打開MainPage.xaml 文件,修改代碼爲:
- <UserControl x:Class="SLAI_lesson1.MainPage"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- mc:Ignorable="d"
- d:DesignHeight="300" d:DesignWidth="400">
-
- <Canvas x:Name="LayoutRoot" Background="White">
-
- </Canvas>
- </UserControl>
把原來的<Grid x:Name="LayoutRoot" Background="white"> </Grid>
- 改爲-- <Canvas x:Name="LayoutRoot" Background="White"> </Canvas>
- 這樣作的緣由是Canvas畫布對象更方便對它裏面的對象進行絕對定位。等等咱們要把怪物和人類放到Canvas 畫布中去,進行追逐與閃躲的模擬。
接着,咱們轉到MainPage.xmal.cs文件;整個文件的代碼以下:
- namespace SLAI_lesson1
- {
- public partial class MainPage : UserControl
- {
- Rectangle _human, _monster; /*_human 人類 _monster 怪獸*/
- DispatcherTimer _dispatchertime;
- double monsterX, monsterY, humanX, humanY; /*怪獸和人類的座標*/
- public MainPage()
- {
- InitializeComponent();
- _human = new Rectangle();
- _human.Width = 40; //設置矩形的寬度
- _human.Height = 40; //設置矩形的高度
- _human.Fill = new SolidColorBrush(Colors.Red); //填充顏色
- _human.SetValue(Canvas.LeftProperty, 100.0); //設定人類的x座標
- _human.SetValue(Canvas.TopProperty, 150.0); //設置人類的y座標
- _monster = new Rectangle();
- _monster.Width = 40;
- _monster.Height = 40;
- _monster.Fill = new SolidColorBrush(Colors.Black);
- _monster.SetValue(Canvas.LeftProperty, 50.0);
- _monster.SetValue(Canvas.TopProperty, 80.0);
- LayoutRoot.Children.Add(_human);
- LayoutRoot.Children.Add(_monster);
- _dispatchertime = new DispatcherTimer();
- _dispatchertime.Interval = TimeSpan.FromMilliseconds(200);
- _dispatchertime.Tick += new EventHandler(_dispatchertime_Tick);
- _dispatchertime.Start();
-
-
-
- }
-
- void _dispatchertime_Tick(object sender, EventArgs e)
- {
- monsterX = (double)_monster.GetValue(Canvas.LeftProperty); //獲得當前怪物的x座標
- monsterY = (double)_monster.GetValue(Canvas.TopProperty);
- humanX = (double)_human.GetValue(Canvas.LeftProperty);
- humanY = (double)_human.GetValue(Canvas.TopProperty);
- Catch(monsterX, monsterY, humanX, humanY);
- RunAway(monsterX, monsterY, humanX, humanY);
- _human.SetValue(Canvas.LeftProperty, humanX);
- _human.SetValue(Canvas.TopProperty, humanY);
- _monster.SetValue(Canvas.LeftProperty, monsterX);
- _monster.SetValue(Canvas.TopProperty, monsterY);
- }
- /// <summary>
- /// 基本追逐函數
- /// </summary>
- /// <param name="moX"></param>
- /// <param name="moY"></param>
- /// <param name="huX"></param>
- /// <param name="huY"></param>
- public void Catch(double moX,double moY,double huX,double huY)
- {
-
- monsterX = moX;
- monsterY = moY;
- humanX = huX;
- humanY = huY;
- if (monsterX > humanX) //若是怪物當前座標大於人類的,就往回跑
- {
- monsterX-=4;
- }
-
- else if (monsterX <humanX) //若是怪物當前座標小於人類的,就向前追
- {
- monsterX+=4;
- }
-
- if (monsterY > humanY) //與x座標相似
- {
- monsterY-=4;
- }
- else if (monsterY < humanY)
- {
- monsterY+=4;
- }
- }
- /// <summary>
- /// 基本閃躲算法
- /// </summary>
- /// <param name="moX"></param>
- /// <param name="moY"></param>
- /// <param name="huX"></param>
- /// <param name="huY"></param>
- public void RunAway(double moX, double moY, double huX, double huY)
- {
-
- monsterX = moX;
- monsterY = moY;
- humanX = huX;
- humanY = huY;
- if (humanX> monsterX) // 若是人類當前x座標大於怪物就繼續往前逃命
- {
- humanX+=4;
- }
-
- else if (humanX < monsterX) //若是當前人類x座標小於怪物x座標就日後逃命
- {
- humanX-=4;
- }
-
- if (monsterY > humanY)
- {
- monsterY-=4;
- }
- else if (humanY < monsterY)
- {
- humanY-=4;
- }
-
-
- }
- }
- }
咱們用2個rectangle 矩形表明怪獸和人類,而後在程序中放入一個dispatchertimer ,每過200ms觸發一次追逐函數和閃躲函數,而且從新設置當前的座標點,這樣。兩個矩形 就開始在屏幕上追逐與逃跑了。最後發一個運行的圖片: