Make play_pressed function more readable

This commit is contained in:
filifa 2024-03-19 20:38:20 -05:00
parent 0177f0ccbe
commit 2f39ee536b
1 changed files with 38 additions and 28 deletions

66
main.py
View File

@ -48,6 +48,42 @@ def play_game(rows, cols, mines):
elif event.type == MOUSEBUTTONUP and event.button == 3: elif event.type == MOUSEBUTTONUP and event.button == 3:
board.right_click(event.pos) board.right_click(event.pos)
def inputs_are_valid(rows, cols, mines):
if not (5 <= rows <= 99) or not (5 <= cols <= 99):
messagebox.showerror("Input Error",
"Rows and columns must be between 5 and 99")
return False
if not (1 <= mines):
messagebox.showerror("Input Error", "There must be at least one mine")
return False
# 9 is subtracted because the player's first click will clear a minimum of
# 9 spaces if not clicked on the board edge
max_mines = rows * cols - 9
if mines > max_mines:
messagebox.showerror("Input Error",
"Board is too small for this many mines!")
return False
return True
def ask_to_play_again():
play_again_box = tkinter.Tk()
question = tkinter.Label(play_again_box, text="Play again?")
question.pack(side=tkinter.TOP)
# Yes will destroy this Tk box and consequently reoption the option_box
yes = tkinter.Button(play_again_box, text="Yes",
command=play_again_box.destroy)
yes.pack(side=tkinter.LEFT)
# No will end the program
no = tkinter.Button(play_again_box, text="No", command=sys.exit)
no.pack(side=tkinter.RIGHT)
play_again_box.mainloop()
def play_pressed(option_box): def play_pressed(option_box):
try: try:
rows = int(option_box.children['!frame'].children['!spinbox'].get()) rows = int(option_box.children['!frame'].children['!spinbox'].get())
@ -57,39 +93,13 @@ def play_pressed(option_box):
messagebox.showerror("Input Error", "Please enter whole numbers!") messagebox.showerror("Input Error", "Please enter whole numbers!")
return return
if not (5 <= rows <= 99) or not (5 <= cols <= 99): if not inputs_are_valid(rows, cols, mines):
messagebox.showerror("Input Error",
"Rows and columns must be between 5 and 99")
return
if not (1 <= mines):
messagebox.showerror("Input Error", "There must be at least one mine")
return
# 9 is subtracted because the player's first click will clear a minimum of
# 9 spaces if not clicked on the board edge
max_mines = rows * cols - 9
if mines > max_mines:
messagebox.showerror("Input Error",
"Board is too small for this many mines!")
return return
option_box.destroy() option_box.destroy()
play_game(rows, cols, mines) play_game(rows, cols, mines)
# These lines will not execute until the game is over ask_to_play_again()
play_again_box = tkinter.Tk()
question = tkinter.Label(play_again_box, text="Play again?")
question.pack(side=tkinter.TOP)
yes = tkinter.Button(play_again_box, text="Yes",
command=play_again_box.destroy)
yes.pack(side=tkinter.LEFT)
no = tkinter.Button(play_again_box, text="No", command=sys.exit)
no.pack(side=tkinter.RIGHT)
play_again_box.mainloop()
def main(): def main():
while True: while True: