Mercurial > eagle-eye
view agent.pl @ 52:d2ac1e198ce4
implement a new agent based on Decision Tree (Decision::ParseTree)
author | "Rex Tsai <chihchun@kalug.linux.org.tw>" |
---|---|
date | Mon, 20 Oct 2008 19:07:53 +0800 |
parents | |
children | 2d3c394b7940 |
line wrap: on
line source
#!/usr/bin/perl use strict; use Ikariam; use Data::Dumper; use Decision::ParseTree q{ParseTree}; use YAML qw/LoadFile Dump/; package Ikariam::Cities::Rules; use strict; use Data::Dumper; sub new { my ( $class ) = @_; my $self = {}; return bless $self, $class; } sub is_Attacked { my ($self, $city) = @_; return ($city->{force}->{attacks} > 0 ) ? 1 : 0; } sub is_constructing { my ($self, $city) = @_; return ($city->{construction} > 0 ) ? 1 : 0; } sub is_wall_enough { my ($self, $city) = @_; # TODO 應該以防禦力計算 return ($city->{buildings}->{wall} >= $city->{buildings}->{townHall} ? 1 : 0); } sub is_space_enough { my ($self, $city) = @_; # TODO 應該以消耗率/時間計算 return ($city->{space}->{total} <= ($city->{space}->{occupied}+6) ? 1 : 0) } sub is_corruption { my ($self, $city) = @_; return 0; } sub is_happiness { my ($self, $city) = @_; # TODO 以 fuzzy 取出合理 happiness 值 return ($city->{happiness} >= 2 ? 1 : 0) } sub is_warehouse_enough { my ($self, $city) = @_; # TODO 以速率計算容納率 # XXX: not implemented yet. return 1; } sub is_risk { my ($self, $city) = @_; # TODO 計算可搶劫比例, 城牆防護, 軍事分數 return 0; } sub is_shipyard { return 1; } sub is_drydock_researched { my ($self, $city) = @_; return (defined($city->{research}->{4010}) ? 1 : 0); } sub is_winepress_researched { my ($self, $city) = @_; return (defined($city->{research}->{2040}) ? 1 : 0); } sub rule_engagement { my ($self, $city) = @_; # XXX # 計算距離, 可搶劫比例, 是否有聯盟, 軍事分數 (win rate) } sub rule_resource { # XXX } 1; package main; our $i = new Ikariam($::server, $::user, $::pass); $i->login; my $cities = $i->check; my $rules = Ikariam::Cities::Rules->new; my $tree = LoadFile('building.yaml'); # print Dumper($tree); # show cities. foreach my $cityId (keys(%$cities)) { printf("%s http://%s/index.php?view=city&id=%d\n", $cities->{$cityId}->{name}, $::server, $cityId); printf("construction: %s\n", $cities->{$cityId}->{construction}); foreach my $thing (qw/resources space force buildings citizens army fleet/) { printf("<%s>\n", uc($thing)); foreach my $i (keys(%{$cities->{$cityId}->{$thing}})) { printf("%s %s, ", $i, $cities->{$cityId}->{$thing}->{$i}); } print("\n"); } print("\n"); # print(Dumper($cities)); # make decisions # for the Decision Tree $cities->{$cityId}->{parse_path} = []; $cities->{$cityId}->{parse_answer} = undef; while (my $action = ParseTree($tree, $rules, $cities->{$cityId})) { # TODO: remove the last rule, if the result is fallback triggerAction($action, $cityId); last; } # Debug print(Dumper($cities->{$cityId}->{parse_path})); } $i->logout; sub triggerAction { my ($action, $cityId) = @_; my ($func, $param) = split(/_/,$action); # printf('$i->%s("%s", %s);\n\n', $func, $param, $cityId); eval(sprintf('$i->%s("%s", %s);', $func, $param, $cityId)); warn $@ if $@; }