我在这里有一些功能,我正在努力获得正确的输出.
主要思想是使用名为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;
- }
PS.那些“回声”没有帮助,是吗?:)想想TDD – 这个过程解决了更多的问题而不仅仅是逻辑错误(它会迫使你引入假数据层 – 例如>解耦代码)