Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:尝试编写connectfour:Winning条件的变体不会';停不下来_Python_Arrays_For Loop_Matrix_Infinite Loop - Fatal编程技术网

Python:尝试编写connectfour:Winning条件的变体不会';停不下来

Python:尝试编写connectfour:Winning条件的变体不会';停不下来,python,arrays,for-loop,matrix,infinite-loop,Python,Arrays,For Loop,Matrix,Infinite Loop,我一直在尝试为我的编程课编写connect four的变体。该电路板的尺寸为6x8。在我试图编程的变体中,获胜的条件是基本上构建一个L 这意味着表单的任何构造 X X xx 是获胜的条件。 我一直在尝试创建一个函数,连续检查每一列中是否有相同的符号,以构建一对。以及一个对每行执行相同操作的函数。使用这两个函数,我将检查两对是否连续,因为无论如何组合垂直和水平对,它都将始终构建一个“L” 为了弄清楚我用的黑板 def ClearBoardSingle(): global Board

我一直在尝试为我的编程课编写connect four的变体。该电路板的尺寸为6x8。在我试图编程的变体中,获胜的条件是基本上构建一个L

这意味着表单的任何构造
X
X
xx
是获胜的条件。
我一直在尝试创建一个函数,连续检查每一列中是否有相同的符号,以构建一对。以及一个对每行执行相同操作的函数。使用这两个函数,我将检查两对是否连续,因为无论如何组合垂直和水平对,它都将始终构建一个“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])
对于我的界面,我正在使用

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])
我已经知道了如何在板内更改变量,我已经差不多完成了。我唯一不知道如何实施的是获胜的条件。我对行尝试了此函数:

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
def垂直调用列表(列):
全球董事会
全球选择
全局行0
列=int(列)
Choice=int(Choice)
打印(列“C”)
当列>0时:
对于范围(列)中的板[列][选择]:
行0.追加(板[列][选项])
如果列==6或列==-1:
打破
其他:
垂直校准师(第1列)
如果列==0:
打破
其他:
持续
如果列==0:
列+=1
当列<5时:
列+=1
如果第0行[列]==第0行[列-1]:
打印('对')
其他:
打印('无对')
通过
其他:
通过
但它进入了一个无止境的循环。
我再也不知道如何实施获胜条件了。我将感谢任何形式的帮助或想法。如果您想让我发布整个代码或其他类型的代码片段,请索取它们


谢谢你的期待

很酷的问题,下面看起来有很多代码,但实际上不是。我还没有详细检查过,所以我不相信它没有发现假阳性,但它似乎找到了应该找到的L。我所做的主要工作是使用itertools.compositions来获取X位置的所有4个大小的组,然后检查它们是否与我期望的L的模式相似。在
check\u four\u 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')

哇,听起来就像是我遇到的CS101问题,当内存以MBis度量时,你的代码格式正确吗?可能只是剪切粘贴错误,所以?代码缩进会影响变量范围。我在另一个文件中编程了获胜条件,所以我不会意外地弄乱我的游戏代码。我尝试了我的“游戏”,它工作正常,但由于我还没有实现获胜条件,游戏只有在所有字段都被填充时才会结束(本例中为48)。@No7ExQ请格式化您的代码变量/函数名()。哦,是的,我昨天做了,谢谢您的提醒(:好的,非常感谢,我会首先尝试理解:P,然后在我的游戏中实现它。如果有任何错误,我会让你不断更新。很抱歉花了这么长时间给你更新,但我认为我应该在使用它之前理解代码(:所以在理解后,我为水平L添加了获胜选项,然后将所有内容都添加到我的游戏代码中。这很有效!!所以先生让我免于数小时的绝望和严重的头痛。太棒了!添加水平L做得很好!