【问题标题】:Tic Tac Toe – Output Prints an Extra Line井字游戏 - 输出打印额外的一行
【发布时间】:2019-10-01 05:15:01
【问题描述】:

编写游戏井字游戏。该游戏涉及两名玩家,每个玩家轮流在二维网格中放置 X 或 O(取决于玩家)。 x 和 y 坐标位于 [0-2](包括)范围内。如果玩家(X 或 O)在一行、一列或对角线上有 3 个,则可以获胜。

程序几乎是正确的,当“X”或“O”获胜时,程序给出正确的输出,在“X 获胜!”之前不打印一个空行!或'O wins',但是,程序在绘制时在打印'Draw'之前打印一个空行,预期的输出不应该在打印'Draw'之前打印一个空行。我不知道如何解决它。

def print_matric(eri):
    for j in range(0,3):
        for i in range(0,3):
            if eri[i][j]==-1:
                print(" ",end="")
            if eri[i][j]==0:
                print("O",end="");
            if eri[i][j]==1:
                print("X",end="");
            if not i==2:
                print("|",end="");
        print()
        # prints ("_ _ _") two times only not third time
        if not j==2:
            print("-----",end="")
        print()
def compute(eri):
    if eri[0][0]== eri[0][1] and eri[0][1] == eri[0][2] and eri[0][0] != -1:
        return eri[0][0]
    if eri[1][0]== eri[1][1] and eri[1][1] == eri[1][2] and eri[1][0] != -1:
        return eri[1][0]
    if eri[2][0]== eri[2][1] and eri[2][1] == eri[2][2] and eri[2][0] != -1:
        return eri[2][0]
    if eri[0][0]== eri[1][0] and eri[1][0] == eri[2][0] and eri[0][0] != -1:
        return eri[0][0]
    if eri[0][1]== eri[1][1] and eri[1][1] == eri[2][1] and eri[0][1] != -1:
        return eri[0][1]
    if eri[0][2]== eri[1][2] and eri[1][2] == eri[2][2] and eri[0][2] != -1:
        return eri[0][2]
    if eri[0][0]== eri[1][1] and eri[1][1] == eri[2][2] and eri[0][0] != -1:
        return eri[0][0]
    if eri[0][2]== eri[1][1] and eri[1][1] == eri[2][0] and eri[0][2] != -1:
        return eri[0][2]
    return -1
def find_whether_empty(eri):
    for j in range(0,3):
        for i in range(0,3):
            if eri[j][i]==-1:
                return 1
    return 0
eri = [[-1,-1,-1],[-1,-1,-1],[-1,-1,-1]]
count=0
while True:
    a,b = input().split()
    a=int(a)
    b=int(b)  
    if a<0 or a>2 or b<0 or b>2:
        print("\ncheck your coordinates and enter again")
        continue
    if not eri[a][b]==-1:
        print("\nposition already occupied, please enter again")
        continue
    if count%2==0:
        eri[a][b]=1
    else:
        eri[a][b]=0
    count=count+1
    if compute(eri)==-1:
        print()  
    x=compute(eri)
    if not x==-1:
        if x==0:
            print("O wins!\n")
        else:
            print("X wins!\n")
    if not find_whether_empty(eri):
        print("Draw\n")
        print_matric(eri)
        break
    print_matric(eri)
    if not x==-1:
        break

预期输出:

0 0               

X| |
-----
 | |
-----
 | |

1 1

X| |
-----
 |O|
-----
 | |

1 0

X|X|
-----
 |O|
-----
 | |

2 0

X|X|O
-----
 |O|
-----
 | |

0 2

X|X|O
-----
 |O|
-----
X| |

0 1

X|X|O
-----
O|O|
-----
X| |

2 1

X|X|O
-----
O|O|X
-----
X| |

2 2

X|X|O
-----
O|O|X
-----
X| |O

1 2
Draw

X|X|O
-----
O|O|X
-----
X|X|O

实际输出:

0 0

X| | 
-----
 | | 
-----
 | | 

1 1

X| | 
-----
 |O| 
-----
 | | 

1 0

X|X| 
-----
 |O| 
-----
 | | 

2 0

X|X|O
-----
 |O| 
