战舰python游戏中的船舶重叠
Posted
技术标签:
【中文标题】战舰python游戏中的船舶重叠【英文标题】:Ship overlapping in battleships python game 【发布时间】:2018-01-05 09:56:42 【问题描述】:我正在用 python 创建战舰游戏,其中玩家与一台计算机对战,该计算机随机将战舰放置在 10x10 板上。 船的位置很好,但有时船会重叠。 无论我做什么,它都不会停止重叠船只。
代码如下: 已编辑
ships = 'A': 5, 'B': 4, 'C': 3, 'S': 3, 'D': 2
comp_board = []
for i in range(10):
comp_board.append([])
for j in range(10):
comp_board[i].append('.')
def print_computer_board(comp_board):
for i in comp_board:
print(' '.join(i))
def comp_place_ships(comp_board, ships):
for key, value in ships.items():
ship_not_placed = True
while ship_not_placed:
ori = random.randint(0,1)
if ori == 0:
x = random.randint(0,9-value)
y = random.randint(0,9)
placement = comp_board[x][y]
if placement == '.':
for ship in range(value):
comp_board[x][y] = key
comp_board[x+ship][y] = key
ship_not_placed = False
elif ori == 1:
x = random.randint(0,9)
y = random.randint(0,9-value)
placement = comp_board[x][y]
if placement == '.':
for ship in range(value):
comp_board[x][y] = key
comp_board[x][y+ship] = key
ship_not_placed = False
elif ori != 0 or 1 and placement != '.':
print('Invalid choice, please try again.')
comp_place_ships(comp_board, ships)
print_computer_board(comp_board)
我尝试使用placement = comp_board[x+ship][y] 和placement_hort = comp_board[x][y+ship] 而不是placement = comp_board[x][y] 来检查展示位置是否有效,但随后我收到一个错误:赋值前引用了局部变量“ship”。
有人知道如何解决这个问题吗?我已经尝试创建这个游戏很长时间了,无论我做什么,我都会遇到一个接一个的问题。
【问题讨论】:
您的代码不完整。 comp_board 是如何定义的?船舶是如何定义的? 我现在已经编辑了代码,因此 comp_board 和 ship 都包含在内 + 用于打印计算机板的定义。if placement == '.'
是您当前的重叠检查吗?所以你只检查第一个单元格是否有重叠,而不是每个单元格......你需要检查不重叠的矩形。也许你应该把每艘船的位置放在一个列表中,然后对照那个,而不是对照“董事会”?
【参考方案1】:
正如 JeffUK 所提到的,您似乎正在检查新船的末端是否与现有船相交,但中间部分是否相交。
所以你需要编写两个循环:一个用于检查交叉点,一个用于在网格上写出新的正方形。
any_intersections = False
if ori == 0:
x = random.randint(0,9-value)
y = random.randint(0,9)
for z in range(y, y+value):
if comp_board[x][z] != '.': any_intersections = True
if not any_intersections:
for ship in range(value):
comp_board[x][y] = key
comp_board[x+ship][y] = key
.... (ori = 1 is similar. I'll leave it as an exercise.)
if not any_intersections: print("Random allocation failed.")
return any_intersections
拥有放置船只的功能似乎也更灵活,例如
def place_ship(comp_board, ship_size):
ori = random.randint(0,1)
if ori == 0:
x = random.randint(0,9-value)
y = random.randint(0,9) #note: we could set a constant board_size = 10 and then range from 0 to board_size - 1 and board_size - 1 - value
for z in range(y, y+value):
if comp_board[x][z] != '.': return False
for z in range(y, y+value): comp_board[x][z] = key
return True
然后一个更通用的 place_ships 函数可以运行如下。我添加了一些你不应该需要的错误检查,但如果你想调整板子的大小,也许会很有趣:
def place_ships(ship_list):
for ship in ship_list:
count = 0
while not place_ship(comp_board, ship.size()):
count += 1
if count = 100:
print("Bailing. Failed 100 times to place ship.")
exit()
【讨论】:
以上是关于战舰python游戏中的船舶重叠的主要内容,如果未能解决你的问题,请参考以下文章