[Aufgabenstellung] Programmierwettbewerb Nr 4

Einen?



I've lost that coding' feelin'
Whoa, that coding' feelin'
I've lost that coding' feelin'
Now it's gone, gone, gone, woh

Keyboard, Keyboard, Keyboard, Keyboard
I beg you please, please, please, please
I need your love, need your love
I need your love, I need your love
So bring it on back, so bring it on back
Bring it on back, bring it on back

Bring back that coding' feelin'
Whoa, that coding' feelin'
Bring back that coding' feelin'
'Cause it's gone, gone, gone
And I can't go on, woh

Bring back that coding' feelin'
Whoa, that coding' feelin'
Bring back that coding' feelin'
'Cause it's gone, gone, gone

Eigentlich nur noch ein Abend, aber ich habe da eine echte Schreibblockade. "Das Schreiben wird als qualvoll empfunden. Häufig treten schon beim Gedanken an die Anfertigung der Arbeit oder beim Anblick des Bildschirms körperliche Symptome wie Unwohlsein oder Nervosität auf und es werden Vermeidungshandlungen wie Aufräumen, Putzen etc. ausgeführt."
 
Dazu fällt mir ein motivierenderer Song ein:

Now these points of data make a beautiful line
And we're out of Beta, we're releasing on time.
So I'm GLaD I got burned, think of all the things we learned!
For the people who are still alive!

Wer den Song kennt, darf sich einen Keks freuen, eins der besten Spiele der letzten Jahre gespielt zu haben :)
 
Definitiv! Habs eben erst nochmal durchgespielt :D
Nun wieder der zweite Teil. Den habe ich auch tatsächlich noch nicht durch. Ich bin gespannt.
 
Nach ein wenig Urlaub konnte ich die Abneigung gegen Freizeitprogrammierung überwinden.
Ich muß mich da auch nochmal bei allen entschuldigen, vor allem, wo ich selber im Vorfeld so einen Wind über die Abliefermoral gemacht habe.
Aber das war keine einfache Unlust, das war schon eine körperliche Abneigung, die mich da blockiert hat.

Hat dann auch die Woche noch ein wenig gedauert, weil ich alles noch mal auf den Kopf stellen mußte.
Ich war ja zu 95% fertig, habe dann aber bei den ersten Tests gemerkt, daß das nicht spielbar war. Das ruckelte nur.
Ich hatte alles so schön objektorientiert und schön die Logik von der Visualisierung getrennt, aber Windows Forms ist für Formulare, nicht für Spiele.
Ich hatte gedacht, ich habe Klassen, wo ich dann verschieden Bilder übereinanderlege und die dann an die Form übergebe, aber das funktioniert nicht zufriedenstellend.
ich habe das dann mit Threading probiert, aber das knallt und wenn man das synchronisiert, was ich dann gemacht habe, dann hat man den Vorteil des Multithreadings verschenkt.

Jetzt ist der Code nicht mehr so schön und ich male direkt auf dem Graphik-Objekt der Form, aber ist wenigstens flüssig.
Die Schriftanzeigen konnte ich auch nicht verwende, das paßt zeitlich nicht mit der Aktualisierung der Graphik, daher mußte die Schrift auch über die Graphik erstellt werden.

Anhang anzeigen LunarLander.z01.zipAnhang anzeigen LunarLander.zip

(Bei LunarLander.z01.zip das '.zip' entfernen,( Packetdatei, konnte ohne Dateiendung nicht geladen werden) und dann LunarLander.zip entpacken)
[video=picflash;Form104IVJHW5.08IVJHW5.201918_06_38_38IVJHW5.webm]https://www.picflash.org/picture.php?key=IVJHW5&action=show[/video]

[video=picflash;Form104GZ7SBR.08GZ7SBR.201918_08_00_00GZ7SBR.webm]https://www.picflash.org/picture.php?key=GZ7SBR&action=show[/video]

[video=picflash;Form1049PJ3U5.089PJ3U5.201918_08_41_419PJ3U5.webm]https://www.picflash.org/picture.php?key=9PJ3U5&action=show[/video]

Anhang anzeigen src.zip
 
Zuletzt bearbeitet:
Ich traue meinen Augen nicht, der Kapitn hat was abgegeben und ich habs nicht gesehen? :o

Bei einer sicheren Landung fehlt eigentlich nur noch ein Trollface... aber schön anzusehen, wobei mir nicht ganz klar ist, was dieses "Radar" darstellt, Wind(stärke)?

Und ich finds gut, dass du den inneren Schweinehund überwunden hast. :T
 
