Prechádzať zdrojové kódy

Add calculate cost for number of building

JoostSijm 6 rokov pred
rodič
commit
5e5e7c5e0d
1 zmenil súbory, kde vykonal 213 pridanie a 0 odobranie
  1. 213 0
      building_calculator.py

+ 213 - 0
building_calculator.py

@@ -0,0 +1,213 @@
+"""Calculate cost to reach total buidings level"""
+
+from rival_regions_calc import ConstructionCosts, Building
+
+PRICES = {
+    'cash': 0.7,
+    'gold': 0.45,
+    'oil': 250,
+    'ore': 230,
+    'diamond': 1700000,
+    'uranium': 2100
+}
+BUILDING_TYPES = {
+    'hospital': Building('hospital'),
+    'military base': Building('military base'),
+    'school': Building('school'),
+    'missile system': Building('missile system'),
+    'power plant': Building('power plant'),
+    'spaceport': Building('spaceport'),
+    'airport': Building('airport')
+}
+
+def main():
+    """Main method"""
+    buildings = {
+# palmer
+#        'hospital': 2516,
+#        'military base': 1800,
+#        'school': 2000,
+#        'missile system': 7745,
+#        'power plant': 2275,
+#        'spaceport': 1800,
+#        'airport': 7961
+# oost-nl
+#        'hospital': 2475,
+#        'military base': 1646,
+#        'school': 1565,
+#        'missile system': 4550,
+#        'power plant': 1461,
+#        'spaceport': 201,
+#        'airport': 3750,
+# noord-nl
+        'hospital': 2474,
+        'military base': 1645,
+        'school': 1564,
+        'missile system': 1200,
+        'power plant': 2570,
+        'spaceport': 4,
+        'airport': 2305
+    }
+    build_buildings = {
+        'hospital': 0,
+        'military base': 0,
+        'school': 0,
+        'missile system': 0,
+        'power plant': 0,
+        'spaceport': 0,
+        'airport': 0
+    }
+
+    total_buildings = sum(item for item in buildings.values())
+    # building_goal = 36581 #5
+    building_goal = 61300 #1
+    total_price = 0
+    required_buildings = building_goal - total_buildings
+    power_surplus = 6198
+    power_consumption = (total_buildings - buildings['power plant']) * 2
+    power_production = buildings['power plant'] * 10
+    for i in range(1, required_buildings + 1):
+        lowest_building_name = None
+        lowest_building_price = 1000000000000000
+        if power_consumption > power_production + power_surplus - 2:
+            lowest_building_name = 'power plant'
+            cc = ConstructionCosts(
+                BUILDING_TYPES['power plant'],
+                buildings['power plant'] + build_buildings['power plant']
+            )
+            cc.calculate(1)
+            lowest_building_price = sum_building_cost(cc)         
+        else:
+            for building_name in BUILDING_TYPES:
+                cc = ConstructionCosts(
+                    BUILDING_TYPES[building_name],
+                    buildings[building_name] + build_buildings[building_name]
+                )
+                cc.calculate(1)
+                price = sum_building_cost(cc)         
+
+                if price <= lowest_building_price:
+                    lowest_building_price = price
+                    lowest_building_name = building_name
+
+        if lowest_building_name == 'power plant':
+            power_production += 10
+        else:
+            power_consumption += 2
+        build_buildings[lowest_building_name] += 1
+        total_price += lowest_building_price
+
+    total_build = sum(item for item in build_buildings.values())
+    total_resources = {
+        'cash': 0,
+        'gold': 0,
+        'oil': 0,
+        'ore': 0,
+        'diamond': 0,
+        'uranium': 0
+    }
+
+    print('—'*53)
+    for resource_name, price in PRICES.items():
+        print('{:8}: {:12,.2f}'.format(resource_name, price))
+
+    for building_name, build in build_buildings.items():
+        if build == 0:
+            continue
+        print('—'*53)
+        print('{}: +{}'.format(building_name, build))
+        cc = ConstructionCosts(
+            BUILDING_TYPES[building_name],
+            buildings[building_name]
+        )
+        cc.calculate(build)
+        total_resources['cash'] += cc.cash
+        total_resources['gold'] += cc.gold
+        total_resources['oil'] += cc.oil
+        total_resources['ore'] += cc.ore
+        total_resources['uranium'] += cc.uranium
+        total_resources['diamond'] += cc.diamond
+        print('{:8} {:20,} {:20,} $'.format(
+            'cash', cc.cash,
+            round(cc.cash * PRICES['cash'])
+        ))
+        print('{:8} {:20,} {:20,} $'.format(
+            'gold', cc.gold,
+            round(cc.gold * PRICES['gold'])
+        ))
+        print('{:8} {:20,} {:20,} $'.format(
+            'oil', cc.oil,
+            round(cc.oil * PRICES['oil'])
+        ))
+        print('{:8} {:20,} {:20,} $'.format(
+            'ore', cc.ore,
+            round(cc.ore * PRICES['ore'])
+        ))
+        print('{:8} {:20,} {:20,} $'.format(
+            'uranium', cc.uranium,
+            round(cc.uranium * PRICES['uranium'])
+        ))
+        print('{:8} {:20,} {:20,} $'.format(
+            'diamond', cc.diamond,
+            round(cc.diamond * PRICES['diamond'])
+        ))
+        print('total {:23} {:20,} $'.format(
+            building_name,
+            round(sum_building_cost(cc))))
+
+
+    print('—'*53)
+    print('total')
+    print('{:8} {:20,} {:20,} $'.format(
+        'cash', total_resources['cash'],
+        round(total_resources['cash'] * PRICES['cash'])
+    ))
+    print('{:8} {:20,} {:20,} $'.format(
+        'gold', total_resources['gold'],
+        round(total_resources['gold'] * PRICES['gold'])
+    ))
+    print('{:8} {:20,} {:20,} $'.format(
+        'oil', total_resources['oil'],
+        round(total_resources['oil'] * PRICES['oil'])
+    ))
+    print('{:8} {:20,} {:20,} $'.format(
+        'ore', total_resources['ore'],
+        round(total_resources['ore'] * PRICES['ore'])
+    ))
+    print('{:8} {:20,} {:20,} $'.format(
+        'uranium', total_resources['uranium'],
+        round(total_resources['uranium'] * PRICES['uranium'])
+    ))
+    print('{:8} {:20,} {:20,} $'.format(
+        'diamond', total_resources['diamond'],
+        round(total_resources['diamond'] * PRICES['diamond'])
+    ))
+    print('total {:44,} $'.format(round(total_price)))
+
+    print('—'*53)
+    print('buildings')
+    print('orginal            : {:,}'.format(total_buildings))
+    print('build              : {:,}'.format(total_build))
+    print('total              : {:,}'.format(building_goal))
+
+    print('—'*53)
+    power_difference = power_production - power_consumption + power_surplus
+    print('power')
+    print('orignal production : {:6}'.format(buildings['power plant'] * 10))
+    print('extra production   : {:6}'.format(build_buildings['power plant'] * 10))
+    print('total production   : {:6}'.format(power_production))
+    print('consumption        : {:6}'.format(power_consumption))
+    print('surplus            : {:6}'.format(power_surplus))
+    print('difference         : {:6}'.format(power_difference))
+
+def sum_building_cost(cc):
+    """Sum building costs"""
+    return cc.cash * PRICES['cash'] + \
+        cc.gold * PRICES['gold'] + \
+        cc.oil * PRICES['oil'] + \
+        cc.ore * PRICES['ore'] + \
+        cc.diamond * PRICES['diamond'] + \
+        cc.uranium * PRICES['uranium']
+
+if __name__ == "__main__":
+    main()