-
Notifications
You must be signed in to change notification settings - Fork 0
/
mouseOnly.py
277 lines (249 loc) · 11.7 KB
/
mouseOnly.py
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
from cmu_cs3_graphics import *
import copy
from state import *
from loadBoard import *
from helpers import *
from backtracker import *
from runAppWithScreens import *
from writeBoard import *
##################################
# Mouse Only Mode
##################################
def mouseOnly_onScreenStart(app):
app.chooseLevel = True
app.filter = None
def appStart(app, filter):
#board dimensions
app.rows = 9
app.cols = 9
app.boardLeft = 20
app.boardTop = 60
app.boardHeight = app.height-80
app.boardWidth = app.boardHeight
app.cellBorderWidth = 1
app.manualBoard = False
if app.filter != 'manual':
app.state = State(loadBoard([filter]))
app.solution = solveSudoku(app.state)
else:
app.manualBoard = True
app.state = State([[0]*9 for i in range(9)])
app.solution = None
app.originalBoard = copy.deepcopy(app.state.board)
app.selection = (app.rows//2, app.cols//2)
app.legalsAuto = True #automatic mode for legals
if app.filter == 'easy':
app.legalsAuto = False
app.showLegals = False
app.toggleLegals = False #unused
app.buttons = False #unused
app.gameOver = False
app.numZeroes = zeroCount(app.state.board) #helps to determine gameOver
#undo and redo
app.movesLst = [(copy.deepcopy(app.state), app.selection)]
app.statePoint = -1
app.undoRedo = False
app.competition = False
#displaying hint 2
app.hint2 = False
app.hint2Draw = []
app.holiday = False
#save as pdf
app.imageWidth = 600
app.imageHeight = 600
app.image1 = CMUImage(drawing(app, 1))
app.image2 = None
def mouseOnly_redrawAll(app):
drawRect(0,0,app.width,app.height,fill='crimson')
if app.chooseLevel:
#draw holiday cheer
drawHolidayCheer(app)
#mode
drawLabel('Mouse Only Mode', app.width//2, app.height//5, fill = 'white', bold = True, size = 35)
#level buttons
drawLevelButtons(app, ['Easy', 'Medium', 'Hard', 'Expert', 'Evil', 'Manual'])
else:
drawBoard(app)
drawBoardBorders(app)
drawNumbers(app, 'normal')
drawMouseButtons(app)
drawHintButtons(app)
msg = f'Mouse Mode ({app.filter} level)'
if app.gameOver:
msg = '*GAME OVER*'
saveAsPdf(app)
drawLabel(msg, app.width//3, app.boardTop-30, fill = 'white', bold = True, size = 35)
#competition mode - save the board when user solves the board (regardless of whether correct)
if app.competition and app.gameOver:
writeFile('boards/submit.txt', convertBoard(app.state.board)) #written to file as submit.txt
#side buttons
drawSideButtons(app)
#load manual board button
if app.filter == 'manual':
drawManualButton(app, 'Load Manual Board')
#draw competition button
cOn = 'On' if app.competition else 'Off'
drawCompetitionButton(app, f'Competition Mode: {cOn}')
#manual board - legality
left = app.boardWidth + 3*app.boardLeft
right = app.width - 2*app.boardLeft
_, cH = getCellSize(app)
if app.solution == None and not app.manualBoard:
drawLabel('Board Has NO Solution', (left+right)//2, app.boardTop + 0.2*cH)
def mouseOnly_onMousePress(app, mouseX, mouseY):
if app.chooseLevel:
selectedButton = getButton(app, mouseX, mouseY)
if selectedButton != None:
app.filter = selectedButton
app.chooseLevel = False
if not app.chooseLevel:
appStart(app, app.filter)
elif not app.gameOver:
selectedCell = getCell(app, mouseX, mouseY)
if selectedCell != None:
#clicked on a number
if type(selectedCell)==int:
if (app.selection != None):
row, col = app.selection
if app.manualBoard: #manual board entry
app.state.set(app.selection[0], app.selection[1], selectedCell)
app.originalBoard[app.selection[0]][app.selection[1]] = selectedCell
app.state.legals[app.selection[0]][app.selection[1]] = set()
elif app.originalBoard[app.selection[0]][app.selection[1]] ==0:
if app.undoRedo: #move right after doing an undo/redo
if app.statePoint != -1: #if at end of list [:0] gives empty list
app.movesLst = app.movesLst[:app.statePoint+1]
app.undoRedo = False
app.statePoint = -1
app.state = copy.deepcopy(app.movesLst[app.statePoint][0])
app.state.set(row, col, selectedCell)
else:
if app.legalsAuto: #set number in cell on board
app.state.set(app.selection[0], app.selection[1], selectedCell)
#manual legals
else:
app.state.board[app.selection[0]][app.selection[1]] = selectedCell
if app.competition: #competition mode
if app.solution != None and app.state.board[row][col] != app.solution[row][col]: #number wrong - game over
app.gameOver = True
#update moves list
app.movesLst.append((copy.deepcopy(app.state),app.selection))
#clicked in a cell on board & legals are done automatically
elif app.legalsAuto:
if (selectedCell == app.selection): #unselect cell
app.selection = None
else:
app.selection = selectedCell #select new cell
else: #manual mode - check if clicked inside a legal
if (selectedCell != app.selection):
app.selection = selectedCell
elif app.showLegals: #toggle legals only if cell is already selected
r,c = selectedCell
i = clickInLegal(app, mouseX, mouseY, r, c)
if (type(i) != tuple): #remove legal
app.state.removeLegal(r, c, i)
else: #add legal
app.state.addLegal(r,c,i[1])
#check if any of pink mouse buttons have been clicked
mouseButton = checkMouseButtons(app, mouseX, mouseY)
if mouseButton != None:
if mouseButton == 0:
app.showLegals = not app.showLegals
elif mouseButton == 1:
app.legalsAuto = not app.legalsAuto
elif mouseButton == 2 and (app.filter == 'medium' or app.filter == 'hard') and not app.competition: #find next singleton:
selectedCell = findSingleton(app)
if selectedCell == None: #placeholder
app.selection = None
else:
row, col, num = selectedCell
if app.undoRedo: #move right after doing an undo/redo
if app.statePoint != -1: #if at end of list [:0] gives empty list
app.movesLst = app.movesLst[:app.statePoint+1]
app.undoRedo = False
app.statePoint = -1
app.state = copy.deepcopy(app.movesLst[app.statePoint][0])
app.state.set(row, col, num)
app.selection = (row, col)
#update moves lst when place singleton
app.movesLst.append((copy.deepcopy(app.state), app.selection))
elif mouseButton == 3 and (app.filter == 'manual'):
app.manualBoard = False
app.solution = solveSudoku(app.state)
if app.solution == None:
app.gameOver = True
return
#check undo redo
if clickUndo(app, mouseX, mouseY):
if app.statePoint > -len(app.movesLst):
app.statePoint -= 1
app.state = app.movesLst[app.statePoint][0]
app.undoRedo = True
app.selection = app.movesLst[app.statePoint][1]
elif clickRedo(app, mouseX, mouseY):
if app.statePoint < -1:
app.statePoint += 1
app.state = app.movesLst[app.statePoint][0]
app.undoRedo = True
app.selection = app.movesLst[app.statePoint][1]
#check whether asked for a hint
hintButton = clickHints(app, mouseX, mouseY)
if hintButton!= None: #user clicked in a hint button
if hintButton == 0: #hint1 - highlight cells
hint = app.state.getHint1()
if hint!=None:
app.selection = hint
elif hintButton == 1: #hint 2 - highlight cells
cells = app.state.getHint2()
if cells != None:
app.hint2 = True
app.hint2Draw = cells
return
elif hintButton == 2: #hint 1 - make move
hint = app.state.getHint1()
if hint!=None:
row, col = hint
app.selection = row, col
app.newState = copy.deepcopy(app.state)
app.newState.set(row, col, app.solution[row][col])
if app.undoRedo: #if play hint after doing an undo-redo
if app.statePoint != -1:
app.movesLst = app.movesLst[:app.statePoint + 1] #splice extra moves
app.undoRedo = False
app.statePoint = -1
app.state = app.newState
app.movesLst.append((copy.deepcopy(app.state), app.selection))
elif hintButton == 3: #hint 2 - ban values
cells = app.state.getHint2()
if cells != None:
app.hint2 = True
app.hint2Draw = cells
app.newState = copy.deepcopy(app.state)
vals = []
for r,c in cells:
vals.append(app.solution[r][c])
app.newState.getBansForAllRegions(vals, cells) #ban legals
if app.undoRedo: #move right after doing an undo/redo
if app.statePoint != -1: #if at end of list [:0] gives empty list
app.movesLst = app.movesLst[:app.statePoint+1]
app.undoRedo = False
app.statePoint = -1
app.state = app.newState
app.movesLst.append((copy.deepcopy(app.state), app.selection))
return
app.numZeroes = zeroCount(app.state.board)
if app.numZeroes == 0:
#save as pdf
app.gameOver = True
app.image2 = drawing(app, 2)
app.image2 = CMUImage(app.image2)
app.hint2 = False
clickInSideButtons(app, mouseX, mouseY) #check if click in side buttons
if clickCompetition(app, mouseX, mouseY):
app.competition = not app.competition
if app.filter == 'manual':
if clickInLoad(app, mouseX, mouseY): #lead manually made txt board
app.state = State(loadBoard([app.filter]))
app.originalBoard = copy.deepcopy(app.state.board)
app.solution = solveSudoku(app.state)
app.manualBoard = False