2

私がそのようなリストを持っているとしましょう:

board = 
[[0, 0, 0, 0, 0,], 
[0, 0, 0, 0, 0,], 
[0, 0, 0, 0, 0,], 
[0, 0, 0, 0, 0,], 
[0, 0, 0, 0, 0,]

これは、2Dボード上のスペースを表します。
プレイヤー1が行くと、1に変わります。
プレイヤー2が行くと、2に変わります。

勝利条件は次のとおりです。行または列が完全に埋められているか、斜めになっている場合。

水平または垂直の勝者のための私の関数は次のとおりです。

def horizontal_winner(board, boxes):
    '''
    function will find if the horizontal win conditions apply
    given 2 inputs. the board, a list and the number of boxes
    - board - the 2D board of the game
    - boxes - number of boxes per side
    ''' 
    for i in range(boxes):
        player_1 = 0
        player_2 = 0
        for j in range(boxes):
            if board[i][j] == 1:# first iteration - [1, 0, 0, 0, 0]
                player_1 += 1
                print("p1: " + str(player_1))
            elif board[i][j] == 2:# first iteration - [2, 0, 0, 0, 0]
                player_2 += 1
                print("p2: " + str(player_2))
        if player_1 == boxes:
            return True
        elif player_2 == boxes:
            return False


def vertical_winner(board, boxes):
    '''
    function will find if the vertical win conditions apply
    given 2 inputs. the board, a list and the number of boxes per side
    - board - the 2D board of the game
    - boxes - number of boxes per side
    '''
    for i in range(boxes):
        player_1 = 0
        player_2 = 0 
        for j in range(boxes):
            if board[j][i] == 1:# first iteration - [1, 0, 0, 0, 0]
                player_1 += 1
            elif board[j][i] == 2:# first iteration - [2, 0, 0, 0, 0]
                player_2 += 1
        if player_1 == boxes:
            return True
        elif player_2 == boxes:
            return False

斜めにチェックするにはどうすればよいですか?

4

3 に答える 3

3

まず、対角線が2つしかないことを認識してください。そして、それらの各ボックスの座標は、範囲内のいくつかのi(ボックス)に対して(i、i)または(boxes-i-1、i)のいずれかです。それはあなたがそれを理解するのに役立つはずです。

于 2012-12-06T19:09:10.997 に答える
1

を使用して、このようなものを試してくださいall()

から始めi=0i=len(board)-1、対角要素は次を使用してフェッチできますboard[i][i]

In [116]: board=[[1, 0, 0, 0, 0,], 
[0, 1, 0, 0, 0,], 
[0, 0, 1, 0, 0,], 
[0, 0, 0, 1, 0,], 
[0, 0, 0, 0, 1,]]

In [117]: all(board[i][i]==board[0][0] for  i in range(len(board)))
Out[117]: True

In [119]: [board[i][i] for  i in range(len(board))]  #value of diagonal elements
Out[119]: [1, 1, 1, 1, 1]

# another example:

In [120]: board=[[0, 0, 0, 0, 0,], 
[0, 1, 0, 0, 0,], 
[0, 0, 1, 0, 0,], 
[0, 0, 0, 1, 0,], 
[0, 0, 0, 0, 1,]]

In [121]: [board[i][i] for  i in range(len(board))]
Out[121]: [0, 1, 1, 1, 1]

In [122]: all(board[i][i]==board[0][0] for  i in range(len(board)))
Out[122]: False
于 2012-12-06T19:08:41.760 に答える
0

4つのケースを別々に検討する必要があります。例を挙げて説明します

単一行の連続した1

>>> board1 =[[0, 0, 0, 0, 0,],
[1, 1, 1, 1, 1,],
[0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0,]]
>>> any(map(all,board1))
True

単一の列の連続した1

>>> board2 =[[0, 1, 0, 0, 0,],
[0, 1, 0, 0, 0,],
[0, 1, 0, 0, 0,],
[0, 1, 0, 0, 0,],
[0, 1, 0, 0, 0,]]
>>> any(map(all,zip(*board2)))
True

前方対角線の連続した1

>>> board3 =[[1, 0, 0, 0, 0,],
[0, 1, 0, 0, 0,],
[0, 0, 1, 0, 0,],
[0, 0, 0, 1, 0,],
[0, 0, 0, 0, 1,]]
>>> all(list(islice(chain(*board3),0,None,len(board4)+1)))
True

逆対角の連続した1

>>> board4 =[[0, 0, 0, 0, 1,],
[0, 0, 0, 1, 0,],
[0, 0, 1, 0, 0,],
[0, 1, 0, 0, 0,],
[1, 0, 0, 0, 0,]]
>>> all(list(islice(chain(*reversed(board4)),0,None,len(board4)+1)))
True

要約すると

from itertools import chain, isclice
any(any(map(all,board)),
    any(map(all,zip(*board))),
    all(list(islice(chain(*board),0,None,len(board4)+1))),
    all(list(islice(chain(*reversed(board)),0,None,len(board4)+1))))
于 2012-12-06T19:44:40.073 に答える