Ja. Das soll eine Windrose sein. Gibt die Richtung und die Stärke an. Ist noch der Erstentwurf. Könnte schöner sein aber macht was es soll.

Wieso Trollface? Was stimmt mit dem Astronauten nicht?
 
Ach so... cool. Irgendwie aber schon 10 mal besser als in meiner Umsetzung... (Pfeil).

Dann hätten wir wohl alle, die die was abgeben wollten, abgegeben? :)
 
Moin.

Ich hatte ja leider nur mal so nen Zwischenstand gepostet und dann nix mehr von mir hören lassen. Hab meinen Quellcode wieder gefunden... auf meinem Arbeitslaptop - sehr untypisch. Na jedenfalls, hier ist ein Video vom damaligen Endprodukt (hab jetzt nix weiter dran gemacht)



Und hier der Quellcode (das boardeigene Code-Tag unterstützt kein Lisp-Highlighting :dozey:)
[src=bash]
(defpackage lunar
(:use :trivial-gamekit)
(:export #:start))

;; Load gamekit (for developing only)
;; (ql:quickload :trivial-gamekit)

(defun get-time-stamp ()
(/ (get-internal-real-time)
internal-time-units-per-second))

;; state type of the game
(defstruct state x-v y-v y-a x-pos y-pos angle up? rotate-left? rotate-right? fuel)

;; initial state value
(defparameter initial-state (make-state :x-v 0 :y-v 0 :y-a 0 :x-pos 350 :y-pos 500
:angle 0 :up? nil :rotate-left? nil :rotate-right? nil
:fuel 1000))

;; globals
(defparameter *s* initial-state)
(defparameter *pause* nil)
(defparameter *status* :play)
(defparameter *canvas-width* 800)
(defparameter *canvas-height* 600)
(defparameter *a* 0.2)
(defparameter *thrust-a* -0.5)
(defparameter *lander-width* 40)
(defparameter *lander-height* 40)

;; landing zone, consists of a start and end x-pos
(defstruct landing-zone start end)
(defun random-landing-zone (width)
(let* ((half (/ width 2))
(middle (+ half (random (- *canvas-width* width)))))
(make-landing-zone :start (- middle half)
:end (+ middle half))))
(defparameter *landing-zone* (random-landing-zone 70))

(gamekit:defgame lunar-lander () ()
(:viewport-width *canvas-width*)
(:viewport-height *canvas-height*)
(:viewport-title "Lunar Lander"))

(gamekit:define-image :lander "lander.png")

(defun initialize ()
(setf *pause* t)
(setf *status* :play)
(setf *s* initial-state)
(setf *landing-zone* (random-landing-zone 70)))

;; functions to determine new values
(defun new-x-pos (x-pos v)
(cond
((> x-pos (+ 40 *canvas-width*)) -40)
((< x-pos -40) (+ 40 *canvas-width*))
(t (+ x-pos v))))

(defun new-v (a old-v)
(+ old-v (* 0.04 a)))

(defun new-y-a (s)
(if (state-up? s)
(+ *a* *thrust-a*)
*a*))

(defun new-y-pos (y-pos v)
(- y-pos v))

(defun new-y-v (a angle old-v)
(+ old-v (* (cos angle) 0.04 a)))

(defun new-x-v (a angle old-v)
(+ old-v (* (sin angle) 0.04 a)))

(defun new-angle (s)
(let* ((old (state-angle s))
(right? (state-rotate-right? s))
(left? (state-rotate-left? s)))
(cond
((and left? right?) old)
((and right? (> old -1.4))
(- old 0.04))
((and left? (< old 1.4))
(+ old 0.04))
(t old))))

(defun lander-left-pos (x-pos)
(- x-pos (/ *lander-width* 2)))

(defun lander-right-pos (x-pos)
(+ x-pos (/ *lander-width* 2)))

;; win condition helping functions
(defun lander-on-landing-zone? (x-pos landing-zone)
(let ((left (lander-left-pos x-pos))
(right (lander-right-pos x-pos)))
(and (> left (landing-zone-start landing-zone))
(< right (landing-zone-end landing-zone)))))

(defun won? (y-v angle)
(and (lander-on-landing-zone? (state-x-pos *s*) *landing-zone*)
(< y-v 0.4)
(< angle 0.08)))

(defun on-ground? (y-pos)
(< y-pos 10))

;; gets invoked on every time tick
(defun update-state ()
(cond
((< (state-fuel *s*) 0)
(setf *status* :lose))

;; win condition
((and (on-ground? (state-y-pos *s*))
(won? (state-y-v *s*) (state-angle *s*)))
(setf *status* :win))

;; lose condition
((on-ground? (state-y-pos *s*))
(setf *status* :lose))

;; Not on ground and enough fuel
(t
(setf *s* (make-state :x-v (new-x-v (if (state-up? *s*)
*thrust-a* 0)
(state-angle *s*)
(state-x-v *s*))
:y-v (new-y-v (state-y-a *s*)
(state-angle *s*)
(state-y-v *s*))
:y-a (new-y-a *s*)
:x-pos (new-x-pos (state-x-pos *s*) (state-x-v *s*))
:y-pos (new-y-pos (state-y-pos *s*) (state-y-v *s*))
:up? (state-up? *s*)
:rotate-left? (state-rotate-left? *s*)
:rotate-right? (state-rotate-right? *s*)
:angle (new-angle *s*)
:fuel (if (state-up? *s*)
(- (state-fuel *s*) 1)
(state-fuel *s*)))))))

(defun key-bindings ()
(gamekit:bind-button :p :pressed
(lambda () nil))
(gamekit:bind-button :p :released
(lambda () (setf *pause* (not *pause*))))
(gamekit:bind-button :up :pressed
(lambda () (setf (state-up? *s*) t)))
(gamekit:bind-button :up :released
(lambda () (setf (state-up? *s*) nil)))
(gamekit:bind-button :left :pressed
(lambda () (setf (state-rotate-left? *s*) t)))

(gamekit:bind-button :left :released
(lambda () (setf (state-rotate-left? *s*) nil)))

(gamekit:bind-button :right :pressed
(lambda () (setf (state-rotate-right? *s*) t)))

(gamekit:bind-button :right :released
(lambda () (setf (state-rotate-right? *s*) nil)))

(gamekit:bind-button :r :pressed
(lambda ()
(initialize))))

(defun draw-img (img x-pos y-pos width height scaling rot-deg)
(gamekit:with-pushed-canvas ()
(gamekit:translate-canvas x-pos y-pos)
(gamekit:rotate-canvas rot-deg)
(gamekit:scale-canvas scaling scaling)
(gamekit:draw-image (gamekit:vec2 (/ width -2) (/ height -2)) img)))

(defun draw-landing-zone (landing-zone)
(gamekit:draw-line (gamekit:vec2 (landing-zone-start landing-zone)
0)
(gamekit:vec2 (landing-zone-end landing-zone)
0)
(gamekit:vec4 1 1 1 1)
:thickness 3))

(defun draw-header ()
(gamekit:draw-text "Lunar Lander" (gamekit:vec2 300 570) :fill-color (gamekit:vec4 1 1 1 1)))

(defun draw-stats ()
(gamekit:with-pushed-canvas ()
(gamekit:scale-canvas 0.75 0.75)
(gamekit:draw-text (format nil "State: ~a" *status*) (gamekit:vec2 0 700)
:fill-color (gamekit:vec4 1 1 1 1))
(gamekit:draw-text (format nil "Pause: ~a" *pause*) (gamekit:vec2 0 670)
:fill-color (gamekit:vec4 1 1 1 1))
(gamekit:draw-text (format nil "Angle: ~2,2@F" (state-angle *s*)) (gamekit:vec2 0 640)
:fill-color (gamekit:vec4 1 1 1 1))
(gamekit:draw-text (format nil "y-velocity: ~2,2@F" (* 10 (floor (* (state-y-v *s*) 10)))) (gamekit:vec2 0 610)
:fill-color (gamekit:vec4 1 1 1 1))
(gamekit:draw-text (format nil "FUEL: ~a" (state-fuel *s*)) (gamekit:vec2 0 580)
:fill-color (gamekit:vec4 1 1 1 11))))

(defmethod gamekit:draw ((this lunar-lander))
(gamekit:draw-rect (gamekit:vec2 0 0) (- *canvas-width* 1) (- *canvas-height* 1)
:fill-paint (gamekit:vec4 0 0 0 1)
:stroke-paint (gamekit:vec4 0 0 0 1))
(draw-img :lander (state-x-pos *s*) (state-y-pos *s*) *lander-width* *lander-height* 0.5 (state-angle *s*))
(draw-landing-zone *landing-zone*)
(draw-header)
(draw-stats))

;; tick function
(defmethod gamekit:act ((this lunar-lander))
(if *pause*
nil
(update-state)))

(defun start ()
(gamekit:start 'lunar-lander :autoscaled nil)
(key-bindings))

(start)

[/src]
Und hier mit Code-Highlighting .

Leider hab ich das unter Windows nicht zum Kompilieren gekriegt, deshalb nur Code und Video.
 
Zurück
Oben