View difference between Paste ID: upHBh8fs and MVXjk1fV
SHOW: | | - or go back to the newest paste.
1
# Dora Jambor, dorajambor@gmail.com
2
# January, 2016
3
# Implementation of the game fifteen in Python
4
 
5-
import time, pdb
5+
#import time, pdb
6
from Tkinter import *
7
 
8
# ---------- parameters ----------
9
10
# Dimensions
11
min_dim = 3
12
max_dim = 9
13
 
14
# Board elements
15
d = 0
16
board = []
17
counter = 0
18
 
19
# Location of blank space
20
blankx = 0
21
blanky = 0
22
 
23
# ---------- functions ----------
24
25
def greet():
26
    print 'This is the Game of Fifteen!'
27-
    global min_dim, max_dim, d
27+
 
28-
    d = int(raw_input('Insert the dimension of the board: '))
28+
29
    # global d # if you use "return" you don't need access to global variable.
30-
        if d >=min_dim and d <= max_dim:
30+
               # you can even use different name - for example `result`.
31
    
32-
        d = int(raw_input('Try again: '))
32+
    result = int(raw_input('Insert the dimension of the board: '))
33-
    return d     
33+
34
    while True:
35-
# Initialize the board 
35+
        if result >=min_dim and result <= max_dim:
36
            break
37-
This fills up the two-dimensional board[][] list with numbers ascending 
37+
        result = int(raw_input('Try again: '))
38
        
39
    return result
40
41-
    numbers = d * d - 1
41+
# Initialize the board
42-
    global board, blankx, blanky, game_running
42+
43
This fills up the two-dimensional board[][] list with numbers ascending
44
from the inputted dimension to 1
45-
    board = []
45+
46
def setup():
47-
    # Fill board with stringvars
47+
48-
    var_text = StringVar()
48+
49-
    for i in range(d):
49+
    # set or reset all data and variables
50-
        row = []
50+
    # without creating board and buttons
51-
        for j in range(d):
51+
52-
            row.append(var_text.get())
52+
    # label is now invisible
53-
            var_text.set(numbers)
53+
    label.lower()
54
    
55
    # set blank 
56-
                var_text.set(' ')
56+
57-
        board.append(row) 
57+
58
59-
    for j, row in enumerate(board):
59+
    # fill board with numbers - it changes buttons too
60-
        buttons_row = []
60+
    # StringVar requires the use of get() and set()
61-
        for i, string_var in enumerate(row):
61+
62-
            b = tk.Label(root, textvariable=string_var)
62+
    numbers = d * d
63-
            b.grid(row=j, column=i)
63+
64-
            buttons_row.append(b)
64+
    for row in board:
65-
        buttons.append(buttons_row)
65+
        for string_var in row:
66
67
            numbers -= 1
68
69
            if numbers == 0:
70-
A function called by Tkinter that allows the user to interact with the game board 
70+
                string_var.set(' ')
71
            else:
72-
'''   
72+
                string_var.set(str(numbers))
73-
def play(i,j):
73+
74
    # set other variables
75
    game_running = True
76
77-
            board[blanky][blankx] = board[j][i]
77+
 
78-
            board[j][i] = ' '
78+
79-
            buttons[blanky][blankx]['text'] = buttons[j][i]['text']
79+
80-
            buttons[j][i]['text'] = '   '
80+
A function called by Tkinter that allows the user to interact with the game board
81
and play the game by moving the tiles.
82
'''  
83
def play(i, j):
84
    global blankx, blanky, game_running
85
86
    #print 'play i,j:', i, j
87
    #print 'blankx, blanky:', blankx, blanky
88-
    else:
88+
89-
        setup()
89+
90-
        game_running = True
90+
        
91-
        # label is now invisible
91+
92-
        label.lower()
92+
93-
                                                                        
93+
            # StringVar requires the use of get() and set()
94
            #board[blanky][blankx] = board[j][i]
95
            #board[j][i] = ' '
96
            board[blanky][blankx].set( board[j][i].get() )
97-
    for j, row in enumerate(board):
97+
            board[j][i].set(' ')
