8/26/2014

AI 3.3 - Tính cách nhân vật



  3.3 - Tính cách nhân vật -

Chúng ta cũng có thể sử dụng xác suất khác nhau để tìm ra nét đặc sắc cho các nhân vật trong game. Hãy giả vờ như chúng ta đã thiết kế một bản kế hoạch cho một trò chơi quản lý dân số cho chính quyền địa phương. Chúng ta cần phải giải quyết và mô phỏng các vấn đề như thuế so với thu hút tài năng toàn cầu, nhập cư so với gắn kết xã hội, và như vậy. Chúng ta có ba lớp nhân vật trong bản kế hoạch của chúng ta, cụ thể là, công nhân, nhà khoa học và các chuyên gia.



Hiệu quả của họ trong việc thực hiện các nhiệm vụ cụ thể được định nghĩa trong bảng sau:



Chúng ta hãy xem làm thế nào để có thể thực hiện công trình này. Nói rằng người chơi cần xây dựng các căn nhà mới để thích ứng với việc tăng dân số. Một công nhân xây dựng nhà ở sẽ yêu cầu 1.000 đơn vị khối lượng công việc để hoàn thành. Chúng ta sử dụng các giá trị quy định trước đó như khối lượng công việc có thể được thực hiện trong một giây cho mỗi loại đơn vị của một công việc cụ thể. Vì vậy, nếu bạn đang xây dựng một căn nhà với một công nhân mà chỉ mất khoảng 10 giây để hoàn thành công trình (1000/95) trong khi nó sẽ mất hơn ba phút nếu bạn đang cố gắng để xây dựng với các nhà khoa học (1000/5 = 200 giây). Như vậy sẽ đúng đối với các nhiệm vụ khác như R & D và công việc hành chính. Những yếu tố này có thể được điều chỉnh / nâng cao như tiến trình game, làm cho một số nhiệm vụ ở cấp độ đầu trở nên đơn giản và tốn ít thời gian hơn.

Sau đó, chúng ta giới thiệu các vật phẩm đặc biệt có thể được phát hiện bởi các loại hình đơn vị đặc biệt. Bây giờ, chúng ta không muốn cung cấp các vật phẩm này mỗi lần một đơn vị riêng biệt đang thực hiện nhiệm vụ của họ. Thay vào đó, chúng ta muốn gây bất ngờ cho các người chơi với các vật phẩm. Vì vậy, chúng ta kết hợp xác suất tìm thấy các vật phẩm đó theo hình thức đơn vị, như được mô tả trong bảng sau:


Bảng dự đoán cho là có 30% cơ hội mà một công nhân có thể tìm thấy một số nguyên liệu thô, và 10% để kiếm được tiền thưởng bất cứ khi nào họ đang xây một nhà máy hay một ngôi nhà. Điều này cho phép các người chơi đoán được khả năng các phần thưởng sắp có, một khi họ đã thực hiện một số nhiệm vụ. Điều này có thể làm cho trò chơi thú vị hơn vì các người chơi sẽ không biết kết quả của sự kiện này.


FSM với xác suất 

Chúng ta thảo luận Máy Trạng Thái (FSM) ở Chương 2, Máy Trạng Thái, sử dụng cả hai chuyển đổi trạng thái đơn giản cũng như sử dụng framework FSM. Quyết định để chọn lựa trạng thái nào thực thi hoàn toàn dựa trên giá trị đúng hay sai giá trị của một điều kiện đưa ra. Có nhớ FSM tiếp theo của thực thể xe tăng AI điều khiển của chúng ta chứ?




Để làm cho AI thú vị hơn, và khó đoán một chút, chúng ta có thể cung cấp cho đơn vị xe tăng của chúng ta một số tùy chọn có xác suất để lựa chọn, thay vì làm điều tương tự trong một vài điều kiện nhất định được đáp ứng. Ví dụ, trong FSM trước đó của chúng ta, xe tăng AI của chúng ta sẽ đuổi theo xe tăng của người chơi khi họ đang bước vào tầm nhìn. Thay vào đó chúng ta có thể cung cấp cho AI của chúng ta một trạng thái khác, chẳng hạn như chạy trốn với một xác suất khoảng 50% như trong hình sau đây:




Bây giờ thay vì săn đuổi mọi lúc, xe tăng AI nhắm vào người chơi; có 50% cơ hội cho việc nó sẽ bỏ trốn, và có thể báo cáo với trụ sở chính hoặc một cái gì đó. Chúng ta có thể thực hiện cơ chế này giống như cách chúng ta đã làm trong ví dụ xúc xắc trước đó. Trước tiên chúng ta cần phải tạo ra một giá trị ngẫu nhiên từ một đến 100, và xem nếu giá trị nằm giữa một và 50 hoặc 51 và 100. (Hoặc chúng ta có thể chọn ngẫu nhiên giữa không và một.) Sau đó, chọn một trạng thái cho phù hợp. Một cách khác để thực hiện điều này là để điền vào một mảng với các tùy chọn tương ứng với xác suất tương ứng của chúng. Sau đó chọn một trạng thái ngẫu nhiên trong này như thể bạn đang vẽ ra một người chiến thắng xổ số. Chúng ta hãy xem làm thế nào để sử dụng kỹ thuật này trong các tập tin FSM.cs sau:

using UnityEngine;
using System.Collections;
public class FSM : MonoBehaviour {
  public enum FSMState {
    Chase,
    Flee
  }
  public int chaseProbabiilty = 50;
  public int fleeProbabiilty = 50;
  //a poll to store the states according to their
    //probabilities
  public ArrayList statesPoll = new ArrayList();

  void Start () {
    //fill the array
      for (int i = 0; i < chaseProbabiilty; i++) {
        statesPoll.Add(FSMState.Chase);
      }
      for (int i = 0; i < fleeProbabiilty; i++) {
        statesPoll.Add(FSMState.Flee);
      }
    }
  void OnGUI() {
      if (GUI.Button(new Rect(10,10,150,40),
        "Player on sight")) {
         int randomState = Random.Range(0, statesPoll.Count);
         Debug.Log(statesPoll[randomState].ToString());
      }
    }
}

Trong hàm OnGUI (), khi bạn nhấp chuột, chúng ta chỉ chọn một vật phẩm ngẫu nhiên từ mảng statesPoll. Rõ ràng, vật phẩm được nhiều bình chọn sẽ có cơ hội cao hơn để được chọn. Hãy thử nó.

AI động

Chúng ta cũng có thể sử dụng xác suất để xác định mức độ thông minh của nhân vật AI, và thiết lập toàn bộ trò chơi. Điều này có thể lần lượt ảnh hưởng đến mức độ khó khăn chung của trò chơi, và làm cho nó đầy thách thức và thú vị, vừa đủ dành cho người chơi. Như được mô tả trong cuốn sách, The Art of Game Design, Jesse Schell, các ấn phẩm của Morgan Kaufmann, người chơi sẽ chỉ tiếp tục chơi trò chơi của chúng ta nếu chúng ta giữ bọn họ trong kênh lưu lượng (flow channel).


Người chơi sẽ cảm thấy lo lắng và thất vọng nếu chúng ta nói cho họ biết cách giải quyết những thách thức khó khăn trước khi họ có những kỹ năng cần thiết. Mặt khác, một khi họ đã làm chủ được các kỹ năng, và nếu chúng ta cứ tiếp tục giữ trò chơi ở mãi một tốc độ, sau đó họ sẽ cảm thấy chán. Vùng màu xám giữ chân người chơi tham gia trong một thời gian dài, đó chính là vùng giữa hai thái cực khó và dễ, mà tác giả gọi nó là kênh lưu lượng (flow channel). Để giữ chân các người chơi trong kênh lưu lượng, các nhà thiết kế trò chơi cần phải đưa ra những thách thức và nhiệm vụ phù hợp với các kỹ năng mà người chơi đã có được theo thời gian. Tuy nhiên, đó không phải là một công việc dễ dàng  trong việc tìm ra một giá trị phù hợp với tất cả người chơi, khi mà tốc độ học hỏi và điều mong đợi của các cá nhân có thể khác nhau.

