【问题标题】:Python code works in 2.7 but not in 3.5Python 代码在 2.7 中有效,但在 3.5 中无效
【发布时间】:2016-02-24 13:49:11
【问题描述】:

我的课程是在 Python 中创建井字游戏,我的导师帮助我让它在 2.7 中工作,但是它需要在 3.5 中。

首先在 2.7 中,下面的代码打印一个 3x3 列表,但是在 3.5 中它只是向下打印列表而不是 3x3。我的导师说可能把end = ' '放在最后,但这也行不通。

def printBoard( board ):
    counter = 0   
    for y in range(3):    
        for x in range(3):    
            print (board[counter]),    
            counter += 1    
        print    
    print

第二个问题是在 2.7 上它允许我继续输入数字直到板子被 X 或 O 填满,在 3.5 上它只允许输入一次然后程序结束?

value = input("input number between 1 and 9")    
value = int(value)        
if value == 1:    
    alist[0] = player1    
    printBoard( alist )    
    value = input("input number between 1 and 9")    
if value == 2:    
    alist[1] = player1    
    printBoard( alist )    
    value = input("input number between 1 and 9")

等等

【问题讨论】:

  • 你只使用过一次value = int(value),每次想输入为int时都应该使用它。

标签: python python-2.7 python-3.x tic-tac-toe python-3.5


【解决方案1】:
  1. print 在 Python 3.x 中从 statement 更改为 a function。要打印不带换行符的语句,您需要传递end=' ' 参数(如果您将from __future__ import print_function 放在代码开头,则可以将print 用作Python 2.7 中的函数):

    print(board[counter], end=' ')
    
  2. input 在 Python 3.x 中返回一个字符串。 (不评估输入字符串)。您需要将值转换为int 使用input 的每个位置:

    value = input("input number between 1 and 9")
    value = int(value)
    

    或者,不要将输入与整数文字12 进行比较,而是将输入字符串与字符串进行比较:'1''2',而不将字符串转换为整数。 (但这需要你在 Python 2.7 中使用 raw_input 而不是 input

  3. print 应称为:print()。否则,不会打印任何内容。

【讨论】:

  • 将 1 更改为 '1' 非常感谢,但是 print(board[counter], end = '') 现在只打印列表而不是向下打印。
  • def printBoard(board): counter = 0 for y in range(3): for x in range(3): print( board[counter], end='') counter += 1 print这就是打印列表的方式,我在 3.5 中工作,1 2 3 4 5 6 7 8 9 输入数字在 1 和 9 之间
  • 使用print() 代替print 将文本移动到新行。
  • “感谢您的回答,但仍然没有产生正确的结果” - “您应该接受这个答案。”呃……
【解决方案2】:

我假设board 类似于[['*', '*', '*'], ['*', '*', '*'], ['*', '*', '*']]。这意味着您可以通过单个 print() 调用轻松打印此内容。

print(*(''.join(row) for row in board), sep='\n')

这会将每一行连接成一个新字符串,将每一行作为生成器的一部分生成。此生成器使用* 解包并发送到print(),其中每一行由换行符分隔。

对于您的第二个问题,问题很简单:您将int() 转换为第一个value,而不是后续的。然而,这是你应该用循环做的事情。它将完全防止这种错误。如果您发现自己使用 Ctrl+V 编写了大量代码,那么您做错了什么。如果每个块稍有不同,编号递增,您可以使用 for i in range(n): 之类的东西,这样您就可以在每次迭代中执行相同的代码,编号递增。

不过,我建议使用简单的while 循环来检查游戏是否完成:

while True:
    move = request_move()
    do_move('X', move)
    if game_complete():
        break
    request_move()
    do_move('O', move)
    if game_complete():
        break

然后您将编写适当的函数来请求移动坐标,将移动输入棋盘,并检查游戏是否完成。

【讨论】:

猜你喜欢
  • 2012-03-14
  • 2013-12-21
  • 1970-01-01
  • 2011-04-04
  • 2012-09-05
  • 1970-01-01
  • 2019-05-18
  • 2013-01-16
  • 2011-12-17
相关资源
最近更新 更多