98-
        for i, char in enumerate(row,1):
98+
99
            # you don't need it - StringVar do it for you
100-
            if number == d * d and char == ' ':
100+
            #buttons[blanky][blankx]['text'] = buttons[j][i]['text']
101
            #buttons[j][i]['text'] = '   '
102-
            elif str(char) != str(number):
102+
103
            blanky = j
104
            blankx = i
105
           
106
            if won():
107
                # lable is now visible
108
                label.lift()
109
                game_running = False
110
111
    # probably you don't need it - `label for winning` will call `setup`
112-
# Frame for the board game
112+
    #else:
113
        # reset board (without creating new board) and restart game
114
    #    setup()
115-
frame.grid(row=0, column=0)
115+
 
116
                                                                       
117-
# label for winning
117+
118
119
    # StringVar ('char') requires the use of get() and set()
120
    
121
    number = 0
122
123
    for row in board:
124
        for string_var in row:
125-
init()
125+
126-
buttons = []
126+
127
            
128
            if number == d * d and string_var.get() == ' ':
129-
    buttons_row = [] 
129+
130-
    for i, char in enumerate(row):
130+
            elif string_var.get() != str(number):
131-
        v = StringVar()
131+
132-
        v = board[j][i]
132+
                
133-
        b = Label(frame, textvariable=v, bg='pink', font=("Helvetica", 30))       
133+
134-
        if board[j][i]== d * d:
134+
 
135-
            b = Label(frame, textvariable = '   ', bg='pink',font=("Helvetica", 30))
135+
 
136-
        b.grid(row=j, column=i,sticky="nsew", padx=4, pady=4)
136+
137
138-
        buttons_row.append(b)
138+
# - befor tkinter window -
139-
    buttons.append(buttons_row)
139+
140
greet()
141
d = dim()
142-
game_running = True
142+
143
# - create window -
144
145
root = Tk()
146
root.config(bg = 'black', borderwidth=4)
147
root.wm_title("Game of Fifteen")
148
 
149
# - label for winning -
150
151
label = Button(root, text="You won!", fg="pink",font=("Helvetica",15), comman=setup)
152
label.config(bg='black')
153
label.grid(row=0, column=0, ipadx=5, ipady=5)
154
 
155
# - frame for the board game -
156
157
frame = Frame(root)
158
frame.config(bg='black')
159
frame.grid(row=0, column=0) # added to grid after label will hide label
160
161
# - creat board - only once - without numbers 
162
163
# fill board with StringVars 
164
165
for _ in range(d): # if you don't need `j` then you can use `_`
166
    row = []
167
    for _ in range(d): # if you don't need `i` then you can use `_`
168
        # new StringVar for every tile
169
        string_var = StringVar()
170
171
        # append StringVar object, not text from StringVar - get()
172
        row.append(string_var) # without .get()
173
174
    board.append(row)
175
  
176
# - create buttons - only once - without numbers 
177
178
# if you use StringVar you don't need direct access to buttons
179
#buttons = []
180
    
181
for j, row in enumerate(board):
182
    #buttons_row = []
183
    for i, string_var in enumerate(row):
184
        # v = StringVar() # don't need it
185
186
        b = Label(frame, textvariable=string_var, bg='pink', font=("Helvetica", 30))
187
188
        # you can't assign normal text to textvariable
189
        # and you don't have to - put empty text into StringVar in board
190
        #if board[j][i]== d * d:
191
        #   b = Label(frame, textvariable = '   ', bg='pink',font=("Helvetica", 30))
192
            
193
        b.grid(row=j, column=i, sticky="nsew", ipadx=8, padx=4, pady=4)
194
        # ipadx to make 3x3-board bigger and hide `label for winning`
195
        
196
        # if you want to click widget then maybe you should use Button()
197
        # and command= to assing function
198
        
199
        b.bind('<Button-1>',lambda e, i=i,j=j:play(i,j))
200
        
201
        #buttons_row.append(b)
202
    #buttons.append(buttons_row)
203
204
# - fill board with numbers and start game - 
205
setup()    # start over
206
207
root.mainloop()    # start engine