我正在尝试创建一个随机生成鱼的网格,用户可以选择放置钓鱼线的位置以查看它们是否捕获了鱼。
我正在努力使用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中的最终作业的所有内容,所以如果对于网站来说这是一个很大的问题我很抱歉,我只是非常困惑。
答案 0 :(得分:0)
因此,通常,您可以通过构造函数(在本例中为init())或通过类中的其他方法初始化对象。 有时对象允许两者(为了更大的灵活性)。您可以自己决定什么更方便。
在你的情况下,我会说是,为什么不在init()中设置值?
Cell决定它是否有鱼或线是没有意义的。我会有一个像GameEngine(或main())这样的逻辑单独的类。因此,拥有/创建Cell的人应该能够将其传递给最初的状态"值。
稍后,随着游戏的进展,Cell类中还会有其他方法来更新其状态。如果一条鱼没有被另一条鱼占据,它可能会移动到相邻的细胞中吗?
不确定这是否对您有帮助。面向对象设计的整个想法是,您不要将所有代码都集中在一个方法中,而是设计对象并分配职责。稍后,随着代码变得越来越大,越来越复杂,维护它并添加更多功能要容易得多。
答案 1 :(得分:0)
Cell
类您的Cell
课程应具有coords
,contains_line
和fish
属性。这些应该放在__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()