Python Forum
Understanding square bracket use
Thread Rating:
  • 1 Vote(s) - 5 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Understanding square bracket use
#1
I'm currently reading through "Python Programming for the Absolute Beginner, Third Edition" and I need some help to understand a section of a program in the book.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
# Tic-Tac-Toe
# Plays the game of tic-tac-toe against a human opponent
    
# global constants
X = "X"
O = "O"
EMPTY = " "
TIE = "TIE"
NUM_SQUARES = 9
 
 
def display_instruct():
    """Display game instructions.""" 
    print(
    """
    Welcome to the greatest intellectual challenge of all time: Tic-Tac-Toe. 
    This will be a showdown between your human brain and my silicon processor. 
 
    You will make your move known by entering a number, 0 - 8.  The number
    will correspond to the board position as illustrated:
     
                    0 | 1 | 2
                    ---------
                    3 | 4 | 5
                    ---------
                    6 | 7 | 8
 
    Prepare yourself, human.  The ultimate battle is about to begin. \n
    """
    )
 
 
def ask_yes_no(question):
    """Ask a yes or no question."""
    response = None
    while response not in ("y", "n"):
        response = input(question).lower()
    return response
 
 
def ask_number(question, low, high):
    """Ask for a number within a range."""
    response = None
    while response not in range(low, high):
        response = int(input(question))
    return response
 
 
def pieces():
    """Determine if player or computer goes first."""
    go_first = ask_yes_no("Do you require the first move? (y/n): ")
    if go_first == "y":
        print("\nThen take the first move.  You will need it.")
        human = X
        computer = O
    else:
        print("\nYour bravery will be your undoing... I will go first.")
        computer = X
        human = O
    return computer, human
 
 
def new_board():
    """Create new game board."""
    board = []
    for square in range(NUM_SQUARES):
        board.append(EMPTY)
    return board
 
 
def display_board(board):
    """Display game board on screen."""
    print("\n\t", board[0], "|", board[1], "|", board[2])
    print("\t", "---------")
    print("\t", board[3], "|", board[4], "|", board[5])
    print("\t", "---------")
    print("\t", board[6], "|", board[7], "|", board[8], "\n")
 
 
def legal_moves(board):
    """Create list of legal moves."""
    moves = []
    for square in range(NUM_SQUARES):
        if board[square] == EMPTY:
            moves.append(square)
    return moves
 
 
def winner(board):
    """Determine the game winner."""
    WAYS_TO_WIN = ((0, 1, 2),
                   (3, 4, 5),
                   (6, 7, 8),
                   (0, 3, 6),
                   (1, 4, 7),
                   (2, 5, 8),
                   (0, 4, 8),
                   (2, 4, 6))
     
    for row in WAYS_TO_WIN:
        if board[row[0]] == board[row[1]] == board[row[2]] != EMPTY:
            winner = board[row[0]]
            return winner
 
    if EMPTY not in board:
        return TIE
 
    return None
 
 
def human_move(board, human):
    """Get human move.""" 
    legal = legal_moves(board)
    move = None
    while move not in legal:
        move = ask_number("Where will you move? (0 - 8):", 0, NUM_SQUARES)
        if move not in legal:
            print("\nThat square is already occupied, foolish human.  Choose another.\n")
    print("Fine...")
    return move
 
 
def computer_move(board, computer, human):
    """Make computer move."""
    # make a copy to work with since function will be changing list
    board = board[:]
    # the best positions to have, in order
    BEST_MOVES = (4, 0, 2, 6, 8, 1, 3, 5, 7)
 
    print("I shall take square number", end=" ")
     
    # if computer can win, take that move
    for move in legal_moves(board):
        board[move] = computer
        if winner(board) == computer:
            print(move)
            return move
        # done checking this move, undo it
        board[move] = EMPTY
     
    # if human can win, block that move
    for move in legal_moves(board):
        board[move] = human
        if winner(board) == human:
            print(move)
            return move
        # done checkin this move, undo it
        board[move] = EMPTY
 
    # since no one can win on next move, pick best open square
    for move in BEST_MOVES:
        if move in legal_moves(board):
            print(move)
            return move
 
 
def next_turn(turn):
    """Switch turns."""
    if turn == X:
        return O
    else:
        return X
 
     
