【问题标题】:Winning condition in Connect four game (Python)?连接四游戏(Python)中的获胜条件?
【发布时间】:2018-11-16 15:46:18
【问题描述】:

我已经在一个四人组游戏上工作了几个星期(初学者),我几乎完成了。但我唯一的问题是我似乎无法让获胜条件发挥作用。老实说,我不知道如何解决它,所以我希望这里的人能看到问题所在。直到最后一条评论 (#) 的上半部分工作正常,它打印板,在错误输入时给出错误消息,并将碎片放在你想要的地方。唯一仍然不起作用的是获胜条件。我无法完成一场比赛,它会让我连续打到 7 场,而且不会给出获胜条件。我的代码可以在下面找到!

ROW_COUNT = 6                               #CREEEREN VAN HET BORD
COLUMN_COUNT = 7

Board = []
for x in range(ROW_COUNT): Board.append(list([0] * COLUMN_COUNT))

def drop_piece(Board, row, Column, piece):  #PLAATSEN VAN EEN RONDJE
    Board[row][Column] = piece

def is_valid_location(Board, Column):       #CHECKEN OF DE PLEK OP HET BORD LEEG IS
    return Board[-1][Column] == 0

def get_next_open_row(Board, Column):       #CHECKEN OF DE ROW LEEG IS
    for r in range(ROW_COUNT):
        if Board[r][Column]==0:
            return r

gameOver = False
turn = True

while not gameOver:
    if turn: player = 1
    else: player = 2
    UserInput = input("Player " + str(player) + ", Make your turn(0-6):")
    if UserInput.isdigit():
        Column = int(UserInput)
    else:
        print("Your input has to be between 0 and 6!")
        UserInput = input("Player " + str(player) + ", Make your turn(0-6):")

    if Column != 0 and Column != 1 and Column != 2 and Column != 3 and Column != 4 and Column != 5 and Column != 6:
       print("Your input has to be between 0 and 6!")
       UserInput = input("Player " + str(player) + ", Make your turn(0-6):")
    else:
        if is_valid_location(Board, Column):
            row = get_next_open_row(Board, Column)
            drop_piece(Board, row, Column, player)
            turn = not turn
        else: print("Invalid selection")

        for row in reversed(Board):
            print(row)                  # EVERYTHING UNTIL HERE WORKS FINE!

#HORIZONTAAL
for C in range(COLUMN_COUNT - 3):
    for R in range(ROW_COUNT):
        if Board[R][C] == 1 and Board[R][C + 1] == 1 and Board[R][C + 2] == 1 and Board[R][C + 3] == 1:
            print("You've won")
#VERTICAAL
for C in range(COLUMN_COUNT):
    for R in range(ROW_COUNT - 3):
        if Board[R][C] == 1 and Board[R + 1][C] == 1 and Board[R + 2][C] == 1 and Board[R + 3][C] == 1:
            print("You've won")
#DIAGONAAL
for C in range(COLUMN_COUNT - 3):
    for R in range(ROW_COUNT - 3):
        if Board[R][C] == 1 and Board[R + 1][C + 1] == 1 and Board[R + 2][C + 2] == 1 and Board[R + 3][C + 3] == 1:
            print ("You've won")

【问题讨论】:

  • 基于切片的列表比较可以简化这一点:例如,if Board[R][C:C+4] == [1,1,1,1]:

标签: python


【解决方案1】:

根据您的缩进,在 while 循环结束之前,甚至不会查看这些检查。缩进所有三个检查,使它们在 while 循环内。此外,您的支票需要将gameOver 设置为True,这样游戏才能在您获胜时真正结束。

【讨论】:

    【解决方案2】:

    只是提醒您:您还需要一个获胜条件,用于反向对角线。

    这是我很久以前的解决方案,看看你能做些什么。

     for x in range(len(Board)):
            for y in range(len(Board[x])):
                for turn in ['r', 'b']:
                    try:
                        # Sideways line checking
                        if Board[x][y] == turn and Board[x][y+1] == turn and Board[x][y+2] == turn and Board[x][y+3]: pass
                    except:# In case of a RangeError, meaning it checks for Board off the edge of the board
                        pass
                    else:
                        if Board[x][y] == turn and Board[x][y+1] == turn and Board[x][y+2] == turn and Board[x][y+3] == turn:
                            winner = turn
                            gamestate = "Win"
                    try: # Diagonal-right check
                        if Board[x][y] == turn and Board[x+1][y+1] == turn and Board[x+2][y+2] == turn and Board[x+3][y+3]: pass
                    except:
                        pass
                    else:
                        if Board[x][y] == turn and Board[x+1][y+1] == turn and Board[x+2][y+2] == turn and Board[x+3][y+3] == turn:
                            winner = turn
                            gamestate = "Win"
                    try: #Vertical Check
                        if Board[x][y] == turn and Board[x+1][y] == turn and Board[x+2][y] == turn and Board[x+3][y]: pass
                    except:
                        pass
                    else:
                        if Board[x][y] == turn and Board[x+1][y] == turn and Board[x+2][y] == turn and Board[x+3][y] == turn:
                            winner = turn
                            gamestate = "Win"
                    try: # Diagonal-left check
                        if Board[x][y] == turn and Board[x-1][y+1] == turn and Board[x-2][y+2] == turn and Board[x-3][y+3]: pass
                    except:
                        pass
                    else:
                        if Board[x][y] == turn and Board[x-1][y+1] == turn and Board[x-2][y+2] == turn and Board[x-3][y+3] == turn:
                            winner = turn
                            gamestate = "Win"
        if 'e' not in Board[0] and gamestate != "Win": # Checks for Tie (if there is any emty spaces in the top row after checking for a win)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多