【问题标题】:Making a Grid to go fishing in Python用 Python 制作网格去钓鱼
【发布时间】:2016-12-12 01:50:50
【问题描述】:

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

为了使程序正常工作,我正在努力解决类的概念。现在我正在创建一个 2x2 网格并定义单元格中需要的内容,这就是我目前所拥有的。

这是我正在为这个项目工作的更多骨架,但现在我正在尝试了解 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:此单元格是否包含用户的钓鱼线(布尔值)

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

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

str():返回一个单元格的字符串表示,即返回这个单元格的内容(例如“”(无)、“F”(鱼)、“”( line), "F" (鱼和线)

是否应该在 init 中定义 location_coords 和 fish ?还是在 Cell 类的定义中编码

我仍在努力掌握本学期 Python 的最后作业的所有内容,所以如果这对网站来说是一个很大的问题,我深表歉意,我非常困惑。

【问题讨论】:

  • 当整个程序可能只是 import randomif random.random() < 0.25: print('success') 时,使用类似乎有点牵强。
  • 我认为这就是为什么整个项目让我如此困惑的原因,因为有更有效的方法来完成它,但我必须按照我的老师希望它如何编码的说明和大纲。 .@tigerhawkT3 ..
  • 我提供了更多代码,向您展示骨架格式,但现在我只是想弄清楚如何让 Class 单元工作......@TigerhawkT3 如果你有任何建议,我真的可以使用一些帮助

标签: python list class


【解决方案1】:

设置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 设置为False,因为我们假设游戏将从没有钓鱼线开始。代码的其他部分将填写这些内容。


在网格中使用单元格

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

[[Cell, Cell],
 [Cell, Cell]]

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

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


用细胞做事

单元格的属性已经到位,现在您可以添加逻辑来做其他事情,例如添加鱼,检查是否有鱼等。

比如我们要获取cell是否有鱼线,可以查看self.contains_line,例如:

def contains_line(self):
    return self.contains_line

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

如果我们想添加一条鱼,我们可以运行selected_cell.add_fish(),并带有一个示例定义:

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

【讨论】:

  • 对于名为 this_cell 的单元格,是定义在 Class 单元格下还是在下面的 main 函数中? @David因为我可能需要一个单元格变量,但我仍在尝试使用类进行编码。
  • 还有为什么是fish = ''?我应该对 init 或它自己的函数中声明的行有一个布尔条件吗? @大卫
  • this_cell 仅用于示例目的。在您的主函数中,您可以执行类似cell = Cell(i, j) 然后cell.do_something() 之类的操作。
  • self.fish = ''fish 属性的初始值设置为空字符串。这样,它就会存在,并且您可以检查它是否包含鱼,但您可以稍后对其进行修改。
  • 目前在我的主要功能中,我在另一个类中有 cell = Cell(i , j) 。我应该在我的主要功能中再次定义它吗?
【解决方案2】:

所以一般来说,你可以通过构造函数(在本例中为init())或通过类中的其他方法来初始化一个对象。 有时对象允许两者(以获得更大的灵活性)。由您决定什么更方便。

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

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

稍后,随着游戏的进行,Cell 类中将有其他方法来更新其状态。如果一条鱼没有被另一条鱼占据,也许一条鱼会移动到相邻的单元格?

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

【讨论】:

  • 这确实有道理,谢谢!对于 Cell 类,你会说它应该只专注于创建网格和存储鱼和线的值,而让 Carpetsea 类决定它在单元格中的位置吗?用户是否正确? @swbandit
  • @sarahcampolt,是的,正是
猜你喜欢
  • 1970-01-01
  • 2014-12-27
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 2020-01-16
  • 1970-01-01
  • 2023-04-10
  • 2011-03-02
相关资源
最近更新 更多