Last active
March 12, 2023 06:58
-
-
Save horstjens/f2089f86662afc1c527c93607f3caddb to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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