【问题标题】:How to code win/tie conditions in TicTacToe game in python如何在 Python 中编写井字游戏中的获胜/平局条件
【发布时间】:2017-10-19 16:53:01
【问题描述】:

我已经制作了井字游戏的主要游戏机制;但是,我不知道如何对最终游戏获胜条件进行编码,即如何找到某人何时获胜/平局。

我尝试使用all() 函数,但要么这不起作用,要么我使用不正确(可能是后者)。

这是完整的代码,以及代码的变量列表(因为没有 cmets):

def get_grid():
    r1 = ['-','-','-']
    r2 = ['-','-','-']
    r3 = ['-','-','-']
    return r1, r2, r3

def get_coords():
    x = 0
    y = 0
    while True:
        try:
            x = int(input("x coord : "))
            y = int(input("y coord : "))
        except ValueError:
            print("Must be an integer")
        if x < 0 or x > 3 or y < 0 or y > 3:
            print('Both values must be in the grid!')
        else:
            break
    return x, y

def pgrid(x, y, r1, r2, r3, player):
    rdict = {1:r1, 2:r2, 3:r3}
    if x != 0 and y != 0:
        while True:
            if rdict[y][x-1] == '-':
                rdict[y][x-1] = player
                break
            else:
                print("Invalid Space!")
                x, y = get_coords()
    print('\t1\t2\t3')
    print('  1 |', end = '\t')
    for i in r1:
        print(i, end = '   |   ')
    print()
    print('  2 |', end = '\t')
    for i in r2:
        print(i, end = '   |   ')
    print()
    print('  3 |', end = '\t')
    for i in r3:
        print(i, end = '   |   ')
    print()


def main():
    r1, r2, r3 = get_grid()
    players = ['X', 'O']
    pgrid(0, 0, r1, r2, r3, None)
    win = False
    while win == False:
        for i in players:
            x, y = get_coords()
            pgrid(x, y ,r1 ,r2 , r3, i)

变量
r1, r2 and r3 是棋盘的第一行、第二行和第三行。 列表
x and y 是放置“X”或“O”的坐标。 整数
rdict 在输入的y 值和棋盘行之间导航。 字典
player 是播放器。 字符串 players 是玩家的列表 ('X' and 'O')
win 在玩家获胜/比赛平局时为真。 布尔值

win 变量是这个问题的答案需要改变的地方,我只需要代码,或者至少需要一个关于如何编码的想法(因为我没有!)。
提前致谢!

【问题讨论】:

    标签: python-3.x list conditional-statements tic-tac-toe


    【解决方案1】:

    检查三个相同字母是否在一行或一列中的最简单方法是什么?对于第一列,取 r1[0]、r2[0] 和 r3[0] 并检查它们是否都包含相同的字母:

    if r1[0] == 'X' and r2[0] == 'X' and r3[0] == 'X':
        print('First column meets victory conditions', 'X')
    

    现在对所有行和列以及两个字母执行此操作会位很麻烦,但幸运的是我们可以让一些 for 循环为我们完成工作。

    for letter in 'XO':
        for i in range(3):
            if r1[i] == letter and r2[i] == letter and r3[i] == letter:
                print('Column', i, letter)
    

    对于行,只需遍历 (r1, r2, r3) 而不是 range(3) 并检查:

    if row[0] == letter and row[1] == letter ...
    

    当然,您也可以使用all 函数和列表推导式或生成器表达式来查看所有字母是否相等。

    for row in (r1, r2, r3):
        if all(item == letter for item in row):
    

    【讨论】:

      【解决方案2】:

      你可以试试我的功能:

      def check_who_won(board):
       for letter in 'xo':
          if all(col == letter for row in board for col in row):
              return True
          for col in range(3):
              if all(board[row, col] == letter for row in range(3)):
                  return True
          if (board[2, 0] and board[1, 1] and board[0, 2]) in letter:
              return True
          if all(board[index, index] == letter for index in range(3)):
              return True
      return False
      

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。
      • 欢迎来到 SO。感谢您的贡献。正如您所包含的那样,确切的代码满足成为答案的要求(相比之下,cmets 可以只是关于尝试什么的建议)。也就是说,不鼓励在 SO 上仅提供代码答案,因为单独的原始代码并不能帮助未来的访问者了解问题是什么或如何在他们自己的代码中解决类似问题。考虑编辑以添加解释或支持文档。 “好”的答案也往往会得到更多的支持,因为随着时间的推移,越来越多的人得到了他们的帮助。期待您未来的贡献和见解。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-23
      • 1970-01-01
      相关资源
      最近更新 更多