Một cách để giải quyết vấn đề này chính là thu thập sự cố gắng của người chơi và kết quả trong các buổi chơi game, và để điều chỉnh xác suất AI của đối phương cho phù hợp. Mặc dù phương pháp này được cho là sẽ giúp các game được hấp dẫn hơn, có rất nhiều người chơi khác, những người không thích cách tiếp cận này, vì phương pháp này mất đi niềm tự hào và sự hài lòng trong việc hoàn thành một trò chơi khó khăn. Dù sao đi nữa, việc đánh bại một nhân vật AI là boss vô cùng khó,  bất chấp tất cả những thách thức có thể đạt được nhiều phần thưởng và sự thỏa mãn hơn là một chiến thắng trong trò chơi chỉ vì AI ngốc. Họ sẽ cảm thấy tồi tệ hơn nhiều nếu họ phát hiện ra rằng AI trở nên ngốc nghếch chỉ bởi vì họ không có đủ kỹ năng để chiến đấu. Vì vậy, chúng ta phải cẩn thận về điều này khi chúng ta muốn áp dụng kỹ thuật này trong các trò chơi của chúng ta.


Máy đánh bạc

Demo Máy đánh bạc này cũng tương tự như ví dụ xúc xắc trước của chúng ta. Lần này chúng ta sẽ tạo ra ba con số ngẫu nhiên cho ba ống cuộn. Tiền sẽ được trả chỉ khi bạn có được ba biểu tượng giống nhau trên cùng một dòng. Để làm cho nó đơn giản hơn, chúng ta sẽ chỉ có một dòng để chơi như trong bản demo này. Và nếu người chơi thắng, trò chơi sẽ trả lại gấp 500 lần số tiền đặt cược.

Chúng ta sẽ thiết lập scene với bốn đối tượng GUI để đại diện cho ba ống cuộn, và thông báo kết quả.


Đây là đoạn script mới của chúng ta,  thể hiện trong tập tin SlotMachine.cs sau :

using UnityEngine;
using System.Collections;
public class SlotMachine : MonoBehaviour {
  public float spinDuration = 2.0f;
  public int numberOfSym = 10;
  private GameObject betResult;
  private bool startSpin = false;
  private bool firstReelSpinned = false;
  private bool secondReelSpinned = false;
  private bool thirdReelSpinned = false;
  private string betAmount = "100";
  private int firstReelResult = 0;
  private int secondReelResult = 0;
  private int thirdReelResult = 0;
  private float elapsedTime = 0.0f;
    //Use this for initialization
  void Start () {
    betResult = gameObject;
    betResult.guiText.text = "";
  }

  void OnGUI() {
    GUI.Label(new Rect(200, 40, 100, 20), "Your bet: ");
    betAmount = GUI.TextField(new Rect(280, 40, 50, 20),  betAmount, 25);
      if (GUI.Button(new Rect(200, 300, 150, 40), "Pull Liver")) {
      Start();
        startSpin = true;
      }
    }

  void checkBet() {
    if (firstReelResult == secondReelResult &&
      secondReelResult == thirdReelResult) {
        betResult.guiText.text = "YOU WIN!";
      }
    else {
      betResult.guiText.text = "YOU LOSE!";
    }
  }

    //Update is called once per frame
    void FixedUpdate () {
      if (startSpin) {
        elapsedTime += Time.deltaTime;
        int randomSpinResult = Random.Range(0,
          numberOfSym);
      if (!firstReelSpinned) {
        GameObject.Find("firstReel").guiText.text =  randomSpinResult.ToString();
      if (elapsedTime >= spinDuration) {
        firstReelResult = randomSpinResult;
        firstReelSpinned = true;
        elapsedTime = 0;
      }
    }

      else if (!secondReelSpinned) {
        GameObject.Find("secondReel").guiText.text =  randomSpinResult.ToString();
      if (elapsedTime >= spinDuration) {
        secondReelResult = randomSpinResult;
        secondReelSpinned = true;
        elapsedTime = 0;
      }

    }
      else if (!thirdReelSpinned) {
        GameObject.Find("thirdReel").guiText.text = randomSpinResult.ToString();
      if (elapsedTime >= spinDuration) {
        thirdReelResult = randomSpinResult;
          startSpin = false;
          elapsedTime = 0;
          firstReelSpinned = false;
          secondReelSpinned = false;
        checkBet();
        }
      }
    }
  }
}

Kéo thả file script vừa tạo vào betResult ở thẻ Hierarchy, và sau đó điều chỉnh vị trí guiText trên màn hình. Chúng ta có một nút gọi là Pull Lever trong hàm OnGUI (), nó sẽ thiết lập cờ startSpin thành true khi nhấp vào. Và trong hàm FixedUpdate () của chúng ta, chúng ta tạo ra một giá trị ngẫu nhiên cho mỗi ống cuộn nếu startSpin là true. Cuối cùng, một khi chúng ta đã có giá trị cho cả ba cuộn, chúng ta thiết lập lại cờ startSpin thành false. Trong khi chúng ta đang có các giá trị ngẫu nhiên cho từng cuộn, chúng ta cũng lưu vết thời gian đã mất, kể từ khi người chơi kéo đòn bẩy. Thông thường trong các khe máy thế giới thực, từng cuộn sẽ mất 3-5 giây trước khi ra kết quả. Do đó, chúng ta cũng đưa một số thời gian như đã chỉ định trong spinDuration trước khi hiển thị các giá trị ngẫu nhiên. Nếu bạn play scene và click vào nút Pull Lever, bạn sẽ thấy kết quả cuối cùng như thể hiện trong hình bên dưới:





Kể từ khi cơ hội của bạn chiến thắng là 1/100, sẽ trở nên nhàm chán nếu như bạn bị thua nhiều lần liên tiếp. Và tất nhiên nếu bạn đã từng chơi một máy đánh bạc, đây không phải là cách nó hoạt động, hoặc ít nhất là không phải nữa. Thông thường, bạn có thể có nhiều chiến thắng trong lúc chơi. Mặc dù các chiến thắng nhỏ không bù đắp cho số tiền đặt cược chính của bạn, và trong thời gian dài, hầu hết các người chơi sẽ phá sản, các khe máy sẽ tạo ra các âm thanh hình ảnh đ'ồ hoạ cho chiến thắng, mà các nhà nghiên cứu gọi là tổn thất cải trang thành chiến thắng.

Vì vậy, thay vì chỉ một cách duy nhất là giành chiến thắng- thắng lớn - chúng ta sẽ thay đổi các quy tắc một chút để nó trả ra lợi nhuận nhỏ hơn trong phiên chơi.


Xác suất lượng

Máy đánh bạc trong thực tế còn có vài thứ được gọi là Paytable and Reel Strips (PARS), giống như các tài liệu thiết kế hoàn chỉnh của máy đánh bạc. Bản kê PARS được sử dụng để xác định tỷ lệ phần trăm thanh toán, những bản ghi chép về chiến thắng, và những giải thưởng của họ,... Hiển nhiên là số lượng các phần thưởng đã thanh toán và tần số của chiến thắng cần phải được lựa chọn cẩn thận, do đó nhà cái (máy đánh bạc) có thể thu thập các phần cá cược theo thời gian, trong khi đảm bảo để trả lại phần còn lại cho người chơi để làm cho máy hấp dẫn người chơi hơn. Này được gọi là tỷ lệ hoàn vốn hoặc trả lại người chơi (RTP). Ví dụ, một máy đánh bạc có 90% RTP có nghĩa là theo thời gian máy sẽ trả lại trung bình 90% vốn của tất cả các vụ cược cho người chơi.

Trong bản demo này, chúng ta sẽ không tập trung vào việc lựa chọn các giá trị tối ưu cho nhà cái để mang lại chiến thắng và cũng không duy trì một tỷ lệ hoàn vốn đặc biệt nào, mà là để chứng minh xác suất trọng đối với các biểu tượng cụ thể, để chúng xuất hiện nhiều lần hơn bình thường . Vì vậy, hãy nói rằng chúng ta muốn làm cho biểu tượng số 0 xuất hiện nhiều hơn 20% nhờ may mắn trên ống cuộn đầu tiên và thứ ba, và để hoàn lại một vốn nhỏ của một nửa số đặt cược. Nói cách khác, một người chơi sẽ chỉ mất một nửa số đặt cược của họ nếu họ có được biểu tượng số 0 trên các cuộn đầu tiên và thứ ba, về cơ bản cải trang một mất mát như một chiến thắng nhỏ. Hiện nay, các biểu tượng số 0 có một xác suất 1/10 (0,1) hoặc 10% khả năng xuất hiện. Bây giờ chúng ta sẽ làm tăng 30% cho số 0 trên các cuộn đầu tiên và thứ ba như trong tập tin SlotMachineWeighted.cs sau:

using UnityEngine;
using System.Collections;
public class SlotMachineWeighted : MonoBehaviour {
  public float spinDuration = 2.0f;
  public int numberOfSym = 10;
  public GameObject betResult;
  private bool startSpin = false;
  private bool firstReelSpinned = false;
  private bool secondReelSpinned = false;
  private bool thirdReelSpinned = false;
  private int betAmount = 100;
  private int creditBalance = 1000;
  private ArrayList weightedReelPoll = new ArrayList();
  private int zeroProbability = 30;
  private int firstReelResult = 0;
  private int secondReelResult = 0;
  private int thirdReelResult = 0;
  private float elapsedTime = 0.0f;

Khai báo biến mới được thêm vào, chẳng hạn như zeroProbability để xác định tỷ lệ phần trăm xác suất của biểu tượng số 0 trên các cuộn đầu tiên và thứ ba. Danh sách mảng weightedReelPoll sẽ được sử dụng để điền vào tất cả các biểu tượng (0 đến 9) theo phân phối của nó, để chúng ta sau này có thể chọn một cách ngẫu nhiên từ các cuộc thăm dò như chúng ta đã làm trước đó trong ví dụ FSM của chúng ta. Và sau đó chúng ta khởi tạo danh sách trong hàm Start() như trong đoạn mã sau:

  void Start () {
    betResult = gameObject;
    betResult.guiText.text = "";
      for (int i = 0; i < zeroProbability; i++) {
        weightedReelPoll.Add(0);
      }
    nt remainingValuesProb = (100 - zeroProbability)/9;
      for (int j = 1; j < 10; j++) {
        for (int k = 0; k < remainingValuesProb; k++) {
          weightedReelPoll.Add(j);
        }
      }
    }

  void OnGUI() {
    GUI.Label(new Rect(150, 40, 100, 20), "Your bet: ");
    betAmount = int.Parse(GUI.TextField(new Rect(220, 40,  50, 20), betAmount.ToString(), 25));
    GUI.Label(new Rect(300, 40, 100, 20), "Credits: " + creditBalance.ToString());
      if (GUI.Button(new Rect(200,300,150,40),"Pull Lever")) {
        betResult.guiText.text = "";
        startSpin = true;
      }
    }

Và sau đây là hàm đảo checkBet () của chúng ta. Thay vì chỉ một chiến thắng, chúng ta đang xem xét năm điều kiện: thắng trắng, thua giả trang thành thắng, gần thua, bất kỳ hai biểu tượng giống nhau trên hàng đầu tiên và thứ ba, và tất nhiên điều kiện thua :

  void checkBet() {
    if (firstReelResult == secondReelResult &&
      secondReelResult == thirdReelResult) {
      betResult.guiText.text = "JACKPOT!";
      creditBalance += betAmount * 50;
      }
    else if (firstReelResult ==0 && thirdReelResult ==0) {
      betResult.guiText.text = "YOU WIN" +  (betAmount/2).ToString();
        creditBalance -= (betAmount/2);
      }
    else if (firstReelResult == secondReelResult) {
      betResult.guiText.text = "AWW... ALMOST JACKPOT!";
      }
    else if (firstReelResult == thirdReelResult) {
      betResult.guiText.text = "YOU WIN" +     (betAmount*2).ToString();
        creditBalance -= (betAmount*2);
      }
    else {
      betResult.guiText.text = "YOU LOSE!";
         creditBalance -= betAmount;
      }
    }

Trong hàm checkBet (), chúng ta thiết kế máy đánh bạc của chúng ta hoàn vốn 50 lần nếu họ thắng trắng, chỉ mất 50% tiền cược của họ, nếu các cuộn đầu tiên và thứ ba là 0, và hai lần nếu các cuộn đầu tiên và thứ ba giống nhau trong bất kỳ biểu tượng nào khác. Và chúng ta tạo ra giá trị cho ba cuộn trong hàm FixedUpdate () như thể hiện trong đoạn mã sau:

  void FixedUpdate () {
    if (!startSpin) {
      return;
    }
      elapsedTime += Time.deltaTime;
      int randomSpinResult = Random.Range(0, numberOfSym);
      if (!firstReelSpinned) {
         GameObject.Find("firstReel").guiText.text =   randomSpinResult.ToString();
      if (elapsedTime >= spinDuration) {
        int weightedRandom = Random.Range(0,    weightedReelPoll.Count);
          GameObject.Find("firstReel").guiText.text =   weightedReelPoll[weightedRandom].ToString();
            firstReelResult =    (int)weightedReelPoll[weightedRandom];
            firstReelSpinned = true;
            elapsedTime = 0;
          }
        }
      else if (!secondReelSpinned) {
        GameObject.Find("secondReel").guiText.text =    randomSpinResult.ToString();
      if (elapsedTime >= spinDuration) {
        secondReelResult = randomSpinResult;
        secondReelSpinned = true;
        elapsedTime = 0;
      }
    }

Đối với các cuộn đầu tiên, trong thời gian quay, chúng ta thực sự hiển thị các giá trị ngẫu nhiên thực. Nhưng một khi thời gian trôi đi, chúng ta chọn các giá trị từ cuộc thăm dò của chúng ta bằng các biểu tượng theo phân bố xác suất. Vì vậy, biểu tượng số 0 của chúng ta sẽ có nhiều hơn 30% phần trăm khả năng xuất hiện so với các số còn lại, như thể hiện trong hình bên dưới:


Trên thực tế người chơi đang thua trên lần cược của họ, nếu bạn nhận được hai biểu tượng số 0 trên các cuộn đầu tiên và thứ ba. Nhưng chúng ta làm cho nó có vẻ như một chiến thắng. Thật sự đó chỉ là một tin nhắn què ở đây, nhưng nếu chúng ta có thể kết hợp nó với đồ họa đẹp; có thể với pháo hoa, và hiệu ứng âm thanh chiến thắng hay, điều này thực sự có hiệu quả đấy và thu hút người chơi đặt cược nhiều hơn, và kéo cần gạt một lần nữa và một lần nữa.


Gần trượt

Nếu các ống cuộn đầu tiên và thứ hai có cùng một biểu tượng, khi đó chúng ta phải đưa ra các hiệu ứng gần trượt cho người chơi bằng cách đưa ra một giá trị ngẫu nhiên để cuộn thứ ba suýt gần giống như cái thứ hai. Chúng ta có thể làm điều này bằng cách kiểm tra kết quả quay ngẫu nhiên thứ ba trong lần đầu tiên. Nếu giá trị ngẫu nhiên cũng giống như các kết quả đầu tiên và thứ hai, thì đó phải là thắng trắng, và chúng ta không nên làm thay đổi kết quả. Nhưng nếu nó không phải, thì chúng ta nên thay đổi kết quả để nó đủ gần giống với hai cuộn kia. Kiểm tra các ý kiến ​​trong đoạn mã sau:

          else if (!thirdReelSpinned) {
            GameObject.Find("thirdReel").guiText.text =     randomSpinResult.ToString();
          if (elapsedTime < spinDuration) {
            return;
          }
          if ((firstReelResult == secondReelResult)     && randomSpinResult != firstReelResult) {
            randomSpinResult = firstReelResult - 1;
          if (randomSpinResult < firstReelResult)
            randomSpinResult = firstReelResult - 1;
          if (randomSpinResult > firstReelResult)
            randomSpinResult = firstReelResult + 1;
          if (randomSpinResult < 0) randomSpinResult = 9;
          if (randomSpinResult > 9) randomSpinResult = 0;
            GameObject.Find("thirdReel").guiText.text = randomSpinResult.ToString();
            thirdReelResult = randomSpinResult;
          }
          else {
            int weightedRandom = Random.Range(0, weightedReelPoll.Count);
            GameObject.Find("thirdReel").guiText.text =  weightedReelPoll[weightedRandom].ToString();
              thirdReelResult =  (int)weightedReelPoll[weightedRandom];
             }
             startSpin = false;
             elapsedTime = 0;
             firstReelSpinned = false;
             secondReelSpinned = false;
             checkBet();
          }
        }
    }


Và nếu là "Gần trượt" xảy ra, bạn sẽ thấy nó xuất hiện như sau :


Chúng ta thậm chí có thể đi xa hơn nữa bằng cách điều chỉnh xác suất trong thời gian thực dựa trên số lượng đặt cược. Nhưng mà điều đó thật đáng sợ. Một điều chúng ta có thể thêm vào trò chơi của chúng ta là một sự kiểm tra để đảm bào rằng người chơi không có thể đặt cược nhiều tiền hơn họ đã có. Ngoài ra, chúng ta có thể thêm một thông báo trò chơi kết thúc xuất hiện khi người chơi đã đặt cược tất cả tiền của họ.

Tổng kết

Trong phần AI 3. này, chúng ta được biết về các ứng dụng của xác suất trong thiết kế các trò chơi AI. Chúng ta đã thử nghiệm với một số kỹ thuật bằng cách thực hiện chúng trong Unity3D. Như một điểm thưởng, chúng ta cũng đã tìm hiểu về những điều cơ bản về cách thức một máy đánh bạc hoạt động, và thực hiện một trò chơi về máy đánh bạc đơn giản bằng cách sử dụng Unity3D. Xác suất trong trò chơi AI chính là việc trò chơi và các nhân vật có vẻ thực tế hơn bằng cách thêm vào một số sự đoán không chắc chắn, vì vậy mà các người chơi không thể dự đoán một cái gì đó chắc chắn. Một trong những tập quán chung và định nghĩa của xác suất là để đo lường khả năng của một sự kiện mong muốn có thể xảy ra trong tất cả các sự kiện khác. Một tài liệu tham khảo tốt để nghiên cứu thêm các kỹ thuật tiên tiến trên xác suất trong trò chơi AI, chẳng hạn như quyết định sự không chắc chắn sử dụng các kỹ thuật Bayesian, đó sẽ là AI for Game Developers David M. Bourg, Glenn Seeman, O'Reilly. Trong phần tiếp theo, chúng ta sẽ xem cách cài đặt các bộ cảm biến, và làm thế nào chúng có thể được sử dụng để làm cho AI của chúng ta nhận thức được môi trường xung quanh.




No comments:

Post a Comment