Schachfeld im Koordinatensystem

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Toad
User
Beiträge: 13
Registriert: Montag 18. April 2011, 07:50

Ich programmiere grad ein Schachfeld und will auf ein Bild von 160x160 pixeln 64 Felder sind.
Um dies nun anzupassen habe ich das durch 20 geteilt um die grösseren Felder hinzubekommen
Mit meiner Färbefunktion:

Code: Alles auswählen

def decide_color_chess(x, y, size):
        

        if (ceil(x/20)%2!=0) or (ceil(y/20)%2!=0):
                return "black"
        elif (ceil(x/20)%2 == 0) or (ceil(y/20)%2 == 0):
                return "white"
Hierbei wird der Funktion die Koordinate und die Größe von 160 übergeben.
Bei mir sieht das Bild allerdings so aus:

http://www.abload.de/image.php?img=chess179ge.jpg

Aussehen sollte es aber so:

http://www.abload.de/img/chess2sqic.jpg

Ich habe selbst die Koordinaten in den schwarzen Feldern die weiß sein sollten auf Papier gegengerechnet und finde die Fehler nicht.

Ich möchte mich entschuldigen, das ich nachfragen muss, aber ich komme nichtmehr weiter und würde mich über einen kleinen Hinweis freuen :(

P.S. Die Bilder ließen sich irgendwie nicht einbinden :(
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Deine Bedingungen sind nicht richtig.

Code: Alles auswählen

>>> for i in range(8):
...     for j in range(8):
...         print int(i%2 == j%2),
...     print
... 
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1
Sebastian
Das Leben ist wie ein Tennisball.
BlackJack

@Toad: Du willst kein Schachbrett auf 160×160 Pixel malen sondern auf `size`×`size` Pixel. Die hart kodierte 20 ist also nur solange richtig, wie `size` auch wirklich 160 ist. Davon darfst Du aber nicht ausgehen. Wenn ein Tutor diese Zahl (wenn auch nur in Gednaken) ändert und Deine Funktion dann kein ordentliches Schachbrett produziert gibt es Punktabzug.

Beschreibe doch mal in Worten die Bedingung wann ein Feld schwarz und wann es weiss gezeichnet werden muss. Am besten unter Verwendung der Nummer der Reihe und Spalte der Schachfelder, wie ich das im Forum zur Vorlesung schon vorgeschlagen hatte.

Edit: Verdammt, da hat nun jemand eine Hausaufgabe für Dich gelöst… :-)
Toad
User
Beiträge: 13
Registriert: Montag 18. April 2011, 07:50

@Blackjack das habe ich ja getan deswegen mein modulo ich nahm allerdings an, dass ich das ganze kleiner projezieren müsste.

Im übrigen hatte ich noch die Idee das ganze mit einem zweidimensionalen Array zu realisieren, und quasi den minpunkt und den maxpunkt darein zu schreiben, wobei das ganze auch sehr stark an die 160 gebunden ist.


Was mich etwas stört ich versteh nicht ganz was dabei passiert, also warum das so ist. Das ist ja mein Problem, also warum wenn beide Modulo Werte gleich sind, das ganze dann anders ist. Das bekomme ich doch auch für mehrere Koordinaten, wenn ich sage das sie schwarz sein sollen. Also zB: (20,20) und (20,19).

Dazu muss ich sagen, das ich das Feld das jeder pixel einzeln immer wieder wechselt, also ich habe 80 weiße 80 schwarze schon hatte, ich versteh nur nicht inwiefern die for Schleife das ganze verändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Darf man mal nachfragen, was Du diesbezüglich hinbekommen hast? Es war ja noch nicht wirklich klar, was Du da exakt haben möchtest...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Toad: Was hast Du getan? In Worten beschrieben wann ein Feld weiss oder schwarz ist jedenfalls nicht. Mach das doch mal.

Vergiss das mit dem "Array" und die fixe 160. Du willst nicht für jeden Aufruf eine komplexe Datenstruktur aufbauen. Und `size` soll wie schon gesagt als variabel angenommen werden -- oder "beliebig aber fest" wie die Mathematiker immer so schön sagen.

Den Rest von Deinem Beitrag verstehe ich nicht. Der ist mir viel zu zusammenhanglos.
Benutzeravatar
snafu
User
Beiträge: 6745
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mach dir doch mal schrittweise klar, was bei dem "Modulo-Trick" passiert: Am Anfang haben ``i`` und ``j`` den Wert 0. Der Vergleich gibt also ein ``True`` zurück. Danach wechselt das Ergebnis von ``j % 2`` jeweils zwischen 0 und 1, weil bei Anwendung von natürlichen Zahlen ja nichts anderes als das herauskommen kann. Sobald die innere Schleife abgearbeitet wurde (also nach 8 Durchläufen in dem Beispiel), rutscht der Wert für ``i`` entsprechend um eins höher. Die Vergleiche erzeugen dann jeweils das gegenteilige Ergebnis. Zuletzt sorgt natürlich noch die Umwandlung mittels ``int()`` dafür, dass nicht ``True`` und ``False`` ausgegeben wird, sondern 1 und 0.

Achso, und das Komma ist eine spezielle Syntax für das ``print``-Statement. Es sorgt dafür, dass am Ende kein Newline- sondern ein Leerzeichen erzeugt wird. Das andere ``print`` wiederum ist für die äußere Schleife gedacht, damit halt eine neue Zeile begonnen wird.
Toad
User
Beiträge: 13
Registriert: Montag 18. April 2011, 07:50

@blackjack

EIn Feld wird schwarz wenn eine Koordinate mod2 == 0 und weiß wenn eine Koordinate mod2 != 0
so ist der Stand für die einzelnen Koordinaten, nun liegen aber in einem "Feld" mehrere Koordinaten bei denen beides wahr wird und genau da setzt mein Problem an
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Deine Bedingung ist immer noch zu einfach. Zeichne dir mal ein Schachbrett auf Papier auf, markiere die Zellen mit weiß und rot und schreibe in jede Zelle die Ergebnisse von i%2 und j%2. Dann schaust du dir an, wie Farbe und Ergebnisse zusammenpassen. Wenn du das Muster gefunden hast, dann musst du nur noch verstehen, warum dieses Muster entsteht.
Das Leben ist wie ein Tennisball.
BlackJack

@Toad: Was bedeutet denn `Koordinate mod2 == 0` in natürlicher Sprache? Welche Eigenschaften haben Zahlen, die diese Bedingung erfüllen?

Beim Ansatz von EyDu sind `i` und `j` nicht die Koordinaten der Pixel, sondern die Nummer der Reihe und Spalte von einem Schachfeld. Den Schritt von x, y nach i, j kannst Du aber schon -- es sei denn Du hast in Deinem eigenen Lösungsversuch etwas stehen was Du selbst nicht verstehst.
Toad
User
Beiträge: 13
Registriert: Montag 18. April 2011, 07:50

naja mod2 == 0 bedeutet gerade Zahl.

Bei meinem Lösungsversuch wird es ja dadurch gemacht, das ich quasi das ganze auf eine kleinere Ebene projeziere, sodass der Punkt (20,20) zu (1,1) wird.

Mir ist bewusst das 1 Feld aus 20,20 Punkten besteht und alle x,y die <= 20 sind.
Ansonsten ist das genau mein Kernpunkt der mir fehlt, da ich ja die Funktion immer einzeln mit den Koordinaten aufrufe, und mir eben die Idee fehlt wie ich sagen kann, dass ein Punkt in dem Feld liegt.
BlackJack

@Toad: Genau, Du bildest die Koordinate x, y auf die Zeilen- und Spaltennummer des Schachfeldes ab in dem dieser Punkt x, y liegt. Und jetzt ist mir nicht so ganz klar was Du da noch prüfen willst ob der Punkt in dem Feld liegt. Der liegt da drin -- das hast Du doch berechnet in welchem Feld er liegt. Und dann musst Du anhand dieser Feldkoordinaten nur noch entscheiden welche Farbe der Punkt haben soll. Wie das geht wurde schon gezeigt. Warum das so funktioniert kannst Du Dir an einer Zeichnung verdeutlichen -- wie das ja auch schon vorgeschlagen wurde.

Dann musst Du das alles nur noch zusammen setzen und die 20 durch einen Audruck ersetzen der von `size` abhängt, und die Aufgabe ist fertig.
Antworten