新增agent用于帮助快速使用goap

This commit is contained in:
yhh
2020-10-29 17:29:38 +08:00
parent 1a78dada61
commit c9fc9ffea5
4 changed files with 83 additions and 1 deletions

View File

@@ -262,6 +262,17 @@ declare module es {
findActionIndex(action: Action): number;
}
}
declare module es {
abstract class Agent {
actions: Action[];
_planner: ActionPlanner;
constructor();
plan(debugPlan?: boolean): boolean;
hasActionPlan(): boolean;
abstract getWorldState(): WorldState;
abstract getGoalState(): WorldState;
}
}
declare module es {
class WorldState implements IEquatable<WorldState> {
values: number;

View File

@@ -1289,6 +1289,36 @@ var es;
es.ActionPlanner = ActionPlanner;
})(es || (es = {}));
var es;
(function (es) {
var Agent = (function () {
function Agent() {
this._planner = new es.ActionPlanner();
}
Agent.prototype.plan = function (debugPlan) {
if (debugPlan === void 0) { debugPlan = false; }
var nodes = null;
if (debugPlan)
nodes = [];
this.actions = this._planner.plan(this.getWorldState(), this.getGoalState(), nodes);
if (nodes != null && nodes.length > 0) {
console.log("---- ActionPlanner plan ----");
console.log("plan cost = " + nodes[nodes.length - 1].costSoFar);
console.log(" start" + "\t" + this.getWorldState().describe(this._planner));
for (var i = 0; i < nodes.length; i++) {
console.log(i + ": " + nodes[i].action.name + "\t" + nodes[i].worldState.describe(this._planner));
es.Pool.free(nodes[i]);
}
}
return this.hasActionPlan();
};
Agent.prototype.hasActionPlan = function () {
return this.actions != null && this.actions.length > 0;
};
return Agent;
}());
es.Agent = Agent;
})(es || (es = {}));
var es;
(function (es) {
var WorldState = (function () {
function WorldState(planner, values, dontcare) {

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,41 @@
module es {
/**
* Agent提供了一个简单明了的方式来使用计划书。
* 它根本不需要使用因为它只是ActionPlanner的一个方便的封装器使其更容易获得计划和存储结果。
*/
export abstract class Agent {
public actions: Action[];
public _planner: ActionPlanner;
constructor(){
this._planner = new ActionPlanner();
}
public plan(debugPlan: boolean = false){
let nodes: AStarNode[] = null;
if (debugPlan)
nodes = [];
this.actions = this._planner.plan(this.getWorldState(), this.getGoalState(), nodes);
if (nodes != null && nodes.length > 0){
console.log("---- ActionPlanner plan ----");
console.log(`plan cost = ${nodes[nodes.length - 1].costSoFar}`);
console.log(`${" start"}\t${this.getWorldState().describe(this._planner)}`);
for (let i = 0; i < nodes.length; i++){
console.log(`${i}: ${nodes[i].action.name}\t${nodes[i].worldState.describe(this._planner)}`);
Pool.free<AStarNode>(nodes[i]);
}
}
return this.hasActionPlan();
}
public hasActionPlan(){
return this.actions != null && this.actions.length > 0;
}
public abstract getWorldState(): WorldState;
public abstract getGoalState(): WorldState;
}
}