forked from Gravitar64/A-beautiful-code-in-Python
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Teil_10_Minesweeper.py
124 lines (101 loc) · 3.3 KB
/
Teil_10_Minesweeper.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
import pygame as pg
from dataclasses import dataclass
import random as rnd
auflösung = 1000
raster = 20
anzMinen = 50
abstand = auflösung // raster
pg.init()
screen = pg.display.set_mode([auflösung, auflösung])
def ladeBild(dateiname):
return pg.transform.scale(pg.image.load(dateiname), (abstand, abstand))
def gültig(y, x):
return y > -1 and y < raster and x > -1 and x < raster
bild_normal = ladeBild('Teil_10_ms_cell_normal.gif')
bild_markiert = ladeBild('Teil_10_ms_cell_marked.gif')
bild_mine = ladeBild('Teil_10_ms_cell_mine.gif')
bild_aufgedeckt = []
for n in range(9):
bild_aufgedeckt.append(ladeBild(f'Teil_10_ms_cell_{n}.gif'))
matrix = []
benachbarteFelder = [(-1, -1), (-1, 0), (-1, 1), (0, -1),
(0, 1), (1, -1), (1, 0), (1, 1)]
@dataclass
class Cell():
zeile: int
spalte: int
mine: bool = False
aufgedeckt: bool = False
markiert: bool = False
anzMinenDrumrum = int = 0
def show(self):
pos = (self.spalte*abstand, self.zeile*abstand)
if self.aufgedeckt:
if self.mine:
screen.blit(bild_mine, pos)
else:
screen.blit(bild_aufgedeckt[self.anzMinenDrumrum], pos)
else:
if self.markiert:
screen.blit(bild_markiert, pos)
else:
screen.blit(bild_normal, pos)
def anzMinenErmitteln(self):
for pos in benachbarteFelder:
neueZeile, neueSpalte = self.zeile + pos[0], self.spalte + pos[1]
if gültig(neueZeile, neueSpalte) and matrix[neueZeile*raster+neueSpalte].mine:
self.anzMinenDrumrum += 1
def floodFill(zeile, spalte):
for pos in benachbarteFelder:
neueZeile = zeile + pos[0]
neueSpalte = spalte + pos[1]
if gültig(neueZeile, neueSpalte):
cell = matrix[neueZeile*raster+neueSpalte]
if cell.anzMinenDrumrum == 0 and not cell.aufgedeckt:
cell.aufgedeckt = True
floodFill(neueZeile, neueSpalte)
else:
cell.aufgedeckt = True
#Die Objekte werden je Feld angelegt und in der Matrix gespeichert
for n in range(raster*raster):
matrix.append(Cell(n // raster, n % raster))
#Die Minen werden zufällig verteilt
while anzMinen > 0:
cell = matrix[rnd.randrange(raster*raster)]
if not cell.mine:
cell.mine = True
anzMinen -= 1
#Die Anzahl der Minen in den benachbarten Feldern werden je Feld ermittelt
for objekt in matrix:
if not objekt.mine:
objekt.anzMinenErmitteln()
#Hauptschleife zum Bildschirmzeichnen und zur Auswertung der Ereignisse
clock = pg.time.Clock()
weitermachen = True
while weitermachen:
#Frames per second setzen
clock.tick(20)
#Events auswerten
for event in pg.event.get():
#wenn Fenster geschlossen wird
if event.type == pg.QUIT:
weitermachen = False
#wenn Maustaste gedrückt wurde
if event.type == pg.MOUSEBUTTONDOWN:
mouseX, mouseY = pg.mouse.get_pos()
cell = matrix[mouseY // abstand * raster + mouseX // abstand]
#rechte Maustaste
if pg.mouse.get_pressed()[2]:
cell.markiert = not cell.markiert
#linke Maustaste
if pg.mouse.get_pressed()[0]:
cell.aufgedeckt = True
if cell.anzMinenDrumrum == 0 and not cell.mine:
floodFill(mouseY // abstand, mouseX // abstand)
if cell.mine:
for objekt in matrix:
objekt.aufgedeckt = True
for objekt in matrix:
objekt.show()
pg.display.flip()
pg.quit()