def congrat_winner(the_winner, computer, human):
    """Congratulate the winner."""
    if the_winner != TIE:
        print(the_winner, "won!\n")
    else:
        print("It's a tie!\n")
 
    if the_winner == computer:
        print("As I predicted, human, I am triumphant once more.  \n" \
              "Proof that computers are superior to humans in all regards.")
 
    elif the_winner == human:
        print("No, no!  It cannot be!  Somehow you tricked me, human. \n" \
              "But never again!  I, the computer, so swear it!")
 
    elif the_winner == TIE:
        print("You were most lucky, human, and somehow managed to tie me.  \n" \
              "Celebrate today... for this is the best you will ever achieve.")
 
 
def main():
    display_instruct()
    computer, human = pieces()
    turn = X
    board = new_board()
    display_board(board)
 
    while not winner(board):
        if turn == human:
            move = human_move(board, human)
            board[move] = human
        else:
            move = computer_move(board, computer, human)
            board[move] = computer
        display_board(board)
        turn = next_turn(turn)
 
    the_winner = winner(board)
    congrat_winner(the_winner, computer, human)
 
 
# start the program
main()
input("\n\nPress the enter key to quit.")
The section I'm having problems understanding is

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def winner(board):
    """Determine the game winner."""
    WAYS_TO_WIN = ((0, 1, 2),
                   (3, 4, 5),
                   (6, 7, 8),
                   (0, 3, 6),
                   (1, 4, 7),
                   (2, 5, 8),
                   (0, 4, 8),
                   (2, 4, 6))
     
    for row in WAYS_TO_WIN:
        if board[row[0]] == board[row[1]] == board[row[2]] != EMPTY:
            winner = board[row[0]]
            return winner
 
    if EMPTY not in board:
        return TIE
 
    return None
How is this determining a winner in the game, the way I'm reading it it looks like it is looking at the top row of the board only.

I know it is doing more than that since when I run the program it works fine.
Reply
#2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def winner(board):
    """Determine the game winner."""
    # create a tuple list
    WAYS_TO_WIN = ((0, 1, 2),
                   (3, 4, 5),
                   (6, 7, 8),
                   (0, 3, 6),
                   (1, 4, 7),
                   (2, 5, 8),
                   (0, 4, 8),
                   (2, 4, 6))
     
    # loops through tuple list
    for row in WAYS_TO_WIN: #(0,1,2) next loop (3,4,5) next loop (6,7,8) and so on.
        # check out board position.
        # first loop (0, 1, 2), row[0] = 0, row[1] = 1, row[2] = 2
        # if board[0] == board[1] == board[2] != EMPTY:
        # second loop (3, 4, 5), row[0] = 3, row[1] = 4, row[2] = 5
        # if board[3] == board[4] == board[5] != EMPTY:
        # so on
        if board[row[0]] == board[row[1]] == board[row[2]] != EMPTY:
            winner = board[row[0]]
            return winner
  
    if EMPTY not in board:
        return TIE
  
    return None
99 percent of computer problems exists between chair and keyboard.
Reply
#3
WAYS-TO-WIN is a collection of different rows. the line
1
for row in WAYS-TO-WIN
...iterates over that collection and tests every item in the collection until a win is found, the board is full with no win, or there's no win item in that collection.
Reply
#4
Thank you both for your answer, I see that I was reading it correctly just failing to understand the loop process.
Reply
#5
(Jan-26-2018, 01:15 PM)wahsape Wrote: Thank you both for your answer, I see that I was reading it correctly just failing to understand the loop process.
Good
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Im at square one even with trying to install python origen 1 1,007 Jan-12-2024, 05:39 AM
Last Post: ndc85430
  Grouping Data based on 30% bracket purnima1 4 2,195 Mar-10-2023, 07:38 PM
Last Post: deanhystad
  square root of 5 input numbers mrityunjoy 1 2,652 Jun-10-2020, 11:08 AM
Last Post: perfringo
  square root of 6 input numbers mrityunjoy 3 3,507 Jun-07-2020, 06:35 AM
Last Post: ndc85430
  How to print counter without bracket in python and sort data. phob0s 1 3,635 Jul-25-2019, 05:33 PM
Last Post: ichabod801
  How to print data in bracket in list in one side. phob0s 2 3,010 Jul-23-2019, 08:00 AM
Last Post: phob0s
  How to simplify square finding program? meknowsnothing 3 3,844 Jun-11-2019, 08:20 PM
Last Post: meknowsnothing
  cropping a picture (always square) Leon 1 2,834 Aug-13-2018, 10:04 AM
Last Post: Leon
  Error when trying to square a number pistacheoowalnuttanker 5 4,874 Jul-20-2018, 02:23 AM
Last Post: pistacheoowalnuttanker
  Why does function print require bracket for text? richardm55 2 4,003 May-23-2018, 07:30 PM
Last Post: buran

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020