BPS #17: Schachbrett - Auswertung
Übersicht

![]() |
XeresModeratorBetreff: BPS #17: Schachbrett - Auswertung |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ihr könnt mir übrigens danken, in dem ihr mir für das erste Schachfeld 1 Cent, für das zweite 2 Cent, für das dritte 4 Cent usw. schickt. Danke!
Und nun weiter im Programm: Das war die Aufgabe Postet hier eure Ergebnisse, Codes, Gedanken. Lernt von den anderen, seht euch deren Quelltext an und versucht euren eigenen zu verbessern. Diskussion Postet zu euren Codes stets eine kurze Erklärung mit euren Gedanken in denen ihr simpel gesagt die Frage "Wieso habe ich XY auf diese Art gelöst?" beantwortet. Beiträge, die nur den Code enthalten werden wir aus dem Thread entfernen. Nächste Aufgabe In einer Woche wird die Musterlösung nach editiert und in 2 die nächste Aufgabe eingestellt. Viel Spaß & viel Erfolg! Musterlösung: Teil 1 BlitzBasic: [AUSKLAPPEN] ;Teilaufgabe 1 Teil 2 BlitzBasic: [AUSKLAPPEN] ;Teilaufgabe 2 |
||
- Zuletzt bearbeitet von Xeres am Mo, März 12, 2012 18:00, insgesamt 2-mal bearbeitet
PacManiBetreff: Re: BPS #17: Schachbrett - Auswertung |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Xeres hat Folgendes geschrieben: Ihr könnt mir übrigens danken, in dem ihr mir für das erste Schachfeld 1 Cent, für das zweite 2 Cent, für das dritte 4 Cent usw. schickt. Danke!
So viel Geld habe ich nicht, wie am Ende rauskommt ![]() |
||
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich wollte eine Funktion welche mir möglichst variabel ein Schachbrett zeichnen kann, anhand von Konstanten.
Zudem eine weitere Funktion welche die Infos einzeichnet. Bei fragen, fragen! ![]() Code: [AUSKLAPPEN] ;ozzi789 - 6.2.12 - BPS # 17 Schachbret
;---------------------------------------- ;Die folgenden 3 Variabeln sind da um rumzutesten! ;Aufgabenstellung 1: ;field_w=4 & show_info=0 (field_size ist variabel) ;Aufgabenstellung 2: ;field_w=8 & show_info=1 (field_size ist variabel) Const field_w=8 Const field_size=20 Const show_info=1 ;----------------------------------------- ;Den Offset benötigen wir um einen Puffer nach aussen zu haben (blauer Rand) Const offset=50 ;Wir wollen das Feld quadratisch Const field_h=field_w ;Benötigen wir für den Timer Global timer ;Wir rufen die Funktion 'setup' auf welche alles vorbereitet, siehe unten setup() ;Unser Mainloop While Not KeyHit(1) Cls WaitTimer timer ;Das Schachbrett malen render_field() ;Falls oben in den Konstanten show_info auf 1 gesetzt wurde die Infos malen (1.2.3 / a.b.c. usw) If show_info Then render_info() Flip 0 Wend End ;Das Schachbrett einzeichnen Function render_field() Local abs_xy ;Alle Felder durchgehen, das -1 ist da wir von 0 anfangen For x=0 To field_w-1 For y=0 To field_h-1 ;Die x und y Koordinate zusammenzählen abs_xy=x+y ;Falls die zusammengezählten Koordinaten gerade sind If number_even(abs_xy) ;Graue Farbe setzen Color 200,200,200 Else ;Falls ungerade schwarze Farbe setzen Color 0,0,0 EndIf ;Per Rect das Quadrat, also das Feld selber zeichnen Rect (x*field_size)+offset,(y*field_size)+offset,field_size,field_size,1 Next Next End Function ;Die Infos einzeichnen Function render_info() Local temp_str$,ypos,xpos,str_h=StringHeight("1"),str_w=StringWidth("a") ;Die Anfganspostion für die Zahlen errechnen xpos=offset-(str_h*1.3) ;Den grauen Hintergrund für die Infos einzeichnen Color 100,100,100 Rect offset/2,offset,offset/2,(field_h)*field_size+(offset/2) Rect offset,offset+(field_h)*field_size,field_size*field_w,offset/2 ;Die Zahlen einzeichnen Color 255,255,255 For x=1 To field_w Text xpos,((x-1)*field_size)+offset+(field_size/2)-(str_h/2),field_w-x+1 Next ;Die Buchstaben einzeichnen ypos=offset+(field_size*field_h)+(str_h/1.3) For y=1 To field_h ;Schaut euch http://www.blitzforum.de/help/ASCII ab zum Verständniss was in temp_str$ kommt temp_str$=Chr(y+96) Text ((y-1)*field_size)+offset+(field_size/2)-(str_w/2),ypos,temp_str$ Next End Function ;Gibt eine 1 zurück falls die übergeben Zahl positiv ist Function number_even(val) val=val+1 val=val Mod 2 Return val End Function Function setup() Local font_size ;Wir erzeugen ein Graphicsfenster abhängig unserer gewählten Schachbrett grösse Graphics (field_w*field_size)+(offset*2),(field_h*field_size)+(offset*2),32,2 SetBuffer BackBuffer() AppTitle "BPS-#17-OZZI | Size: "+field_w+"x"+field_h+" @ "+field_size+"px" ClsColor 60,100,150 ;Grösse der Font berechnen If field_size/12<12 font_size=12 ;Falls die Font kleiner als 12 berechnet wird auf 12 setzen Else font_size=field_size/12 ;Sonst die berechnete verwenden EndIf ;Die Font laden & gleich setzen SetFont(LoadFont("Arial",font_size)) timer=CreateTimer(30) End Function |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab mich auch mal dran versucht um ein bisschen "Prinzipien zu üben" auch wenns in der Praxis kaum von Bedeutung ist denke ich. Weil meine Prinzipien lauten "Kein einziges IF" und "Keine Zahl außer 0 in der Funktion", bittesehr:
BlitzBasic: [AUSKLAPPEN] ;BPS #17: Schachbrett Über den Sinn der einen oder anderen Zeile kann man streiten da die "Lesbarkeit" des Codes doch ein wenig in meinen "Prinzipien" untergegangen ist ![]() ![]() mfG, Christoph. |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
PacMani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Eingeproggt hat Folgendes geschrieben: Weil meine Prinzipien lauten "Kein einziges IF" und "Keine Zahl außer 0 in der Funktion"
War das nur interessehalber, oder wo hast du so etwas aufgeschnappt? ![]() |
||
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die Anregung hab ich aus den Tipps der Aufgabenstellung:
Zitat: - [...] Vermeide zu viele Abfragen und zu viele Schleifen.
- Du wirst aber auch nicht ohne auskommen. - [...] Ideal wäre, wenn im eigentlichen Code keine Zahlen mehr vorkommen (außer der 0 für For-Schleifen). Und dann kam noch eine gehörige Portion Sturheit dazu ![]() mfG, Christoph. |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
![]() |
Mr.HydeNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hehe sehr schön, allerdings war das oberste Motto "effizientes Programmieren", wobei das nun natürlich getestet werden müsste. Ich bin mal gespannt was noch für schöne Lösungen auftauchen. | ||
BBP News RSS | Chaos Interactive | Watanien 2 Screens, Infos und Download | Watanien 2 Worklog | PuzzleMasters
http://abgeordnetenwatch.de - http://www.regierungs-beratung.de - Der Regierung auf die Finger schauen |
![]() |
darth |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
XOR ftw! BlitzBasic: [AUSKLAPPEN] Global TILESIZE_X = 32 Irgendwie gibts diesmal nicht viel zu erklären. Entweder ist x ungerade oder y, dann wirds schwarz, falls beide das gleiche sind, wirds weiss. Die Rects in der richtigen Grösse (const) und an der richtigen Position ("Tilemap") zu zeichnen ist auch nicht weiter schwer. MfG, Darth |
||
Diese Signatur ist leer. |
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Meine Lösung...
Code: [AUSKLAPPEN] Function number_even(val)
val=val+1 val=val Mod 2 Return val End Function Xor ist da natürlich schöner |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mit dem Wert herum zu rechnen um ihn wieder zurück zu geben ist unnötig. Bei negativen Zahlen bekommt man so -1 zurück. Mit Not![]() BlitzBasic: [AUSKLAPPEN] Function number_even(val) @darth: Bitte ergänze Kommentare. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
ZEVS |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da hier so viel diskutiert wird:
Das beste ist wohl bitweises Und (And ![]() BlitzBasic: [AUSKLAPPEN] Function number_even(val) Mit negativen Zahlen: BlitzBasic: [AUSKLAPPEN] Function number_even(val) ZEVS edit: (un)gerade korrigiert. Mein Englisch war noch nie... |
||
- Zuletzt bearbeitet von ZEVS am So, Feb 19, 2012 19:37, insgesamt einmal bearbeitet
BBPro2 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
hier ne absichtlich komplizierte lösung bei der ich versucht habe alle eventualitäten abzufangen
und gleichzeitig die laufzeit hoch zu halten (beispiel 1: was kommt nach z ? bei mir a' und nicht ein seltsames zeichen) (beispiel 2: schwarze felder werden nicht gezeichnet - sie entstehen automatisch durch freilassen) zum thema xor: hatte es auch erst mit xor gemacht, aber dann fiel mir auf, dass ich nur ein einfaches "=" brauche wenn ich die weißen felder zeichne (die schwarzen sind immer bei x xor y - demnach sind die weißen bei not (x xor y) - und das entspricht einem einfachen "=" ) Code: [AUSKLAPPEN] ; -- Parameter (32, 4, 4, false für Teil 1; 32, 8, 8, true für Teil 2) Const fieldsize = 16, fieldsx = 32, fieldsy = 32, key = True ; weitere Parameter Const keysize = fieldsize * 1.1 * key ; * key um keysize auf 0 zu setzen wenn kein Rahmen existiert Const keyback_r = 64, keyback_g = 64, keyback_b = 64 Const keyfont_r = 192, keyfont_g = 192, keyfont_b = 192 ; errechnete Parameter ; Const width = 1024, height = 768 ; auskommentiert für automatische Größenanpassung Const width = fieldsize * fieldsx + keysize * key ; +keysize wenn Legende angeschaltet ist Const height = fieldsize * fieldsy + keysize * key ; Graphics width, height ; -- entsprechenden Font laden myfont = LoadFont ("MS Sans Serif", fieldsize * 2 / 3, 1) ; Schriftgröße = 2/3 eines Feldes, fettgedruckt SetFont myfont ; Legende anzeigen ? If (key) Then ; Rahmen anzeigen Color keyback_r, keyback_g, keyback_b Rect (0, 0, keysize, height, 1) Rect (0, height - keysize, width, keysize, 1) ; Rahmen beschriften Color keyfont_r, keyfont_g, keyfont_b For y = 1 To fieldsy Text (keysize / 2, (y - 1) * fieldsize + (fieldsize / 2), fieldsy - y + 1, 1, 1) ; 1, 2, 3, ... vertikal zentriert und rückwärtslaufend Next For x = 1 To fieldsx ; Erzeuge anhängenden ' falls nötig (z.B. a') If oldapp <> ((x - 1) / 26) Then oldapp = ((x - 1) / 26) For j = 1 To ((x - 1) / 26) append$ = append$ + "'" Next End If Text (keysize + (fieldsize / 2) + fieldsize * (x - 1), height - keysize / 2, Chr$ (Asc ("a") + (x - 1) Mod 26) + append$, 1, 1) ; a, b, c, ..., y, z, a', b', ... Next End If ; Weiße Felder zeichnen (schwarze ergeben sich von selbst) Color 200, 200, 200 For i = 0 To fieldsx * fieldsy - 1 ; wo liegt das nächste Feld ? ; Feld auf die Form (rx, yy) [z.B. von (0, 0) bis (7, 7)] bringen rx = i / fieldsx ry = i Mod fieldsx ; rausfinden ob rx/ry gerade sind rxe = rx Mod 2 rye = ry Mod 2 ; das Feld nur zeichnen, wenn rxe <-> rye If rxe = rye Then Rect rx * fieldsize + keysize, ry * fieldsize, fieldsize, fieldsize Next WaitKey End |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
@ZEVS: Auch da bräuchtest du noch ein Not, sonst wären es ungerade Zahlen.
@BBPro2: Ein paar mehr Kommentare wären nett, insbesondere bei den langen, einzeiligen Text-Funktionen. Wie es funktioniert sollte möglichst gut beschrieben werden. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
SpionAtomBetreff: Meine Variante |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kein IF, kein MOD, kein XOR, kein Rechnen mit Boolschen Werten, keine verschachtelten Schleifen.
Stattdessen nutze ich die CopyRect, um das Schachbrett aufzufüllen. BlitzBasic: [AUSKLAPPEN] Const SCHACHBRETT_BREITE = 400 |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mist, da hat mich jemand noch um ne Nasenlänge geschlagen ![]() Sehr kreativ, Spyon |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ach Quatsch! Deine Feld-Farb-Switsch-Methode ist auch ziemlich kreativ!
Nur das mit dem 1 in ONE auslagern halte ich für etwas übertrieben. Und wenn schon, dann müsstest du aus 0 auch ZERO machen. |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
PacMani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
SpionAtom hat Folgendes geschrieben: Ach Quatsch! Deine Feld-Farb-Switsch-Methode ist auch ziemlich kreativ!
Nur das mit dem 1 in ONE auslagern halte ich für etwas übertrieben. Und wenn schon, dann müsstest du aus 0 auch ZERO machen. Dem kann ich nur zustimmen. Konstanten sind zum Erläutern eines Sinnes hinter der Zahl nützlich, nicht um die Zahl an sich nochmal wiederzugeben. Sonst müsstest du ja logischerweise auch ONE_BILLION_HUNDREDFOURTYFIVE_MILLION_FIVEHUNDREDTHOUSANDTWENTYFOUR_THREEHUNDREDELEVEN = 1145524311 anlegen ![]() In Sinne des Schachbrettes wäre wennschon eher etwas wie BLACK = 1, WHITE = 0 nützlich. |
||
![]() |
Dice of Darkness |
![]() Antworten mit Zitat ![]() |
---|---|---|
So, dann poste ich einfach mal noch meine Version.
Code: [AUSKLAPPEN] ; BPS#17 - Schachbrett
; ; (c) Dice of Darkness AppTitle "BPS#17: Schachbrett" ;KONSTANTEN Const screenResolution = 600 Const screenMode = 2 Const chessDimension = 8 ;gibt an, wie viele Felder das Brett hat (Standard: 8x8) Const padding = 20 ;Abstand des Feldes zum Bildschirmrand in Pixeln Graphics screenResolution, screenResolution, 16, screenMode SetBuffer BackBuffer() Global frameTimer = CreateTimer(50) ;BLAUER HINTERGRUND ClsColor 0,0,255 Cls ;Das Schachbrett soll zentriert gezeichnet werden. Wir lassen links und rechts am Bildschirm ;jeweils einen Abstand (der Pixelwert ist in padding gespeichert) und haben dann so viele ;Felder, wie die chessDimension ist PLUS EINS, weil noch die Beschriftung der Felder eingefügt werden muss. Global fieldSize# = (screenResolution-padding*2)/(chessDimension+2) Global fieldColor = 0 ;Farbe des aktuellen Feldes (wechselt nach jedem Zeichenvorgang) ;BRETT ZEICHNEN For x=1 To chessDimension For y=1 To chessDimension SwitchColor() Rect (x*fieldSize#) + fieldSize#, y*fieldSize#, fieldSize#, fieldSize# Next If (chessDimension Mod 2 = 0) Then SwitchColor() ;hier wird ein zusätzlicher Switch benötigt, weil wir wieder oben anfangen weiter zu zeichnen Next ;BESCHRIFTUNG DER FELDER Color 200,200,200 ;HORIZONTAL Global ascii = 65 ;Das erste Feld wird mit "A" beschriftet, dann immer mit nachfolgenden Buchstaben For x=1 To chessDimension Text (x*fieldSize#) + fieldSize#*1.5, (chessDimension+1)*fieldSize# + fieldSize#/4, Chr(ascii) ascii=ascii+1 Next ;VERTIKAL Global fieldLine = chessDimension ;Die erste Zeile bekommt den Wert von chessDimension (wir gehen von oben nach unten!) For y=1 To chessDimension Text padding + fieldSize#, y*fieldSize#+fieldSize#/2, fieldLine fieldLine=fieldLine-1 Next WaitKey() ;so lange das Schachbrett anzeigen, bis eine Taste gedrückt wird EndGraphics End Function SwitchColor() fieldColor = 1-fieldColor If(fieldColor) Then Color 255,255,255 ;weiß Else Color 0,0,0 ;schwarz EndIf End Function Kurze Erklärung dazu: Es ist so ziemlich alles "konstant", was man vielleicht mal variieren möchte (Bildschirmauflösung, Anzahl der Schachfelder etc.). Bei meiner Version ist die Auflösung in x- und y-Richtung immer gleich, das hängt damit zusammen, wie sich mein Schachbrett dann grafisch berechnet. Die Funktion SwitchColor() hätte mit Sicherheit schöner machen bzw. ganz darauf verzichten können, aber da war ich einfach mal faul ![]() Um die Buchstaben an die Schachfelder zu schreiben, habe ich übrigens die Funktion Chr() benutzt und den Wert ASCII nach jedem Durchlauf immer inkrementiert - wenn man also nicht mehr als 26 mal 26 Felder auf seinem Schachbrett haben will, geht das auf diese Art ganz gut. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group