forked from SimonIT/Magisches-Quadrat
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmagi.py
213 lines (194 loc) · 12.2 KB
/
magi.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
import webbrowser
import os
'''
/********************************************************************************
* Name: Simon Bullik Klasse: DQI16 *
* Prog.Name: Bullik_magiQuad Magische Quadrate erstellen *
* Version: 1.0 Datum: 24.09.2017 *
* Progsprache: Python3 OS: Microsoft Windows 10 *
* *******************************************************************************/
'''
def create_magi_1(dimension=3, multiplicator=1):
x = int(dimension / 2) # Startwert X in der Mitte des Quadrats
y = 0 # Startwret Y oben
val = 1 # Startwert ist eins
magi = {(x, y): val * multiplicator} # Eintragen des Wertes in das Dictionary
val += 1 # Erhöhe den Wert um 1
while val <= dimension ** 2: # Wiederhohle bis der Wer größer als dimension^2 ist
y_new = y - 1 # Gehe einen nach oben
x_new = x + 1 # Gehe einen nach rechts
if y_new < 0: # Wenn die neue Position nach oben nicht im Feld ist
y_new = dimension - 1 # Setze die Y Koordinate nach ganz unten
elif y_new > dimension - 1: # Wenn die neue Position nach unten nicht im Feld ist
y_new = 0 # Setze Y Koordinate nach ganz oben
if x_new < 0: # Wenn die neue Position nach links nicht im Feld ist
x_new = dimension - 1 # Setze die neue x Koordinate nach ganz rechts
elif x_new > dimension - 1: # Wenn die neue Position rechts nicht im Feld ist
x_new = 0 # Setze die neue x Koordinate nach anz links
if (x_new, y_new) in magi: # Wenn es die neuen Koordinaten schon im Dictionary sind
if y + 1 > dimension - 1: # Wenn Das Feld unter dem alten Feld außerhalb des Quadrats ist
y_new = 0 # Setze die Y Koordinaten nach ganz oben
else:
y_new = y + 1 # Sonst Setze die y Koordinate auf das Feld unter dem alten Feld
x_new = x # Die x Koordinate bleibt gelich zum alten Feld
x = x_new
y = y_new
magi[(x, y)] = val * multiplicator # Eintragen des Werts in das Dictionary
val += 1 # Erhöhen des Werts
return magi
def create_magi_2(dimension=3, multiplicator=1):
x = int(dimension / 2) # Startwert X in der Mitte des Quadrats
y = int(dimension / 2) + 1 # Startwert Y Feld ein Feld unter der Mitte
val = 1 # Startwert ist eins
magi = {(x, y): val * multiplicator} # Eintragen des Wertes in das Dictionary
val += 1 # Erhöhe den Wert um 1
while val <= dimension ** 2: # Wiederhohle bis der Wer größer als dimension^2 ist
y_new = y + 1 # Gehe einen nach unten
x_new = x + 1 # Gehe einen nach rechts
if y_new < 0: # Wenn die neue Position nach oben nicht im Feld ist
y_new = dimension - 1 # Setze die Y Koordinate nach ganz unten
elif y_new > dimension - 1: # Wenn die neue Position nach unten nicht im Feld ist
y_new = 0 # Setze Y Koordinate nach ganz oben
if x_new < 0: # Wenn die neue Position nach links nicht im Feld ist
x_new = dimension - 1 # Setze die neue x Koordinate nach ganz rechts
elif x_new > dimension - 1: # Wenn die neue Position rechts nicht im Feld ist
x_new = 0 # Setze die neue x Koordinate nach anz links
if (x_new, y_new) in magi: # Wenn es die neuen Koordinaten schon im Dictionary sind
if y + 2 > dimension - 1: # Wenn das Feld um mind. ein Feld nicht im Feld sind
if y + 2 > dimension: # Wenn das Felder um mind. zwei Feld nicht im Feld sind
y_new = 1 # Setzte die Y Koordinate auf eins
else:
y_new = 0 # Sonst setzt die y Kooridnate auf null
else:
y_new = y + 2 # Setze die Y Koordinate um zwei nach unten
x_new = x # Setze die X Koordinate auf die alten
x = x_new
y = y_new
magi[(x, y)] = val * multiplicator # Eintragen des Werts in das Dictionary
val += 1 # Erhöhen des Werts
return magi
def show_magi(magi):
clear()
width = 0 # Setze die breite auf null
if "PYCHARM_HOSTED" not in os.environ: # Wenn das Programm nicht in PyCharm läuft
width = os.get_terminal_size().columns # Setze die breite auf die Terminalbreite
vertical = [] # Initilisierung der Liste für die vetikale Summen
sum = "|" # Startwert für die Summenzeile
diag = 0 # Initialisierung diagonale Summe
for i in range(0, dimension): # Für jede Zeile
row = "|" # Anfangszeichen einer Zeile ist |
horizontal = 0 # Initialisiere die horizontale Summe auf null
vertical.append(0) # Füge für jede Spaltensumme den Startwert null ein
for j in range(0, dimension): # Für jede Spalte
row += " " + str(magi.get((j, i))).ljust(len(str((
dimension ** 3 + dimension) / 2))) + "|" # Füge der Zeile den Wert an, auf die Breite der Summen angepasst
horizontal += magi.get((j, i)) # Addiere den Wert zu der Zeilensumme
vertical[i] += magi.get((j, i)) # Addiere den Wert zur Spaltensumme
row += "| " + str(horizontal).ljust(len(str((dimension ** 3 + dimension) / 2))) # Füge der Zeile die Summe an
sum += " " + str(vertical[i]).ljust(
len(str((dimension ** 3 + dimension) / 2))) + "|" # Füge die Spaltensumme zusammen
diag += magi.get((i, i)) # Addiere die Diagonalsumme
print(row.center(width)) # Gebe die Spalte aus
sum += "| " + str(diag).ljust(
len(str((dimension ** 3 + dimension) / 2))) # Füge zur Ausgabe die Diagonalsumme hinzu
separate = "" # Initialisierung der Trennungslinie
for i in range(0, len(row)):
separate += "-" # Füge nach der Länge der Zeilen Bindestriche an
print(separate.center(width)) # Gebe die die Trennlinie aus
print(sum.center(width)) # Gebe die vertikalen Summen aus
print() # Mache einen Absatz
def save_HTML(magi):
# Füge das Grundgerüst der HTML Datei an
html = "<!DOCTYPE html>\n" \
"<html>\n" \
"<head>\n" \
"<meta charset=\"UTF-8\">\n" \
"<meta name=\"author\" content=\"Simon Bullik\">\n" \
"<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n" \
"<title>Magisches Quadrat</title>\n" \
"<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\">\n" \
"<script src=\"script.js\"></script>\n" \
"</head>\n" \
"<body>\n" \
"<h1>Magisches Quadrat</h1>\n" \
"<p>Dimension: " + str(dimension) + "</p>\n" \
"<label for=\"turns\">Drehungen</label><input id=\"turns\" type=\"range\" step=\"90\" min=\"0\" max=\"360\" value=\"0\" onchange=\"rotate()\"><br>\n" \
"<button type=\"button\" onclick=\"toggle()\" id=\"control\">Zeige Kontrolle</button>\n" \
"<table id=\"magi\">\n"
vertical = [] # Initialisierung der Liste für die vertikale Summen
diag = 0 # Startwert für die diagonlae Summe
for i in range(0, dimension): # Für jede Zeile
vertical.append(0) # Füge den Startwert für die vertikale Summe hinzu
html += "<tr>\n" # Füge der HTML Sruktur den Start einer neuen Zeile an
sum = 0 # Startwert der Zeilensumme
for j in range(0, dimension): # Für jede Spalte
sum += magi.get((j, i)) # Addiere den Wert zur Zeilensumme
html += "<td>" + str(magi.get((j, i))) + "</td>\n" # Füge den Wert als HTML Tabellen Celle hinzu
vertical[i] += magi.get((j, i)) # Addiere den Wert zur vertikalen Summe
diag += magi.get((i, i)) # Addiere den Wert zur digonalen Summe
html += "<td class=\"sum\">" + str(sum) + "</td>\n" # Füge die Zeilensumme als HTML Tabbeln Zelle hinzu
html += "</tr>\n" # Schließe die Zeile in HTML
html += "<tr>\n" # Fange neue Zeile in HTML an
for i in vertical:
html += "<td class=\"sum\">" + str(i) + "</td>\n" # Füge jede vertikale Summe zu HTML hinzu
html += "<td class=\"sum\">" + str(diag) + "</td>\n" \
"</tr>" \
"</table>\n" \
"</body>\n" \
"</html>" # Füge die Diagonale Summe an und schließe das Dokument
with open('magi.html', 'w', encoding='utf-8') as htmlFile: # öffne die HTML Datei zum Schreiben
htmlFile.write(html) # Schreibe das HTML
path = os.path.abspath("magi.html") # Bekomme den absoluten Pfad zur HTML Datei
webbrowser.open_new_tab("file://" + path) # Öffne die HTML Datei als neuer Tab im Webbrowser
def rotate(magi, turns=0):
for i in range(turns): # Für dir Anzahl der Drehungen
magi_old = magi # Mach ein Backup des aktuellen Quadrats
magi = {} # lösche das Quadrat
for i in range(0, dimension): # für jede Zeile
for j in range(0, dimension): # für jede Spalte
magi[(i, j)] = magi_old.get(
(dimension - 1 - j, i)) # Füge den Wert von seinem "alten" Platz auf seinen neuen ein
return magi
def clear():
# Vorherige Bildschirmausgaben löschen
if "nt" in os.name:
os.system("cls") # Auf Windows mit cls
else:
os.system("clear") # Auf den meisten Linux / Apple Systemen mit clear
if __name__ == "__main__":
dimension = 3 # Standarddimension
multiplicator = 1 # Standardmultiplikator
turns = 0 # Standardanzahl der Drehungen
while True: # wiederhohle unendlich
print(
"(N) Eingabe der Dimension (3-11 / Default: 3)\n"
"(K) Eingabe des Multiplikators (Default: 1)\n"
"(T) Eingabe der Anzahl der Drehungen (Default: 0)\n"
"(1) Darstellen des magischen Quadrats nach Algorithmus 1\n"
"(2) Darstellen des magischen Quadrats nach Algorithmus 2\n"
"(3) Speichern als „magi.html“ nach Algorithums 1\n"
"(4) Speichern als „magi.html“ nach Algorithums 2\n"
"(X) Exit") # Gebe das Menü aus
choice = input() # Erwarte die Eingabe was geamcht werden soll
if choice.lower() == "n": # wenn n eingegeben wurde
dimension_input = int(input("Dimension: ")) # Abfrage der Dimension
if dimension_input % 2 == 1 and dimension_input > 2: # Wenn die Zahl ungerade und größer als zwei ist
dimension = dimension_input # Setze die Dimension auf die eingegebene Dimension
elif choice.lower() == "k": # Wenn k eingegeben wurde
multiplicator = float(input("Multiplikator: ")) # setze den Multiplikator auf die Eingabe
elif choice.lower() == "t": # Wenn t eingegeben wurde
turns = int(input("Drehungen: ")) # Setze die Anzahl der Drehungen auf die Eingabe
elif choice == "1": # Wenn 1 eingegeben wurde
show_magi(rotate(create_magi_1(dimension, multiplicator),
turns)) # zeige das magische Qudrat nach Algorythmus 1 mit den entsprechenden Drehunge und dem Multiplikator an
elif choice == "2": # Wenn 2 eingegeben wurde
show_magi(rotate(create_magi_2(dimension, multiplicator),
turns)) # zeige das magische Qudrat nach Algorythmus 2 mit den entsprechenden Drehunge und dem Multiplikator an
elif choice == "3": # Wenn 3 eingegeben wurde
save_HTML(rotate(create_magi_1(dimension, multiplicator),
turns)) # speichere das magische Qudrat nach Algorythmus 1 mit den entsprechenden Drehunge und dem Multiplikator als HTML Datei
elif choice == "4": # Wenn 4 eingegeben wurde
save_HTML(rotate(create_magi_2(dimension, multiplicator),
turns)) # speichere das magische Qudrat nach Algorythmus 2 mit den entsprechenden Drehunge und dem Multiplikator als HTML Datei
elif choice.lower() == "x": # Wenn x eingegeben wurde
exit() # Schließe das Programm