silverlight---遊戲中的人工智能之追逐與閃躲

前言:算法

       近來在學習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 文件,修改代碼爲:

Code:
  1. <UserControl x:Class="SLAI_lesson1.MainPage"  
  2.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
  3.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
  4.     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"  
  5.     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"  
  6.     mc:Ignorable="d"  
  7.     d:DesignHeight="300" d:DesignWidth="400">  
  8.   
  9.     <Canvas x:Name="LayoutRoot" Background="White">  
  10.           
  11.     </Canvas>  
  12. </UserControl>  

把原來的<Grid x:Name="LayoutRoot" Background="white"> </Grid>

  1. 改爲--   <Canvas x:Name="LayoutRoot" Background="White">     </Canvas> 

     

     

    • 這樣作的緣由是Canvas畫布對象更方便對它裏面的對象進行絕對定位。等等咱們要把怪物和人類放到Canvas 畫布中去,進行追逐與閃躲的模擬。

    接着,咱們轉到MainPage.xmal.cs文件;整個文件的代碼以下:

     

    Code:
    1. namespace SLAI_lesson1   
    2. {   
    3.     public partial class MainPage : UserControl   
    4.     {   
    5.         Rectangle _human, _monster;      /*_human 人類 _monster 怪獸*/
    6.         DispatcherTimer _dispatchertime;   
    7.         double monsterX, monsterY, humanX, humanY;   /*怪獸和人類的座標*/
    8.         public MainPage()   
    9.         {   
    10.             InitializeComponent();   
    11.             _human = new Rectangle();   
    12.             _human.Width = 40;                         //設置矩形的寬度
    13.             _human.Height = 40;                              //設置矩形的高度
    14.             _human.Fill = new SolidColorBrush(Colors.Red);   //填充顏色
    15.             _human.SetValue(Canvas.LeftProperty, 100.0);       //設定人類的x座標
    16.             _human.SetValue(Canvas.TopProperty, 150.0);        //設置人類的y座標
    17.             _monster = new Rectangle();   
    18.             _monster.Width = 40;   
    19.             _monster.Height = 40;   
    20.             _monster.Fill = new SolidColorBrush(Colors.Black);   
    21.             _monster.SetValue(Canvas.LeftProperty, 50.0);   
    22.             _monster.SetValue(Canvas.TopProperty, 80.0);   
    23.             LayoutRoot.Children.Add(_human);   
    24.             LayoutRoot.Children.Add(_monster);   
    25.           _dispatchertime = new DispatcherTimer();   
    26.            _dispatchertime.Interval = TimeSpan.FromMilliseconds(200);   
    27.             _dispatchertime.Tick += new EventHandler(_dispatchertime_Tick);   
    28.             _dispatchertime.Start();   
    29.               
    30.                  
    31.               
    32.         }   
    33.   
    34.      void _dispatchertime_Tick(object sender, EventArgs e)   
    35.         {   
    36.       monsterX = (double)_monster.GetValue(Canvas.LeftProperty); //獲得當前怪物的x座標  
    37.       monsterY = (double)_monster.GetValue(Canvas.TopProperty);   
    38.             humanX = (double)_human.GetValue(Canvas.LeftProperty);   
    39.             humanY = (double)_human.GetValue(Canvas.TopProperty);   
    40.             Catch(monsterX, monsterY, humanX, humanY);   
    41.             RunAway(monsterX, monsterY, humanX, humanY);   
    42.             _human.SetValue(Canvas.LeftProperty, humanX);   
    43.             _human.SetValue(Canvas.TopProperty, humanY);   
    44.             _monster.SetValue(Canvas.LeftProperty, monsterX);   
    45.             _monster.SetValue(Canvas.TopProperty, monsterY);   
    46.         }   
    47.         /// <summary>   
    48.         /// 基本追逐函數   
    49.         /// </summary>   
    50.         /// <param name="moX"></param>   
    51.         /// <param name="moY"></param>   
    52.         /// <param name="huX"></param>   
    53.         /// <param name="huY"></param>   
    54.         public void Catch(double moX,double moY,double huX,double huY)   
    55.         {   
    56.                
    57.             monsterX = moX;   
    58.             monsterY = moY;   
    59.             humanX = huX;   
    60.             humanY = huY;   
    61.             if (monsterX > humanX)   //若是怪物當前座標大於人類的,就往回跑
    62.             {   
    63.                 monsterX-=4;   
    64.             }   
    65.   
    66.             else if (monsterX <humanX)   //若是怪物當前座標小於人類的,就向前追
    67.             {   
    68.                 monsterX+=4;   
    69.             }   
    70.   
    71.             if (monsterY > humanY)        //與x座標相似
    72.             {   
    73.                 monsterY-=4;   
    74.             }   
    75.             else if (monsterY < humanY)   
    76.             {   
    77.                 monsterY+=4;   
    78.             }   
    79.         }   
    80.         /// <summary>   
    81.         /// 基本閃躲算法   
    82.         /// </summary>   
    83.         /// <param name="moX"></param>   
    84.         /// <param name="moY"></param>   
    85.         /// <param name="huX"></param>   
    86.         /// <param name="huY"></param>   
    87.         public void RunAway(double moX, double moY, double huX, double huY)   
    88.         {   
    89.   
    90.             monsterX = moX;   
    91.             monsterY = moY;   
    92.             humanX = huX;   
    93.             humanY = huY;   
    94.             if (humanX> monsterX)         // 若是人類當前x座標大於怪物就繼續往前逃命
    95.             {   
    96.                 humanX+=4;   
    97.             }   
    98.   
    99.             else if (humanX < monsterX)   //若是當前人類x座標小於怪物x座標就日後逃命
    100.             {   
    101.                 humanX-=4;   
    102.             }   
    103.   
    104.             if (monsterY > humanY)   
    105.             {   
    106.                 monsterY-=4;   
    107.             }   
    108.             else if (humanY < monsterY)   
    109.             {   
    110.                humanY-=4;   
    111.             }   
    112.            
    113.            
    114.         }   
    115.     }   
    116. }  

咱們用2個rectangle 矩形表明怪獸和人類,而後在程序中放入一個dispatchertimer ,每過200ms觸發一次追逐函數和閃躲函數,而且從新設置當前的座標點,這樣。兩個矩形 就開始在屏幕上追逐與逃跑了。最後發一個運行的圖片:

相關文章
相關標籤/搜索