-----
 | | 

0 2

X|X|O
-----
 |O| 
-----
X| | 

0 1

X|X|O
-----
O|O| 
-----
X| | 

2 1

X|X|O
-----
O|O|X
-----
X| | 

2 2

X|X|O
-----
O|O|X
-----
X| |O

1 2

Draw

X|X|O
-----
O|O|X
-----
X|X|O

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    只需删除这 2 行注释,并添加 print() 以仅在游戏未结束时运行:

    if count%2==0:
        eri[a][b]=1
    else:
        eri[a][b]=0
    count=count+1
    # if compute(eri)==-1:  # REMOVED THESE
    #     print()           # REMOVED THESE
    x=compute(eri)
    if not x==-1:
        if x==0:
            print("O wins!\n")
        else:
            print("X wins!\n")
    elif not find_whether_empty(eri):  # CHANGED if -> elif
        print("Draw\n")
        print_matric(eri)
        break
    else:        # ADDED THESE
        print()  # ADDED THESE
    

    然后它会在绘制时给出正确的输出:

    ......
    ......
    O|X| 
    -----
    X|O|O
    -----
    X| |X
    
    1 2
    
    O|X| 
    -----
    X|O|O
    -----
    X|O|X
    
    2 0
    Draw
    
    O|X|X
    -----
    X|O|O
    -----
    X|O|X
    

    【讨论】:

      【解决方案2】:

      此答案的存在是为了提供进一步的建议,这些建议将(希望)在您需要编写和调试代码时持续到未来。

      清晰的逻辑和结构流将提高你直接思考和推理代码的整体能力。

      目前,您的代码可能在逻辑上 可以工作,但流程 很难遵循。我特别指的是下面的部分。已添加评论以供您遵循我的思考过程。

          if compute(eri)==-1:             # ok, compute the matrix and check for no winner    
              print()
          x=compute(eri)                   # compute the matrix... again?
          if not x==-1:                    # check for winner, why not "x != -1"?
              if x==0:
                  print("O wins!\n")
              else:
                  print("X wins!\n")       # didn't jump out?
          if not find_whether_empty(eri):  # check matrix is full
              print("Draw\n")
              print_matric(eri)
              break                        # jump out, but not before?
          print_matric(eri)                # ok, you wanted to print the matrix here
          if not x==-1:                    # check for winner
              break                        # jump out
      

      在这里,解析个别案例有点困难。如果玩家 1 赢了,它将分支到 not x == -1 -&gt; x == 0 -&gt; print,然后代码的阅读器必须跳过几行到 print_matric,然后是 not x == -1 -&gt; break。代码不需要跳转到 if 语句、跳回并跳回另一个语句。如果可能,尽量避免这种情况,因为这会导致阅读困难。

      (最重要的是,您的代码错过了一个极端情况并表现出很可能与您的意图相冲突的行为。尝试找出该极端情况。)

      这是我编写逻辑的方式:

      ...
      
      finished = False           # a sentry variable
      while not finished:
      
          ...
      
          winner = compute(eri)
      
          # is there a winner?
          if winner == -1:    # no winner
      
              # is the board empty?
              if not find_whether_empty(eri):
                  print("Draw\n")
                  finished = True
              else:
                  print()         # only executed when there is no winner
                                  # and board isn't empty
      
          else:               # there is a winner
      
              # which winner is it?
              if winner == 0:
                  print("O wins!\n")
              elif winner == 1:
                  print("X wins!\n")
      
              finished = True
      
          print_matric(eri)       # matrix printed regardless of winner state
      

      这里,无论矩阵处于哪个状态,哪一部分代码都运行的很清楚。如果玩家 1 赢了,它只会运行else -&gt; winner == 0 -&gt; print。如果有平局,它只会运行winner == -1 -&gt; not find_whether_empty(eri) -&gt; print, finished。此外,compute 仅被调用一次(节省时间),并且将为所有获胜者状态打印矩阵。

      请注意,我使用哨兵变量finished 代替break 来控制程序的流程。与立即退出循环的break 不同,使用 sentry 变量仍将运行 print_matric 行。

      希望这能给你一些启发。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-12
        • 2015-01-08
        相关资源
        最近更新 更多