让网格在Python中钓鱼

时间:2016-12-12 01:50:50

标签: python list class

我正在尝试创建一个随机生成鱼的网格,用户可以选择放置钓鱼线的位置以查看它们是否捕获了鱼。

我正在努力使用Classes的概念,以使程序工作。现在我正在创建一个2x2网格并定义单元格中需要什么,这是我到目前为止所拥有的。

以下是我正在为此项目工作的更多skelton,但现在我正在尝试了解Class单元格以及如何使其工作

import random

class Coordinate:
    '''
    '''
    def __init__(self, row, col):
        '''         
        '''
        self.row = row 
        self.col = col

    def __str__(self):
        '''
        '''
        return "(%d, %d)" %(self.row, self.col)

class Cell:
    '''
    ''' 
    def __init__(self, row, col):
        ''' 
        '''
        self.coords = Coordinate(row, col)
        self.fish = ""
        self.contains_line = False

    def contains_line(self):
        return self.contains_line

    def add_fish(self):
        self.fish = "F"

    def __str__(self):
        '''
        '''
        return 


class CarpetSea:
    '''
    '''
    num_of_fish = 0 
    total_time = 0 

    def __init__(self, N):
        '''    
        '''
        self.N = N
        N = 2
        self.grid = []
        for i in range(self.N):
            row = []
            for j in range(self.N):
                cell = Cell(i, j)
                row.append(cell)
            self.grid.append(row)

        self.available_fish = ["Salmon", "Marlin", "Tuna", "Halibut"]

    def __str__(self):
        '''
        returns a string representation of a CarpetSea, i.e. display the organized contents of each cell. 
        Rows and columns should be labeled with indices.

        Example (see "Example Run" in the PA8 specs for more):
          0  1  
        --------
        0|M |  |
        --------
        1|  |* |
        --------

        Note: call Cell's __str__() to get a string representation of each Cell in grid
        i.e. "M " for Cell at (0,0) in the example above
        '''
        return "  0  1  \n -------- \n 0| %s  | %s  | \n -------- \n 1| %s  | %s  | \n -------- "%()         
    def randomly_place_fish(self):
        '''
        randomly selects coordinates of a cell and randomly selects a fish from the available_fish list attribute. 
        Marks the cell as containing the fish.
        '''
        pass

    def drop_fishing_line(self, users_coords):
        '''
        accepts the location of the user's fishing line (a Coordinate object). 
        Marks the cell as containing the line.
        '''
        pass

    def check_fish_caught(self):
        '''
        If the cell containing the fishing line also contains a fish, returns the fish. 
        Otherwise, return False.
        '''
        pass

def main():

    main()

这是我对Cell类的说明:

细胞:

location_coords :此单元格在棋盘上的位置(坐标对象)。

contains_line :此单元格是否包含用户的钓鱼线(bool)

:此单元格中包含的鱼(字符串)

init ():接受要分配给属性的值。

str ():返回一个Cell的字符串表示,即返回此单元格的内容(例如""(无)," F&#34 ;(鱼)," "(线)," F "(鱼和线)

应该在init中定义location_coords和fish吗?或者它是Cell类

中定义的代码

我仍在努力掌握本学期我在python中的最终作业的所有内容,所以如果对于网站来说这是一个很大的问题我很抱歉,我只是非常困惑。

2 个答案:

答案 0 :(得分:0)

因此,通常,您可以通过构造函数(在本例中为init())或通过类中的其他方法初始化对象。 有时对象允许两者(为了更大的灵活性)。您可以自己决定什么更方便。

在你的情况下,我会说是,为什么不在init()中设置值?

Cell决定它是否有鱼或线是没有意义的。我会有一个像GameEngine(或main())这样的逻辑单独的类。因此,拥有/创建Cell的人应该能够将其传递给最初的状态"值。

稍后,随着游戏的进展,Cell类中还会有其他方法来更新其状态。如果一条鱼没有被另一条鱼占据,它可能会移动到相邻的细胞中吗?

不确定这是否对您有帮助。面向对象设计的整个想法是,您不要将所有代码都集中在一个方法中,而是设计对象并分配职责。稍后,随着代码变得越来越大,越来越复杂,维护它并添加更多功能要容易得多。

答案 1 :(得分:0)

设置Cell

您的Cell课程应具有coordscontains_linefish属性。这些应该放在__init__中,就像您对coords属性所做的那样。完成这些设置后,您将能够创建单元格,以便检查它们是否有鱼或钓鱼线等。

具有这些属性的修改后的__init__以及额外的参数,以便您在创建单元格时设置它们可能如下所示:

class Cell:
    def __init__(self, row, col, fish='', line=False):
        self.coords = Coordinate(row, col)
        self.fish = fish
        self.contains_line = line

我们将fish的默认参数设置为空字符串''(因为指定fish是字符串),line为{{1}因为我们假设游戏将从没有钓鱼线开始。代码的其他部分将填入这些部分。

在网格中使用单元格

您的网格被定义为单元格列表的列表,例如

False

这些中的每一个都是单元类的单独实例。每个单元格都有坐标(row,col),就像我们可以使用[[Cell, Cell], [Cell, Cell]] 访问列表中的元素一样,我们可以使用list[0]访问网格中的特定单元格。

如果我们选择一个特定的单元格,比如grid[0][0],我们可以通过调用selected_cell = grid[i][j]之类的方法来处理该特定单元格。例如,如果我们想要向每个单元格添加鱼,我们可以遍历网格,选择每个单元格,然后运行selected_cell.add_fish()

使用单元格做事

细胞的属性已经到位,现在你可以添加逻辑来做其他事情,比如添加鱼,检查是否有鱼等。

例如,如果我们想知道单元格是否有钓鱼线,我们可以检查add_fish,例如:

self.contains_line

我们通过运行def contains_line(self): return self.contains_line 进行检查(假设我们有一个名为selected_cell.contains_line()的单元格)。

如果我们想要添加鱼,我们可以运行selected_cell,并带有示例定义:

selected_cell.add_fish()