首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >战舰:如何自动创建实例?

战舰:如何自动创建实例?
EN

Stack Overflow用户
提问于 2018-08-07 23:07:37
回答 2查看 218关注 0票数 1

我在做一个战舰游戏。我创建了一个Ship类来给船一个位置。

在创建类之后,我必须创建所有的实例,我想知道是否有一种方法可以自动化。

程序的大部分都是无关紧要的,但我把它留在这里,以防它可能会影响它是否可以自动化。

代码语言:javascript
复制
import random

class Ship(object):

    def __init__(self, length):
        self.length = length

    def direction(self):
        vh = random.choice(['v','h'])
        return vh

    def location(self):
        space = []
        row = random.randint(0, 10-self.length)
        column = random.randint(0, 10-self.length)
        if self.direction == 'v':
            for x in range(self.length):
                space.append(f'{column}{row+x}')
        else:
            for x in range(self.length):
                space.append(f'{column}{row+x}')
        return space

ships_amount = {
    'carrier' : 1,
    'battleship' : 2,
    'cruiser' : 3,
    'destroyer' : 4
}

ships_length = {
    'carrier' : 5,
    'battleship' : 4,
    'cruiser' : 3,
    'destroyer' : 2
}

我想这样做:

代码语言:javascript
复制
carrier1 = Ship(ships_length['carrier'])
battleship1 = Ship(ships_length['battleship'])
battleship2 = Ship(ships_length['battleship'])
cruiser1 = Ship(ships_length['cruiser'])
cruiser2 = Ship(ships_length['cruiser'])
cruiser3 = Ship(ships_length['cruiser'])
destroyer1 = Ship(ships_length['destroyer'])
destroyer2 = Ship(ships_length['destroyer'])
destroyer3 = Ship(ships_length['destroyer'])
destroyer4 = Ship(ships_length['destroyer'])

但却是自动的

EN

回答 2

Stack Overflow用户

发布于 2018-08-07 23:18:41

你可以遍历你想要的船并查找它们的长度来制作它们:

代码语言:javascript
复制
 ships = []
 for type_of_ship in ships_amount:
   ships.append(Ship(ships_length[type_of_ship]))

甚至是

代码语言:javascript
复制
ships = [Ship(ships_length[k]) for k in ships_amount]

(在第二个示例中,ky是key的简写,或者现在在for循环中称为type_of_ship )

这将为您提供每种类型的一艘船。

这不会给你提供名为'carrier1‘等的变量,但你将能够对ships中的每一项做一些事情。

例如:

代码语言:javascript
复制
for ship in ships:
    print(ship.length)

为了得到规定的数量,或者每种类型的船的数量,你需要在循环中制造额外的船。通过在items()上迭代,您可以得到一个键和值,我称之为kv,但应该有更好的名称。字典中的值告诉您有多少:

代码语言:javascript
复制
ships = []
for k, v in ships_amount.items():
    ships.extend([Ship(ships_length[k]) for _ in range(v)])

这给你提供了你想要的10艘船。

票数 2
EN

Stack Overflow用户

发布于 2018-08-07 23:30:27

如果您为所需的每个船舶模型创建了Ship的子类,则可以将它们分组到Fleet中,然后在一行代码中直接创建舰队……

可能是这样的:

代码语言:javascript
复制
import random

class Ship:             # this becomes an abstract class, not to be instanciated
                        # you could have it inherit from ABC (Abstract Base Class)
    def __init__(self):
        self.length = self.__class__.length
        self.heading = None
        self.set_heading()

        self.location = None
        self.set_location()

    def set_heading(self):
        self.heading = random.choice(['v','h'])

    def set_location(self):   # this method needs more work to prevent
                              # ships to occupy the same spot and overlap 
        space = []
        row = random.randint(0, 10 - self.length)
        column = random.randint(0, 10 - self.length)
        if self.heading == 'v':
            for c in range(self.length):
                space.append((row, column + c))
        elif self.heading == 'h':
            for r in range(self.length):
                space.append((row + r, column))
        self.location = space

    def __str__(self):
        return f'{self.__class__.__name__} at {self.location}'


class AircraftCarrier(Ship):    # every type of ship inherits from the base class Ship
    length = 5                  # Each class of ship can have its own specifications
                                # here, length, but it could be firepower, number of sailors, cannons, etc...

class BattleShip(Ship):
    length = 4

class Cruiser(Ship):
    length = 3

class Destroyer(Ship):
    length = 2


class Fleet:
    ships_number = {AircraftCarrier : 1,
                    BattleShip: 2, 
                    Cruiser: 3, 
                    Destroyer: 4}
    def __init__(self):
        self.ships = [ship() for ship, number in Fleet.ships_number.items() 
                      for _ in range(number)]

    def __str__(self):
        return '\n'.join([str(ship) for ship in self.ships])


if __name__ == '__main__':

    fleet = Fleet()         # <-- the creation of the entire Fleet of Ships 
    print(fleet)            #     takes now one line of code now

输出示例:

(位置是随机分配的,每次运行都会有所不同。)

代码语言:javascript
复制
AircraftCarrier at [(1, 2), (2, 2), (3, 2), (4, 2), (5, 2)]
BattleShip at [(5, 3), (6, 3), (7, 3), (8, 3)]
BattleShip at [(5, 1), (6, 1), (7, 1), (8, 1)]
Cruiser at [(4, 7), (5, 7), (6, 7)]
Cruiser at [(0, 5), (0, 6), (0, 7)]
Cruiser at [(6, 6), (7, 6), (8, 6)]
Destroyer at [(4, 8), (5, 8)]
Destroyer at [(3, 5), (4, 5)]
Destroyer at [(1, 5), (1, 6)]
Destroyer at [(2, 1), (2, 2)]

添加新的船舶类型:

添加新的船舶类型非常简单:只需创建一个继承自抽象基类Ship的新类,并将新船舶的数量添加到舰队组合中就足够了:

代码语言:javascript
复制
class Submarine(Ship):
    length = 1

Fleet.ships_number[Submarine] = 5   # or add this entry directly in the class Fleet data

舰队现在有额外的5艘潜艇:

代码语言:javascript
复制
AircraftCarrier at [(4, 1), (5, 1), (6, 1), (7, 1), (8, 1)]
BattleShip at [(5, 5), (6, 5), (7, 5), (8, 5)]
BattleShip at [(0, 0), (1, 0), (2, 0), (3, 0)]
Cruiser at [(5, 2), (5, 3), (5, 4)]
Cruiser at [(2, 0), (3, 0), (4, 0)]
Cruiser at [(7, 7), (8, 7), (9, 7)]
Destroyer at [(4, 3), (5, 3)]
Destroyer at [(2, 1), (2, 2)]
Destroyer at [(0, 8), (1, 8)]
Destroyer at [(3, 6), (3, 7)]
Submarine at [(8, 8)]
Submarine at [(0, 7)]
Submarine at [(3, 4)]
Submarine at [(5, 9)]
Submarine at [(9, 3)]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51730056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档