我很抱歉我的问题没有发表。帮我想一个,我会改变它(如果可能的话)。
这就是我想要做的。我会尽量保持简短。
有些村庄在坐标网格中随机产生,(0-9)。每个村庄都有一个班级,坐标和一个随机的村名。
我已经成功地弄清楚了如何打印游戏板。我被困在能够输入坐标以查看村庄细节的玩家身上。
这是我到目前为止的代码。
def drawing_board():
board_x = '0 1 2 3 4 5 6 7 8 9'.split()
board_y = '1 2 3 4 5 6 7 8 9'.split()
total_list = [board_x]
for i in range(1,10):
listy = []
for e in range(0,9):
if e == 0:
listy.append(str(i))
listy.append('.')
total_list.append(listy)
return total_list
drawing = drawing_board()
villages = [['5','2'],['5','5'],['8','5']] #I would like these to be random
#and associated with specific villages.
#(read below)
for i in villages:
x = int(i[1])
y = int(i[0])
drawing[x][y] = 'X'
for i in drawing:
print(i)
print()
print('What village do you want to view?')
这会打印游戏板。然后我在考虑制作一个看起来像这样的课程:
import random
class new_village():
def __init__(self):
self.name = 'Random name'
x = random.randint(1,9)
y = random.randint(1,9)
self.coordinates = [x,y]
tribe = random.randint(1,2)
if tribe == 1:
self.tribe = 'gauls'
elif tribe == 2:
self.tribe = 'teutons'
def getTribe(self):
print('It is tribe ' +self.tribe)
def getCoords(self):
print(str(self.coordinates[0])+','+str(self.coordinates[1]))
所以现在是我坚持的部分。 如何才能让玩家输入坐标并查看这样的村庄呢?
答案 0 :(得分:7)
您的代码存在一些问题,导致您无法为问题实施干净的解决方案。
首先,我使board_x
和board_y
实际上包含整数而不是字符串,因为您在__init__
new_village
方法中生成随机整数}。
>>> board_x = list(range(10))
>>> board_y = list(range(1,10))
>>> board_x
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> board_y
[1, 2, 3, 4, 5, 6, 7, 8, 9]
另外,我会在地图上创建一个没有村庄的所有地点的列表:
locations = [(x,y) for x in board_x for y in board_y]
现在,您的课程代码的关键问题是两个村庄可以在完全相同的位置生成。当发生这种情况并且用户输入坐标时,您如何知道应该打印哪些值?为防止这种情况发生,您可以将locations
传递给__init__
方法。
def __init__(self, locations):
# sanity check: is the board full?
if not locations:
print('board is full!')
raise ValueError
# choose random location on the board as coordinates, then delete it from the global list of locations
self.coordinates = random.choice(locations)
del locations[locations.index(self.coordinates)]
# choose name and tribe
self.name = 'Random name'
self.tribe = random.choice(('gauls', 'teutons'))
由于您已经为您的村庄开设了课程,因此您的列表villages
实际上应包含此课程的实例,即代替
villages = [['5','2'],['5','5'],['8','5']]
你可以发出
villages = [new_village(locations) for i in range(n)]
其中n
是您想要的村庄数量。
现在,为了使进一步的查找更容易,我建议创建一个字典,将您的电路板上的位置映射到村庄实例:
villdict = {vill.coordinates:vill for vill in villages}
最后,现在可以轻松处理用户输入并在输入位置打印村庄的值。
>>> inp = tuple(int(x) for x in input('input x,y: ').split(','))
input x,y: 5,4
>>> inp
(5, 4)
您现在可以发出:
if inp in villdict:
chosen = villdict[inp]
print(chosen.name)
print(chosen.tribe)
else:
print('this spot on the map has no village')
答案 1 :(得分:1)
您可以使用input
接受来自用户的字符串。因为你将有两个坐标,所以也许两次打电话。获得字符串后,通过int()
将位置转换为整数。
如果要生成随机位置,可以使用random.randrange()
。 random.randrange()
的语法如下:
num = random.randrange(start, stop) #OR
num = random.randrange(start, stop, step)
这将从start
到stop
随机生成一个不包括stop
本身的数字。这与range()
几乎相同。第一种方法假定步长为1,而第二种方法可以指定可选的第三个参数,该参数指定随机整数生成的步长。例如,如果start = 2
,stop = 12
和step = 2
,则会从[2, 4, 6, 8, 10]
的集合中随机生成一个整数。
答案 2 :(得分:1)
一般来说,您的getTribe()
函数应该return
部落不是print
它。但是,我要做的主要是创建一个单独的函数来测试一组提供的坐标是否与村庄的坐标相同。可以说,你改变了你的课程:
import random
class new_village():
def __init__(self):
self.name = 'Random name'
x = random.randint(1,9)
y = random.randint(1,9)
self.coordinates = [x,y]
tribe = random.randint(1,2)
if tribe == 1:
self.tribe = 'gauls'
elif tribe == 2:
self.tribe = 'teutons'
def getTribe(self): return self.tribe
def getCoords(self): return self.coordinates
def areCoordinates(self, x, y):
if [x, y] == self.coordinates: return True
else: return False
def printDetails(self):
print 'Details for the Tribe are: '
print '\t Tribe:', self.tribe
print '\t Coordinates: ', self.coordinates
你有一堆村庄,如:
In [10]: vs = [new_village() for i in range(3)]
In [11]: for v in vs: print v.getTribe(), v.getCoords()
teutons [8, 6]
gauls [6, 9]
teutons [1, 8]
然后,您可以随时获得与特定坐标相对应的村庄:
In [14]: map(lambda v: v.printDetails() , filter(lambda v: v.getCoords() == [8,6] , vs))
Details for the Tribe are:
Tribe: teutons
Coordinates: [8, 6]
Out[14]: [None]
如果村庄不在场:
In [15]: map(lambda v: v.printDetails() , filter(lambda v: v.getCoords() == [2,3] , vs))
Out[15]: []
请注意,代码的结构方式,可能有多个村庄可以在同一个坐标处生成。这可以通过谨慎if
声明轻松处理。