Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Solitare Code Error
#1
Hello, I am fairly new to Python and have taken on a project of creating a free cell solitaire game. The code runs perfectly except for this error I get when I enter any command like 't2f' or 'h' (t2f = tableau to foundation; h = help). The error is 'list index out of range'. It brings me to line 300 but I don't have a clue on how to fix it. Help would be greatly appreciated.

Here is the code at line 300: https://pastebin.com/TRQLiPsU

Here is the full code for the game: https://pastebin.com/TV3BQ9V0

Here is the full code for the cards: https://pastebin.com/zv0VDbV8


Thank you whoever can help.
Reply
#2
Please post all code, output and errors (in it's entirety) between their respective tags. Refer to BBCode help topic on how. Use the "Preview Post" button to make sure the code is presented as you expect before hitting the "Post Reply/Thread" button.

Show entire error traceback, complete and unaltered

Show code, a line of code is almost always not enough to diagnose a problem
Reply
#3
Full code:

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
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
import random
import math
from cards import Deck
from cards import Card
 
 
def setup():
    """
    paramaters: None (deck can be created within this function)
    returns:
    - a foundation (list of 4 empty lists)
    - cell (list of 4 empty lists)
    - a tableau (a list of 8 lists, the dealt cards)
    """
    global gametime
    gametime = 0
    d = Deck()
    d.shuffle()
    foundation = [[], [], [], []]#placeholder, needs replaced!!
    #placeholder, needs replaced!!
    tableau1 = [] #placeholder, needs replaced!!
    tableau2 = []
    tableau3 = []
    tableau4 = []
    tableau5 = []
    tableau6 = []
    tableau7 = []
    tableau8 = []
    global cell
    cell = [(),(),(),()]
    for i in range(0,7):
        tableau1.append(d.deal())
    for i in range(7,14):
        tableau2.append(d.deal())
    for i in range(14,21):
        tableau3.append(d.deal())
    for i in range(21,28):
        tableau4.append(d.deal())
    for i in range(28,34):
        tableau5.append(d.deal())
    for i in range(34,40):
        tableau6.append(d.deal())
    for i in range(40,46):
        tableau7.append(d.deal())
    for i in range(46,52):
        tableau8.append(d.deal())
    tableau = [tableau1, tableau2, tableau3, tableau4, tableau5, tableau6, tableau7, tableau8]
    return foundation, tableau, cell
 
 
 
 
def move_to_foundation(tableau, foundation, t_col, f_col):
     
    #Get rank and get suit graphs the rank and suit of the card and this method checks the rank and suit
     
    one = tableau[t_col][-1]
    two = foundation[f_col]
     
    '''
    Finds the rank and suit ^^^^^^^^^
    '''
     
    if foundation[f_col] == []:
        if one.get_rank() == 1:
            foundation[f_col].append(one) #adds the card
            del tableau[t_col][-1] #del function removes card from tableau
    elif one.get_suit() == two.get_suit():
        if one.get_rank()== two.get_rank()+1:
            foundation[f_col].append(one)
            del tableau[t_col][-1]
     
    '''
    parameters: a tableau, a foundation, column of tableau, column of foundation
    returns: Boolean (True if the move is valid, False otherwise)
    moves a card at the end of a column of tableau to a column of foundation
    This function can also be used to move a card from cell to foundation
    '''
 
 
def move_to_cell(tableau, cell, t_col, c_col):
     
    one = tableau[t_col][-1]
    two = cell[c_col]
     
    if two == []:
        cell[c_col].append(one) #Appends tableau column card
        del tableau[t_col][-1] #del function removes card from tableau
     
    '''
    parameters: a tableau, a cell, column of tableau, column of cell
    returns: Boolean (True if the move is valid, False otherwise)
    moves a card at the end of a column of tableau to a cell
    '''
 
 
def move_to_tableau(tableau, foundation, t_col, f_col, c_col):
     
    #s,c,d,h all refer to card colors and the code checks if colors are allowed
     
    one = tableau[t_col][-1]
     
    if cell[c_col] != []: #Does not equal empty slot for a card
        two = cell[c_col][0]
         
        if one == two+1:
            if "d" in one or "h" in one: #runs the red cards first
                if "s" in two or "c" in two:
                    tableau[t_col].append(two)
                    del cell[c_col][-1]
                     
            elif "d" in two or "h" in two: #runs the red cards first
                if "s" in one or "c" in one:
                    tableau[t_col].append(two)
                    del cell[c_col][-1]
                     
                     
     
    '''
    parameters: a tableau, a cell, column of tableau, a cell
    returns: Boolean (True if the move is valid, False otherwise)
    moves a card in the cell to a column of tableau
    remember to check validity of move
    '''
 
 
def is_winner(foundation):
    gametime = 0
    while gametime == 0:
        if foundation[0] != []:
            if foundation[1] != []:
                if foundation[2] != []:
                    if foundation[3] != []:
                        print("You won!")
                        gametime = 1
     
    '''
    parameters: a foundation
    return: Boolean
    '''
 
 
def move_in_tableau(tableau, t_col_source, t_col_dest):
     
    #s,c,d,h all refer to card colors and the code checks if colors are allowed
     
    one = tableau[t_col_source][-1]
    two = tableau[t_col_dest][-1]
     
    if one == two+1:
        if "d" in one or "h" in one: #runs the red cards first
            if "s" in two or "c" in two:
                tableau[t_col_dest].append(one)
                 
                del cell[t_col_source][-1]
                 
                 
        elif "d" in two or "h" in two: #runs the red cards first
            if "s" in one or "c" in one:
                tableau[t_col_dest].append(one)
                 
                del cell[t_col_source][-1]
                 
                 
     
    '''
    parameters: a tableau, the source tableau column and the destination tableau column
    returns: Boolean
    move card from one tableau column to another
    remember to check validity of move
    '''
    pass
 
 
def print_game(foundation, tableau, cell):
    """
    parameters: a tableau, a foundation and a cell
    returns: Nothing
    prints the game, i.e, print all the info user can see.
    Includes:
        a) print tableau
        b) print foundation ( can print the top card only)
        c) print cells
 
    """
    print()
    print("                 Cells:                              Foundation:")
    # print cell and foundation labels in one line
    for i in range(4):
        print('{:8d}'.format(i + 1), end='')
    print('    ', end='')
    for i in range(4):
        print('{:8d}'.format(i + 1), end='')
    print()  # carriage return at the end of the line
 
    # print cell and foundation cards in one line; foundation is only top card
    for c in cell:
        # print if there is a card there; if not, exception prints spaces.
        try:
            print('{:8s}'.format(c[0].rank_and_suit()), end='')
        except IndexError:
            print('{:8s}'.format(''), end='')
 
    print('    ', end='')
    for stack in foundation:
        # print if there is a card there; if not, exception prints spaces.
        try:
            print('{:8s}'.format(stack[-1].rank_and_suit()), end='')
        except IndexError:
            print('{:8s}'.format(''), end='')
 
    print()  # carriage return at the end of the line
    print('----------')
 
    print("Tableau")
    for i in range(len(tableau)):  # print tableau headers
        print('{:8d}'.format(i + 1), end='')
    print()  # carriage return at the end of the line
 
    # Find the length of the longest stack
    max_length = max([len(stack) for stack in tableau])
 
    # print tableau stacks row by row
    for i in range(max_length):  # for each row
        print(' ' * 7, end='')  # indent each row
        for stack in tableau:
            # print if there is a card there; if not, exception prints spaces.
            try:
                print('{:8s}'.format(stack[i].rank_and_suit()), end='')
            except IndexError:
                print('{:8s}'.format(''), end='')
        print()  # carriage return at the end of the line
    print('----------')
 
 
def print_rules():
    '''
    parameters: none
    returns: nothing
    prints the rules
    '''
    print("Rules of FreeCell")
 
    print("Goal")
    print("\tMove all the cards to the Foundations")
 
    print("Foundation")
    print("\tBuilt up by rank and by suit from Ace to King")
 
    print("Tableau")
    print("\tBuilt down by rank and by alternating color")
    print("\tThe bottom card of any column may be moved")
    print("\tAn empty spot may be filled with any card ")
 
    print("Cell")
    print("\tCan only contain 1 card")
    print("\tThe card may be moved")
 
 
def show_help():
    '''
    parameters: none
    returns: nothing
    prints the supported commands
    '''
    print("Responses are: ")
    print("\t t2f #T #F - move from Tableau to Foundation")
    print("\t t2t #T1 #T2 - move card from one Tableau column to another")
    print("\t t2c #T #C - move from Tableau to Cell")
    print("\t c2t #C #T - move from Cell to Tableau")
    print("\t c2f #C #F - move from Cell to Foundation")
    print("\t 'h' for help")
    print("\t 'q' to quit")
 
 
def play():
    '''
    Main program. Does error checking on the user input.
    '''
    print_rules()
    foundation, tableau, cell = setup()
 
    show_help()
    while True:
 
        print_game(foundation, tableau, cell)
        response = input("Command (type 'h' for help): ")
        response = response.strip()
        response_list = response.split()
        if len(response_list) > 0:
            r = response_list[0]
             
            f_col = response_list[2] #Defines f_col
            t_col = response_list[1] #Defines t_col
            c_col = response_list[2] #Defines c_col
             
            '''
            t_col and f_col here ^^^^^^^^^^^^^^^^
            '''
             
            if r == 't2f':
                move_to_foundation(tableau, foundation, t_col, f_col)
            elif r == 't2t':
                move_in_tableau(tableau, t_col_source, t_col_dest)
            elif r == 't2c':               
                move_to_cell(tableau, cell, t_col, c_col)
            elif r == 'c2t':
                move_to_tableau(tableau, cell, t_col, c_col)
            elif r == 'c2f':
                move_to_foundation(tableau, foundation, t_col, f_col)
            elif r == 'q':
                break #Break quits the whole game
            elif r == 'h':
                show_help() #Calls for help method
            else:
                print('Unknown command:', r)
        else:
            print("Unknown Command:", response)
    print('Thanks for playing')
 
 
play()
Error:

Error:
File "<ipython-input-3-c13463e23dee>", line 1, in <module> runfile('/Users/mcaggiano2022/Desktop/hacking project/Programming Project 4/freecell.py', wdir='/Users/mcaggiano2022/Desktop/hacking project/Programming Project 4') File "//anaconda3/lib/python3.7/site-packages/spyder_kernels/customize/spydercustomize.py", line 827, in runfile execfile(filename, namespace) File "//anaconda3/lib/python3.7/site-packages/spyder_kernels/customize/spydercustomize.py", line 110, in execfile exec(compile(f.read(), filename, 'exec'), namespace) File "/Users/mcaggiano2022/Desktop/hacking project/Programming Project 4/freecell.py", line 329, in <module> play() File "/Users/mcaggiano2022/Desktop/hacking project/Programming Project 4/freecell.py", line 300, in play f_col = response_list[2] #Defines f_col IndexError: list index out of range
likes this post
Reply
#4
error doesn't match code.
actual code is on line 293
after line 289, add:
print(f"length response_list: {len(response_list)}")
to check list length

I'm guessing that:
1
2
3
f_col = response_list[2] #Defines f_col
t_col = response_list[1] #Defines t_col
c_col = response_list[2] #Defines c_col
should be:
1
2
3
f_col = response_list[1] #Defines f_col
t_col = response_list[0] #Defines t_col
c_col = response_list[1] #Defines c_col
considering list indexes start with 0
Reply


Forum Jump:

User Panel Messages

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