Skip to content

Instantly share code, notes, and snippets.

@horstjens
Last active March 12, 2023 06:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save horstjens/f2089f86662afc1c527c93607f3caddb to your computer and use it in GitHub Desktop.
Save horstjens/f2089f86662afc1c527c93607f3caddb to your computer and use it in GitHub Desktop.
import PySimpleGUI as sg
import random
#sg.theme("Material1")
#sg.theme_element_background_color(color = "#000000")
#sg.theme_background_color(color="#FFFFFF")
#sg.theme_button_color(color="#FFFFFF")
class Game:
visited = set()
revealed = set()
bomb_chance = 0.11
cols = 10
rows = 10
colors = {"0":"#64778D", # grey
"1":"#00ff75", # light green
"2":"#00dd00", # green
"3":"#ffff00", # yellow
"4":"#ffa500", # orange
"5":"#ff00ff", # red
"6":"#800080", # violet
"7":"#0000ff", # blue
"8":"#00ffff", # cyan
"*":"#ffffff", # black
}
def unhide_zeros(event):
Game.revealed.add(event)
number = window[event].get_text()
window[event].update(button_color=("#000000", Game.colors[number]))
if number == "0":
if event not in Game.visited:
#Game.hidden_tiles -= 1
Game.visited.add(event)
#window[event].update(button_color=(Game.colors[number], Game.colors[number]))
y,x = event.split("_")
x = int(x)
y = int(y)
for dx,dy in ((0, 1),(-1, 1),(-1,0),(-1,-1),
(0,-1),( 1,-1),( 1,0),( 1, 1)):
if 0 <= y +dy < Game.rows:
if 0 <= x +dx < Game.cols:
new = f"{y+dy}_{x+dx}"
unhide_zeros(new)
print("please wait some seconds, i create the GUI...")
layout = [[sg.Button(" ", key=f"{y}_{x}",
size=(1,1),
font=("Mono",15)) for x in range(Game.cols)] for y in range(Game.rows)]
layout.append([sg.Text("Status:", key="status")])
window = sg.Window("minesweeper", layout, return_keyboard_events=True)
window.finalize()
print("laying bombs...")
# ----- bomben legen ---
total_bombs = 0
for y in range(Game.rows):
for x in range(Game.cols):
if random.random() < Game.bomb_chance:
window[f"{y}_{x}"].update(text="*")
total_bombs += 1
window[f"{y}_{x}"].update(button_color=("#ffffff", "#ffffff"))
print("calculating neighbors...")
# ---- nachbarn feststellen ---
for y in range(Game.rows):
for x in range(Game.cols):
if window[f"{y}_{x}"].get_text() != " ":
continue
# nachbarn
bombs = 0
for dx,dy in ((0,1),(-1,1),(-1,0),(-1,-1),(0,-1),(1,-1),(1,0),(1,1)):
text = None
if 0 <= y +dy < Game.rows:
if 0 <= x +dx < Game.cols:
text = window[f"{y+dy}_{x+dx}"].get_text()
if text == "*":
bombs += 1 #bombs = bombs + 1
window[f"{y}_{x}"].update(text=f"{bombs}")
# right-click
for y in range(Game.rows):
for x in range(Game.cols):
window[f"{y}_{x}"].bind("<Button-3>", "r")
print("find", total_bombs, "bombs")
marked_bombs = 0
cells = Game.cols * Game.rows
window["status"].update(f"bombs: {total_bombs}, hidden: {cells - len(Game.revealed)}")
while True:
event, values = window.read()
print(event, values)
if ":65" in event:
window.set_title("Hallo")
if event in [sg.WIN_CLOSED, "exit" ]:
break
if "_" in event:
if event.endswith("r"):
key = event[:-1]
window[key].update(button_color=("#ff0000","#ff0000"))
else:
Game.revealed.add(event)
number = window[event].get_text()
window[event].update(button_color=("#000000", Game.colors[number]))
if number == "*":
sg.PopupOK("Game Over")
break
if number == "0":
Game.visited = set()
unhide_zeros(event)
hidden = cells - len(Game.revealed)
window["status"].update(f"bombs: {total_bombs}, hidden: {hidden}")
if hidden == total_bombs:
sg.PopupOK("You win!")
break
#else:
# Game.hidden_tiles -= 1
window.close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment