Lập trình trí tuệ nhân tạo dành cho các nhân vật (AI)

Một game sinh ra không phải bao giờ cũng chỉ có những hành động đơn giản được lập trình trước mà còn có thể tuỳ theo tình huống mà các đối tượng có những cách phản ứng hợp lý hơn gây khó khăn và tạo hứng thú cho người chơi. Bạn đâu muốn chơi một trò chơi mà những nhân vật của máy chỉ biết lao đầu vào bạn để chết đúng không?

Sau đây là phương pháp để tạo trí tuệ nhân tạo với Sprite-Kit. 

Đầu tiên bạn phải hiểu rằng, từng nhân vật bạn tạo ra là một đối tượng được điều khiển hoàn toàn riêng biệt trong Sprite-Kit. Bạn có thể add một phần điều khiển vào trong từng đối tượng này để nó có thể tránh né những viên đạn hay đuổi theo người chơi nhằm làm game thực và khó khăn hơn.

Tuy nhiên tạo ra 100 loại quái vật bạn phải ép để viết 100 loại trí tuệ nhân tạo khác nhau là việc làm hết sức nhảm nhí. Chúng ta cần tách riêng giữa nhân vật trong game và trí tuệ nhân tạo của nó, làm như vật bạn không chỉ có thể đưa bất kì trí tuệ nhân tạo (AI) cho các loại quái vật mà còn có thể thay đổi nó một cách dễ dàng. Ngoài ra việc bảo trì và sửa chữa những lỗi trong đó cũng nhẹ nhàng hơn rất nhiều so với việ ép tất cả vào trong cùng một lớp (class) nhân vật.

* Về các bước, bạn cần hiểu nó như sau:

Chúng ta sẽ chia ra làm những lớp sau để quản lý chương trình dễ dàng:

+ LKCharacterNode: là lớp cơ sở nhất của nhân vật, đây là nguồn của mọi nhân vật từ các nhân vật anh hùng (do bạn điều khiển), các loại quái vật (do máy điều khiển) đều bắt đầu từ đây.

+ LKHeroCharacter: là lớp nhân vật do người chơi điều khiển (có thể không chỉ có một vì chúng ta có thể phát triển những game multiplayer có nhiều người chơi) => Từ đây bạn có thể phát triển thành những lớp nhân vật hoàn toàn khác biệt như Chiến binh (Warrior), Pháp sư (Wizard) hay Cung thủ (Ranger) tuỳ vào game của bạn. Đây chính là đối tượng mà các quái vật tìm và tiêu diệt.

+ LKEnemyCharacter: Đây chính là đối tượng cần đến trí tuệ nhân tạo được lập trình bởi các lập trình viên. Đối với những trí tuệ nhân tạo (AI), ta chỉ cần tạo ra sau đó để chúng lên bản đồ lập tức AI sẽ điều khiển những đối tượng này và chúng sẽ tự biết làm những gì để tiêu diệt các anh hùng của chúng ta. Hay đơn giản hơn, trí tuệ nhân tạo sẽ điều khiển các quái vật này đi theo những đường mà người chơi không đoán trước được để làm cho màn chơi trở nên lý thú hơn.

* Ta sẽ đi sâu vào code hơn nữa để hiểu hơn về cách tạo trí tuệ nhân tạo này:

+ LKCharacterNode: sẽ bao gồm những thuộc tính mà bạn cần để chương trình chạy tốt ví dụ như isDead, isStun, lkHealth và những thuộc tính mà bạn cần. Trí tuệ nhân tạo cũng có thể lấy các thuộc tính này ra để xem xét những hành động của đối tượng ví dụ như khi thấy số lượng máu quá thấp nó sẽ tự động chạy trốn hay hành động như thế nào là tuỳ theo ý bạn. Phần này, mỗi người có những thuộc tính cần thiết hay khộng và mỗi game mỗi khác nên tôi sẽ không đi sâu vào nó.

+

+ LKEnemyCharacter: Đây là phần chính của hướng dẫn. Việc đính kèm một trí tuệ nhân tạo sẽ nằm ở đây.

Trong file hedader bạn sẽ cần có những dòng code sau:

#import “LKCharacterNode.h”

@class LKArtificialIntelligence;

@interface LKEnemyCharacter : LKCharacterNode

@property (nonatomic) LKArtificialIntelligence * lkIntelligent;

@end

Bạn kết nối giữa lớp LKArtificialIntelligence với lớp LKEnemyCharacter làm cho 2 lớp này cùng có thể sử dụng và gọi lẫn nhau. Lớp AI giờ là một phần của lớp LKEnemyCharacter và được sử dụng và làm bất cứ thứ gì trong lớp này. Vậy là ta có thể điều khiến chính lớp LKEnenmyCharacter bằng lớp AI này.

Trong file .m ta có những dòng code sau:

#import “LKEnemyCharacter.h”

#import “LKArtificialIntelligence.h”

 

@implementation LKEnemyCharacter

#pragma mark – Loop Update

– (void)updateWithTimeSinceLastUpdate:(CFTimeInterval)interval {

[super updateWithTimeSinceLastUpdate:interval];

[self.lkIntelligent updateWithTimeSinceLastUpdate:interval];

}

}

@end

Đây là phần điều khiển của AI được gắn vào trong đối tượng Enemy. Bạn sẽ gọi lệnh Update này để chương trinh điều khiển. Dòng code super để làm những việc điều khiển bạn đã viết trên LKCharacterNode. Còn dòng intelligent mới thực sự là dòng lệnh bạn cần để AI điều khiển đối tượng.

Thế là chương trình sẽ có phần điều khiển dành cho AI. Giờ thứ bạn cần là một AI để đối tượng hoạt động theo ý muốn của bạn.

* Phần AI: 

– AI là một đối tượng được đính kèm trong LKCharacterNode. Trong đối tượng,

* Đây là phần code tong AI header:

@class LKCharacterNode;

@interface LKArtificialIntelligence : NSObject

@property (nonatomic, weak) LKCharacterNode *character;

@property (nonatomic, weak) LKCharacterNode *target;

– (id)initWithCharacter:(LKCharacterNode *)character target:(LKCharacterNode *)target;

– (void)clearTarget:(LKCharacterNode *)target;

– (void)updateWithTimeSinceLastUpdate:(CFTimeInterval)interval;

@end

+ Như đã giải thích ở trên @class sẽ làm cho lớp này nằm trong một lớp khác và trở thành một phần của lớp kia. AI cần có đối tượng để có thể đưa ra hành động hợp lý, nó cũng cần phải biết đối tượng nó được đính kèm là đối tương nào nên 2 đối LKCharacterNode chính là 2 đối tượng đó. Ngoài ra thì AI không tự khởi tạo mà nó được khởi tạo bới lập trình viên nếu muốn nên nó cũng kèm them một lệnh init. Lệnh update để điều khiển đối tượng đi theo quỹ đạo cần thiết.

 

(Phê rồi từ từ update tiếp, để xem có ai hứng thú không chứ viết bài không ai coi buồn lắm😀 )

Tagged: , , , , , , , ,

2 thoughts on “Lập trình trí tuệ nhân tạo dành cho các nhân vật (AI)

  1. anh kiet January 10, 2014 at 7:05 am Reply

    cám ơn anh nhiều

  2. Quàng Quỳnh October 27, 2014 at 8:19 am Reply

    Up tiep di anh Huy🙂

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: