战舰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游戏中的船舶重叠的主要内容,如果未能解决你的问题,请参考以下文章

51Nod - 1521 一维战舰

51nod-1521一维战舰

Java中的战舰游戏板

一道面试题--设计炸船互动游戏

区块链游戏项目(战舰游戏)基于layer2区块链技术,使用以太坊的solidity语言, 含全栈完整源码

区块链游戏项目(战舰游戏)基于layer2区块链技术,使用以太坊的solidity语言, 含全栈完整源码