在python中创建Connect 4游戏,但不知道从哪里开始获胜

时间:2015-07-08 13:45:13

标签: python

我仍然非常喜欢使用python,但我想从头开始制作我自己的游戏,我知道这是一个很好的练习。我已经将这四个游戏连接在一起,它可以在玩家之间切换并“丢弃”他们各自的作品。现在我需要一个胜利的条件,但老实说,我不知道从哪里开始。为了学习,我更喜欢一些指导而不是直接的代码,当然,任何帮助都会非常感激。谢谢。请注意,当前的while循环仅用于调试。我正在考虑将变量'winner'设置为False并执行循环'而胜利者== False:'并且让win条件将此变量设置为True。

board = [] #List for holding the board

for x in range(6):
    board.append(["O"] * 7) #builds 7 x 6 board (rows x columns)

#function for printing the board
def print_board(board):  
    for row in board:
        print " ".join(row)

print 'Welcome to Connect Four'

player_one = raw_input('Player 1. Enter your name: ')
player_two = raw_input('Player 2. Enter your name: ') #Gets players names

print '%s vs. %s' % (player_one, player_two)
print '--------------'
print print_board(board)
print 'Player 1 is Red(R) and Player 2 is Black(B)'
print 'Let\'s play!!' # Game's 'Opening'

turn = 0 #Keeps track of turn


while turn < 6: #debugging purposes

if turn % 2 == 0: #Determines whose turn it is by checking for even or odd turn 

    print '%s. Choose a column to drop your chip' % (player_one)
    one_choice = int(raw_input('Column: ')) #Determines what column player will drop chip

   #Checks for 'empty slot' from bottom up and fills it with players 'chip'

    if (board[5][one_choice - 1] == 'O'):             
        board[5][one_choice - 1] = 'R'
        print_board(board)
        turn += 1

    elif(board[4][one_choice - 1] == 'O'):
        board[4][one_choice - 1] = 'R'
        print_board(board)
        turn += 1

    elif(board[3][one_choice - 1] == 'O'):
        board[3][one_choice - 1] = 'R'
        print_board(board)
        turn += 1

    elif (board[2][one_choice - 1] == 'O'):
        board[2][one_choice - 1] = 'R'
        print_board(board)
        turn += 1

    elif (board[1][one_choice - 1] == 'O'):
        board[1][one_choice - 1] = 'R'
        print_board(board)
        turn += 1

    elif (board[0][one_choice - 1] == 'O'):
        board[0][one_choice - 1] = 'R'
        print_board(board)
        turn += 1

    else:
        print "Column is full!!"      
else:         

    #Same as above for player 2
    print '%s. Choose a column to drop your chip' % (player_two)
    one_choice = int(raw_input('Column: '))

    if (board[5][one_choice - 1] == 'O'):
        board[5][one_choice - 1] = 'B'
        print_board(board)
        turn += 1

    elif(board[4][one_choice - 1] == 'O'):
        board[4][one_choice - 1] = 'B'
        print_board(board)
        turn += 1

    elif(board[3][one_choice - 1] == 'O'):
        board[3][one_choice - 1] = 'B'
        print_board(board)
        turn += 1

    elif (board[2][one_choice - 1] == 'O'):
        board[2][one_choice - 1] = 'B'
        print_board(board)
        turn += 1

    elif (board[1][one_choice - 1] == 'O'):
        board[1][one_choice - 1] = 'B'
        print_board(board)
        turn += 1

    elif (board[0][one_choice - 1] == 'O'):
        board[0][one_choice - 1] = 'B'
        print_board(board)
        turn += 1

    else:
        print "Column is full!!"

 #Gets me out of loop for debugging
if turn == 6:
    print 'Game Over man!'

2 个答案:

答案 0 :(得分:0)

你有一个7x6的电路板,你需要查看4个相邻或对角线空间的行是否包含相同的符号。这个7x6电路板存储在一个二维阵列中。

对于放在棋盘上的棋子,你必须做4组检查才能看出它是否是一个获奖作品:

  1. 向左/向右检查3件作品。
  2. 检查左上角/右下角中的3件。
  3. 检查左下角/右上角的3件。
  4. 检查上面和下面的3件作品。
  5. 如果我们将X和Y视为当前的电路板坐标,无论我放置哪一块,这些检查都对应于:

    1. X增加/减少,Y是常数。
    2. 随着X增加,Y减少,反之亦然。
    3. 随着X增加,Y增加,反之亦然。
    4. X是常数,Y增加/减少。
    5. 你应该做一个懒惰的检查,检查每个方向,一旦找到不属于你的东西就走另一条路。如果两个方向都已完成并且您的总数不是4,那么这不是获胜的向量并继续进行下一次检查。

      编辑:格式和清晰度。

答案 1 :(得分:0)

这听起来像是一个不相交的集合问题,但是你的图形太小了,以至于每次像@John Rodgers谈论的那样检查所有四个方向可能更容易。虽然不相交的集合可能是一个有用的东西。如果你只想阅读它https://en.wikipedia.org/wiki/Disjoint-set_data_structure

,这是一个维基百科页面