【问题标题】:Python: Trying to program a variant of connect four: Winning condition doesn't stopPython:尝试编写连接四的变体:获胜条件不会停止
【发布时间】:2017-04-01 14:40:27
【问题描述】:

我一直在尝试为我的编程课编写连接四的变体。该板的大小为 6x8。在我尝试编程的变体中,获胜条件基本上是构建一个 L。

这意味着表单的任何构造
X
X
X X
是一个获胜条件。
我一直在尝试创建一个函数来连续检查每一列是否有相同的符号以构建一对。以及对每一行执行相同操作的函数。使用这两个函数,我会检查 2 对是否连续,因为无论你如何组合垂直和水平对,它总是会构建一个“L”。

为了使我正在使用的白板清晰

def ClearBoardSingle():
    global Board
    Board = [['0' for i in range(8)] for i in range(6)]
    BoardPrint()
    PlayerMoveSingle()

对于我正在使用的界面

def BoardPrint():
    global Board
    global GameMoves
    global PlayerTurn
    global Player1Symbol
    global Player2Symbol
    print('\n\nMoves done: ' + str(GameMoves))
    print('To Restart: R | To Quit: Q')
    print('Valid choices: 1, 2, 3, 4, 5, 6, 7, 8')
    if PlayerTurn == 0:
        print('It\'s ' +str(Player1Symbol) + '\'s Turn')
    if PlayerTurn == 1:
        print('It\'s ' +str(Player2Symbol) + '\'s Turn')
    print(Board[0])
    print(Board[1])
    print(Board[2])
    print(Board[3])
    print(Board[4])
    print(Board[5])

我已经想出了如何在 Board 中更改变量,而且我已经完成了很多。我唯一不知道如何实现的是获胜条件。我为行尝试了这个功能:

def VerticalList(Column):
    global Board
    global Choice
    global Row0
    Column = int(Column)
    Choice = int(Choice)
    print(Column,' C')
    while Column > 0:
        for Board[Column][Choice] in range(Column):
            Row0.append(Board[Column][Choice])
            if Column ==6 or Column == -1:
                break
            else:
                VerticalList(Column-1)
        if Column ==0:
            break
        else:
            continue
    if Column == 0:
        Column += 1
        while Column < 5:
            Column +=1
            if Row0[Column] == Row0[Column-1]:
                print('Pair')
            else:
                print('No Pair')
                pass
    else:
        pass

但它进入了一个无限循环。
我对如何实现获胜条件一无所知。我将不胜感激任何帮助或想法。如果您希望我发布整个代码或其他类型的 sn-ps,请索取。

谢谢你的期待!

【问题讨论】:

  • 哇,听起来就像我也遇到的 CS101 问题,当时内存以 MB 为单位衡量
  • 您的代码格式是否正确?可能只是将其粘贴到 SO 中的剪切粘贴错误?代码缩进会影响变量范围。
  • 我在另一个文件中编写了获胜条件,所以我不会不小心弄乱我的游戏代码。我尝试了我的“游戏”,它运行正常,但由于我还没有实现获胜条件,游戏只有在所有字段都填满时才结束(本例中为 48)。
  • @No7ExQ 请格式化您的代码变量/函数名称 (pep-8)。
  • 哦,是的,我昨天做了,谢谢你的提醒(:

标签: python arrays for-loop matrix infinite-loop


【解决方案1】:

很酷的问题,下面看起来有很多代码,但实际上并非如此。我没有对此进行广泛的检查,所以我不确定它不会发现误报,但它似乎找到了它应该找到的 L。我做的主要事情是使用itertools.combinations 获取所有 4 组大小的 X 的位置,然后检查它们是否看起来像我期望的 L 的模式。在check_four_group 中,我查看了行和列之间的差异。

from itertools import combinations
def disp_board(board): 
    for row in board: 
        print(row)

def check_winning(board): 
    winning = False 

    #Find all row,col positions of the X's
    x_poses = [(i,j) for i in range(6) for j in range(8) if board[i][j] == 'X'] 

    #Loop through every combination of four X's since it takes four to make the 'L'
    for group in combinations(x_poses,4):
        if(check_four_group(group)): 
            winning = True 
            break 
    return winning

def check_four_group(group): 
    rows,cols = zip(*[(r,c) for r,c in group]) 
    row_diffs = [rows[i+1]-rows[i] for i in range(len(rows)-1)] 
    col_diffs = [cols[i+1]-cols[i] for i in range(len(cols)-1)] 

    #Uncomment this to print the row and col diffs
    #print(row_diffs) 
    #print(col_diffs)

    # Finds:
    #  X
    #  X
    #  X X
    if row_diffs == [1,1,0] and col_diffs == [0,0,1]:
        return True

    # Finds:
    #    X
    #    X
    #  X X
    elif row_diffs == [1,1,0] and col_diffs == [0,-1,1]:
        return True

    # Finds:
    #  X X
    #    X
    #    X
    elif row_diffs == [0,1,1] and col_diffs == [1,0,0]:
        return True

    # Finds:
    #  X X
    #  X
    #  X
    elif row_diffs == [0,1,1] and col_diffs == [1,-1,0]:
        return True

    # Otherwise it's not there at all (not thinking about horizontal L's but could add that)
    else:
        return False

#Test case 1
def test_case_1():
    board = [['0' for i in range(8)] for i in range(6)] 
    board[2][1] = 'X' 
    board[2][2] = 'X' 
    board[3][1] = 'X' 
    board[4][1] = 'X' 
    return board

#Test case 2
def test_case_2():
    board = [['0' for i in range(8)] for i in range(6)] 
    board[2][1] = 'X' 
    board[2][0] = 'X' 
    board[3][1] = 'X' 
    board[4][1] = 'X' 
    return board

#Test case 3
def test_case_3():
    board = [['0' for i in range(8)] for i in range(6)] 
    board[1][0] = 'X' 
    board[2][0] = 'X' 
    board[3][0] = 'X' 
    board[3][1] = 'X' 
    return board

#Test case 4
def test_case_4():
    board = [['0' for i in range(8)] for i in range(6)] 
    board[1][2] = 'X' 
    board[2][2] = 'X' 
    board[3][2] = 'X' 
    board[3][1] = 'X'
    return board

##################
#Start of program#
##################
board = test_case_1()
#board = test_case_2()
#board = test_case_3()
#board = test_case_4()

disp_board(board)
if check_winning(board): 
    print('Victory')
else: 
    print('Keep playing')

【讨论】:

  • 好的,非常感谢,我会尝试首先理解 :P,然后将其应用到我的游戏中。如果有任何问题,我会及时通知您。
  • 抱歉这么久才给你更新,但我认为我应该在使用它之前理解代码(:所以在理解它之后,我添加了水平 L 的获胜选项,然后将所有内容添加到我的游戏代码。它有效!所以先生,您让我免于数小时的绝望和头疼。
  • 太棒了!添加水平 L 的工作做得很好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
相关资源
最近更新 更多