如何为基于文本的网格创建 class 的动态实例?
How can I create a dynamic instance of a class for a text based grid?
我正在尝试为 python 中基于文本的基本游戏制作地图的 10x10 网格。
我设法创建了一个 MapTile
class 和一个可以在 (x, y)
网格中移动的播放器 class。但是,我不确定如何创建 class 的实例以拥有单独的 MapTiles。我读过为所有 100 个 MapTile
创建 maptile1、maptile2... 等是任意的,但我想不出另一种方法..
这是我得到的!
# This class contains the x and y values for a grid
class MapTile:
def __init__(self, x, y):
self.x = x
self.y = y
# basic char class containing position
class Character:
def __init__(self, name, hp, x, y):
self.name = name
self.hp = hp
self.x = x
self.y = y
# movement func
def Move(self, Direction):
if Direction.upper() == "UP":
if self.y > 1:
self.y -= 1
elif Direction.upper() == "LEFT":
if self.x > 1:
self.x -= 1
elif Direction.upper() == "RIGHT":
if self.x < 10:
self.x += 1
elif Direction.upper() == "DOWN":
if self.y < 10:
self.y += 1
def __str__(self):
return "{}\n========\nHP = {}\nX = {}\nY = {}".format(self.name,
self.hp,
self.x,
self.y)
如果我不清楚,请告诉我。
正如我在评论中所说,我认为您应该使用列表列表或字典作为所有 MapTile
实例的容器。以下是执行这两项操作的方法:
# This class contains the x and y values for a grid
class MapTile:
def __init__(self, x, y):
self.x = x
self.y = y
XDIM, YDIM = 10, 10
# Create a list-of-lists.
grid = [[MapTile(x, y) for y in range(YDIM)] for x in range(XDIM)]
# Create a dictionary with tuple keys.
grid = {(x, y): MapTile(x, y) for x in range(XDIM) for y in range(YDIM)}
做这样的事情使得存储在 MapTile
实例中的 x, y 位置信息有些多余,因为它将被索引或键 隐含 用于引用容器中的每个实例。
例如:
grid[1][2]
包含 MapTile(1, 2)
在第一种情况下,或者
grid[(1, 2)]
包含 MapTile(1, 2)
第二种情况。因此,您可能希望在设计中将其排除在 MapTile
class 之外。否则,当它们的 MapTile
实例的位置在您选择使用的任何类型的 grid
容器中发生更改时,您可能需要更新它们。
我正在尝试为 python 中基于文本的基本游戏制作地图的 10x10 网格。
我设法创建了一个 MapTile
class 和一个可以在 (x, y)
网格中移动的播放器 class。但是,我不确定如何创建 class 的实例以拥有单独的 MapTiles。我读过为所有 100 个 MapTile
创建 maptile1、maptile2... 等是任意的,但我想不出另一种方法..
这是我得到的!
# This class contains the x and y values for a grid
class MapTile:
def __init__(self, x, y):
self.x = x
self.y = y
# basic char class containing position
class Character:
def __init__(self, name, hp, x, y):
self.name = name
self.hp = hp
self.x = x
self.y = y
# movement func
def Move(self, Direction):
if Direction.upper() == "UP":
if self.y > 1:
self.y -= 1
elif Direction.upper() == "LEFT":
if self.x > 1:
self.x -= 1
elif Direction.upper() == "RIGHT":
if self.x < 10:
self.x += 1
elif Direction.upper() == "DOWN":
if self.y < 10:
self.y += 1
def __str__(self):
return "{}\n========\nHP = {}\nX = {}\nY = {}".format(self.name,
self.hp,
self.x,
self.y)
如果我不清楚,请告诉我。
正如我在评论中所说,我认为您应该使用列表列表或字典作为所有 MapTile
实例的容器。以下是执行这两项操作的方法:
# This class contains the x and y values for a grid
class MapTile:
def __init__(self, x, y):
self.x = x
self.y = y
XDIM, YDIM = 10, 10
# Create a list-of-lists.
grid = [[MapTile(x, y) for y in range(YDIM)] for x in range(XDIM)]
# Create a dictionary with tuple keys.
grid = {(x, y): MapTile(x, y) for x in range(XDIM) for y in range(YDIM)}
做这样的事情使得存储在 MapTile
实例中的 x, y 位置信息有些多余,因为它将被索引或键 隐含 用于引用容器中的每个实例。
例如:
grid[1][2]
包含 MapTile(1, 2)
在第一种情况下,或者
grid[(1, 2)]
包含 MapTile(1, 2)
第二种情况。因此,您可能希望在设计中将其排除在 MapTile
class 之外。否则,当它们的 MapTile
实例的位置在您选择使用的任何类型的 grid
容器中发生更改时,您可能需要更新它们。