【问题标题】:Python. After using defined function i can't call for variable this function was operating onPython。使用定义的函数后,我无法调用该函数正在运行的变量
【发布时间】:2021-01-14 00:04:04
【问题描述】:

我想写一个船舶游戏,玩家必须猜测计算机在棋盘上“隐藏”船舶的哪个位置。我的问题是,一切看起来都很好,程序编译没有错误,但我预定的功能不起作用,我不知道为什么。我觉得我的变量 board 在被函数 ship 处理后丢失了,之后我无法打印带有船的板。我尝试在 ship 函数的末尾使用 return bo ,但它也不起作用。 可能有什么问题? 我真的很迷茫,不知道这里可能有什么问题:(

import random
board = []

for i in range(0,10):
   board.append([0])
   for j in range(0,9):
    board[i].append(0)
def board_print(bo):
for i in range(len(bo)):
    if i == 0:
        print("--------------------")
    for j in range(len(bo[0])):
        if j == 9:
            print(bo[i][j])
        else:
            print(str(bo[i][j]) + " ", end="")
    print("--------------------")
def ship_start():
  pos_x = random.randint(0,9)
  pos_y = random.randint(0,9)
  return(pos_x,pos_y) # coordinates of ships first point
def ship(bo): # creates ship with 4 hp points
  row , col = ship_start()
  print(row, col)
  coin_flip = 1 #random.randint(0,1) # 0 - horizontal, 1 - vertical
  if coin_flip == 1:
    i = 0
    while 3 - i > 0:
       if bo[row + i][col] in bo == True:
          bo[row][col] = 1
          i =i + 1
       else:
          j = 4 - i
          for x in range(j):
            bo[row - x][col] = 1
ship(board)
board_print(board)

【问题讨论】:

  • 你在这里缩进了吗? --> def board_print(bo): for i in range(len(bo)):

标签: python function variables return


【解决方案1】:

这条线被打破了,有两种不同的方式:

if bo[row + i][col] in bo == True:

第一个问题是 Python 有一个名为 chained comparisons 的特性。

这允许创建漂亮的数学风格比较链,例如0 <= foo < 5a == b == c,但有点出乎意料比较是任意的,这意味着您可以编写 a < b in c > d 并且将有效地执行为 (a < b) and (b in c) and (c > d)(除了只评估每个表达式一次)。 p>

这意味着

bo[row + i][col] in bo == True

不被解析为

(bo[row+1][col] in bo) == True

(顺便说一句,这是多余的)但作为

(bo[row+1][col] in bo) and (bo == True)

这永远不会是真的,因为bo 不是布尔值,因此i 永远不会更新并且循环永远不会终止。

并不是什么都丢失了,而是ship 字面上永远不会终止

那么你还有第二个逻辑问题:

bo[row + i][col]

是一个整数,但bo 是一个列表列表,所以即使没有损坏的比较

bo[row + i][col] in bo

不可能是真的,因此ship 仍然永远不会终止。我真的帮不上什么忙,因为我不知道这个函数实际上想做什么。

该语言还有许多其他小问题/错误,例如board_print 可以在很大程度上直接迭代 bo,或者您可以使用列表推导和列表乘法来初始化您的板:

board = [[0] * 10 for _ in range(10)]
def board_print(bo):
    print("--------------------")
    for row in bo:
        for cell in row:
            print(cell, end=' ')
        print()
    print("--------------------")

您可能应该将棋盘大小存储在一个常量中并使用randrange 以使所有内容都匹配(randrange(10)randint(0, 9) 相同)。而return 不是函数,通常在关键字和返回的内容之间有一个空格。

【讨论】:

  • 根据第一个问题,我应该将其表述为: if (bo[row + i][col] in bo) == True: 或者这句话根本上是错误的,我应该尝试别的?第二题。我是,它丢失了列表,但是此列表中的元素是整数,为什么我不能将整数添加到也是整数的列表元素中?
  • 你可以添加括号,但你不应该:== True 完全没用,你可以删除它:该值已经是一个布尔值,即使它不是 Python 的条件句也可以使用 "真实性”,而不是需要实际的布尔值。
  • 第二个问题是你在整数列表中寻找一个整数。 in 不会“穿透”,它只会查看外部列表中的所有值,永远找不到任何东西,然后离开。此外,您试图在板内找到板值,根据定义,这将是正确的。
  • 我没有收到第二个问题。当我调用 bo[row+i][col] 并且 row 和 col 都是 intiger 并且 i 是 intiger 时,它们不应该相加并指向 e 板上的特定点。 G。博[5][6]?
  • 它指向板上的一个值,例如0 位于bo[5][6],但随后您询问if 0 in bo。 bo 是一个数组数组,而不是多维矩阵,所以 bo 中唯一的东西就是数组。因此0 不在bo 中,0 永远不能在bo 中。
猜你喜欢
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多