我在这里有一些功能,我正在努力获得正确的输出.
主要思想是使用名为buildinginfo的函数和调用函数avaliableBuildingBuildings循环通过buildinginfo的数组并循环通过需求来查明需求是否完整.
在我的数据库中,我的main_building级别为1.
每隔一张桌子都是空的.
当调用avaliableBuildingBuildings时,我得到这条线下的输出,这将列出我可以创建的建筑物.你可以看到main_building的要求是3,那么就不应该创建营房.
问:我怎样才能修复我的代码,以便它能真正地给我一些我可以构建的建筑物?
当前输出:
array(5) {
["barracks"]=>
array(2) {
["max"]=>
int(1)
["requirements"]=>
array(2) {
["main_building"]=>
int(3)
["rally_point"]=>
int(1)
}
}
["blacksmith"]=>
array(2) {
["max"]=>
int(1)
["requirements"]=>
array(3) {
["main_building"]=>
int(3)
["academy"]=>
int(3)
["barracks"]=>
int(3)
}
}
["embassy"]=>
array(2) {
["max"]=>
int(1)
["requirements"]=>
array(1) {
["main_building"]=>
int(1)
}
}
["marketplace"]=>
array(2) {
["max"]=>
int(1)
["requirements"]=>
array(3) {
["warehouse"]=>
int(1)
["granary"]=>
int(1)
["main_building"]=>
int(3)
}
}
["palace"]=>
array(2) {
["max"]=>
int(1)
["requirements"]=>
array(3) {
["main_building"]=>
int(5)
["embassy"]=>
int(1)
["residence"]=>
int(0)
}
}
}
完整代码:
function isBuilt($villageid,$name) {
$buildinginfo = $this->buildinginfo();
$thisBuilding = $buildinginfo[$name];
$built = $this->CI->db->query("SELECT * from `$name` where `villageid`='$villageid'")->row();
return ($built ? $built : false);
}
function requirementsDone($villageid,$name) {
$buildinginfo = $this->buildinginfo()[$name];
$canbebuilt = true;
if (isset($buildinginfo['requirements'])) {
$requirements = $buildinginfo['requirements'];
foreach ($requirements as $reqname => $level) {
$building = $this->isBuilt($villageid,$reqname);
if ($building) {
echo "needs that $reqname (".$building->level.")is higher than $level to build $name
";
if ($building->level >= $level) {
echo "
$reqname is acually higher !
";
} else {
echo " i cant acually build this..
";
$canbebuilt = false;
break;
}
} else {
$canbebuilt = false;
break;
}
}
}
if ($canbebuilt) {
echo "result to build $name is true
";
} else {
echo "result to build $name is false
";
}
return $canbebuilt;
}
function existingBuildings($villageid) {
$buildinginfo = $this->buildinginfo();
$buildings = array();
foreach($buildinginfo as $name => $array) {
$built = $this->isBuilt($villageid,$name);
if ($built) {
$buildings[$name] = $built;
}
}
return $buildings;
}
function avaliableBuildingBuildings($villageid) {
$avaliable = $this->avaliableBuildings($villageid);
$tobuild = array();
foreach($avaliable as $name => $built) {
if (isset($built['requirements'])) {
$req = $built['requirements'];
foreach ($req as $reqname => $level) {
$canbuild = $this->requirementsDone($villageid,$reqname);
if ($canbuild) {
echo "verify to build $reqname is true
";
$tobuild[$name] = $avaliable[$name];
} else {
echo "verify to build $reqname is false
";
break;
}
}
} else {
}
}
return $tobuild;
}
function avaliableBuildings($villageid) {
$buildinginfo = $this->buildinginfo();
foreach($this->existingBuildings($villageid) as $name => $built) {
if (array_key_exists($name,$buildinginfo)) {
unset($buildinginfo[$name]);
echo "removing $name
";
}
}
return $buildinginfo;
}
function buildinginfo() {
$info = array(
'academy' => array('max' => 1),'barracks' => array('max' => 1,'requirements' => array(
'main_building' => 3,'rally_point' => 1,)
),'main_building' => array('max' => 1,'requirements' => array(
'main_building' => 1,'greatbarracks' => array('max' => 1),'greatstable' => array('max' => 1),'heromansion' => array('max' => 1),'rally_point' => array('max' => 1),'stable' => array('max' => 1,'requirements' => array(
'blacksmith' => 3,'academy' => 5,'blacksmith' => array('max' => 1,'requirements' => array(
'main_building' => 3,'academy' => 3,'barracks' => 3,'forge' => array('max' => 1),'tournament_square' => array('max' => 1),'trapper' => array('max' => 1),'cranny' => array('max' => 1),'embassy' => array('max' => 1,'requirements' => array(
'main_building' => 1
)
),'marketplace' => array('max' => 1,'requirements' => array(
'warehouse' => 1,'granary' => 1,'main_building' => 3
)
),'palace' => array('max' => 1,'requirements' => array(
'main_building' => 5,'embassy' => 1,'residence' => 0
)
),'residence' => array('max' => 1),'town_hall' => array('max' => 1),'trade_office' => array('max' => 1),'treasury' => array('max' => 1),'granary' => array('max' => 99,'new' => 20),'warehouse' => array('max' => 99,'new' => 20)
);
return $info;
}