我这里有一些函数,正在努力获得正确的输出。
主要思想是使用称为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 <br><br>";
if ($building->level >= $level) {
echo "<br> $reqname is acually higher ! <br><br>";
} else {
echo " i cant acually build this.. <br><br>";
$canbebuilt = false;
break;
}
} else {
$canbebuilt = false;
break;
}
}
}
if ($canbebuilt) {
echo "result to build $name is true<br>";
} else {
echo "result to build $name is false<br>";
}
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 <br><br>";
$tobuild[$name] = $avaliable[$name];
} else {
echo "verify to build $reqname is false <br><br>";
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 <br>";
}
}
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;
}
看起来您的需求检查循环增加了一倍。这导致检查是否可以建造任何所需的建筑物(并且由于没有嵌套要求,因此始终可以)。只要摆脱内部循环,它应该没问题。
function avaliableBuildingBuildings($villageid) {
$avaliable = $this->avaliableBuildings($villageid);
$tobuild = array();
foreach ($avaliable as $name => $built) {
if (isset($built['requirements'])) {
if ($this->requirementsDone($villageid, $name)) {
echo "verify to build $name is true <br><br>";
$tobuild[$name] = $avaliable[$name];
} else {
echo "verify to build $name is false <br><br>";
}
} else {
}
}
return $tobuild;
}
附言。这些"回声"无济于事,是吗:)想想TDD - 这个过程解决的问题不仅仅是逻辑错误(它会迫使你引入假数据层,例如 ->解耦代码)