Retro-Contest Part 2

Übersicht Sonstiges Smalltalk

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen

BladeRunner

Moderator

Betreff: Retro-Contest Part 2

BeitragSa, Okt 26, 2013 15:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo ihr Lieben,

Zeit für einen weiteren Retrocontest.
Diesmal ein wenig andere Vorzeichen:
Ihr dürft alle Befehle der verwendeten Sprache nutzen, auch sämtliche Includes, Libraries etc, denn es gibt keine Codemengenbegrenzung.
ABER:
- für Variablen stehen euch insgesamt nur 32 Byte zur Verfügung- wie ihr die auf Bytes, Ints, Doubles etc. verteilt ist eure Sache, nur mehr als die 32 Byte dürfen nicht genutzt werden.
- Für Konstanten habt ihr insgesamt 256 Byte Platz, die ihr mit Strings, Koordinaten, whatever füllen dürft.

(bei Strings nehmen wir an dass sie Nullterminiert sind, also Textlänge+1 pro String.)

- Die Bildschirmausgabe erfolgt zwingend aus einem Array mit 1000 Byte, welches einer Zeichenmatrix von 40*25 ASCII entspricht. Hintergrundfarbe ist fix: schwarz.
Der Bildschirmspeicher ist auch eure einzige Möglichkeit ansonsten RAM in Anspruch zu nehmen, was darin gespeichert ist MUSS gerendert werden, aber ihr könnt den Speicher für Zwischenergebnisse nutzen (schwarz auf schwarz gerendert sieht man ja nicht... Wink)
- Ein weiterer Tipp dazu: Punkte für Spieler muss man nicht als Variable im Speicher halten. Man kann auch mit einer Funktion die passenden Bildschirmzellen inkrementieren. Doch genug der Hilfestellungen...

- Es stehen euch ebenfalls 1000 Byte Farbram zur Verfügung, wovon jedoch nur die unteren 3 Bit verwendet werden, ihr habt also maximal 8 unterschiedliche Farben und eine Farbe pro Zeichen. Der Rest des Farbrams MUSS ungenutzt bleiben, da nicht adressierbar.
Wenn ihr das Farbram in Anspruch nehmt ist es euch gestattet diese 8 Farben ausserhalb des Konstantenspeichers mit ihren Farbwerten zu definieren, da auch dies Hardwaresache ist.

- Einzige Eingabemethode ist die Tastatur.

- Sound ist einstimmig per Beep() oder einer entsprechung erlaubt, sprich ihr dürft das Beepen auch als .wav einladen und wiedergeben. Filenamen etc. zählen nicht zu den Variablen, da hiermit eine Hardwareeigenschaft simuliert wird. Allerdings darf der Sound nur einem einzelnen Beep entsprechen, Melodien müsst ihr also aus dem Konstanten- oder Variablenspeicher erzeugen Wink

- es sei euch ein Sprite der Größe 8*8 Pixel, maximal die verwendeten acht Farben erlaubt welches Ihr als Grafik einladen dürft. Animationen gibt es dafür keine, aber es kann pixelgenau gesetzt werden (also -8 -- 320 / -8 -- 200, damit ist es auch möglich das Sprite verschwinden zu lassen). Schwarze Pixel im Sprite sind durchsichtig.



Eure Aufgabe: Erstellt mit den gegebenen Restriktionen ein Spiel. Selbstredend dürfen die Variablen mehrfach verwendet und für verschiedene Zwecke genutzt werden, die Logistik dahinter ist des Programmierers Sache.

Um das ganze für den Contestbewerter (ergo: mich) leichter überschaubar zu halten wäre es sehr sinnig wenn ihr die Variablen und Konstanten als Array oder Bank anlegt, damit man den Zugriff darauf verfolgen kann. Diese können dann gern intern per Variable referenziert werden.
Beispiel:
BlitzMax: [AUSKLAPPEN]
Local vars:Byte[32]
vars[1]=1
Local a:Int = vars[0]*$1000000+vars[1]*$10000+vars[2]*$100+vars[3]
Print a

A wird aus dem Array erzeugt und kann dann weiter genutzt werden. Jede Änderung an A muss dann aber auch direkt in das Array übertragen werden, damit nicht unerlaubterweise mehrere Variablen den selben Raum getrennt bearbeiten können.
Helferfunktionen dafür könnten zB so aufgebaut sein:
BlitzMax: [AUSKLAPPEN]

Function GetInt:Int(array:Byte[],pos:Byte)
Return array[pos] * $1000000 + array[pos + 1] * $10000 + array[pos + 2] * $100 + array[pos + 3]
End Function

Function SetInt(array:Byte[],pos:Byte,value:Int)
array[pos] = value Shr 24
array[pos + 1] = (value Shr 16) & $ff
array[pos + 2] = (value Shr 8) & $ff
array[pos+3]= value & $ff
End Function

Damit müsste dann vor jeder Änderung mit GetInt der Inhalt ausgelesen, nach jeder Änderung mit SetInt wieder gesichert werden.

Beispiel:
BlitzMax: [AUSKLAPPEN]
Local a:Int = GetInt(vars , 0) 
a = a + 1
SetInt(vars , 0 , a)


Deadline sind 3 Wochen ab jetzt, also der 16.11.2013 23.59.59

Noch Fragen?
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

BladeRunner

Moderator

BeitragSa, Okt 26, 2013 19:00
Antworten mit Zitat
Benutzer-Profile anzeigen
So, noch Fragen die im Chat gestellt wurden klären:
Alle Variablen die man in seinem Code benötigt müssen eine Entsprechung in den 32 Byte haben. Das gilt auch für Funktionsparameter. Ausgenommen sind lediglich die Funktionen die als Hilfe genutzt werden um auf die 32 Byte zuzugreifen sowie die im Startthread genannten initialen Ladebefehle und so.
Um das ganze ein wenig leichter zu gestalten, was auch das Bildschirmlayout angeht, erweitere ich die Regeln noch um folgenden Punkt:

- Es ist zu Beginn des Programmes einmalig gestattet das BildschirmRAM und das FarbRAM aus einer jeweils 1000 Byte großen Datei zu befüllen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

tft

BeitragSo, Okt 27, 2013 19:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Booooaaaaa .... das erinnert mich an meine ersten geh Versuche mit dem ZX 80 von Spektrum.
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

tft

BeitragSo, Okt 27, 2013 19:56
Antworten mit Zitat
Benutzer-Profile anzeigen
das wird ja interesant.
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

DAK

BeitragSo, Okt 27, 2013 22:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Man sollte glatt mal sowas auf nem Atmega oder so machen^^
Gewinner der 6. und der 68. BlitzCodeCompo

tft

BeitragSo, Okt 27, 2013 22:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Sehe ich das richtig das diese Zeile

Local a:Int = vars[0]*$1000000+vars[1]*$10000+vars[2]*$100+vars[3]

aus 8 Byte als Variablen und 6 Byte Konstante besteht.
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

Jan_

Ehemaliger Admin

BeitragMo, Okt 28, 2013 13:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Dürfen Dateien geladen werden, um ganz genau zu sein, Dateien, wo Levels hinterlegt sind.
between angels and insects

DAK

BeitragMo, Okt 28, 2013 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Würde das nicht dem Sinn des Konstantenspeichers widersprechen? Damit könnte man ja die Konstantenspeicherregelung komplett umgehen.
Gewinner der 6. und der 68. BlitzCodeCompo

tft

BeitragMo, Okt 28, 2013 18:30
Antworten mit Zitat
Benutzer-Profile anzeigen
@JAN_ ich denke nicht.

Mir ist aber die Darstellungs-Grenze noch nicht ganz klar. Wenn ich das noch richtig in Erinnerung habe. So gab es einen Video Speicher der 320 * 200 Bildpunkte darstellte. Ein Text Bitmap Speicher von 256 Zeichen mit 8*8 bit , macht 2048 Byte . Der Farbspeicher ist 1024 Byte gross.

Könntest du das noch konkretisieren ....
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

BladeRunner

Moderator

BeitragMo, Okt 28, 2013 21:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Sehe ich das richtig das diese Zeile

Local a:Int = vars[0]*$1000000+vars[1]*$10000+vars[2]*$100+vars[3]

aus 8 Byte als Variablen und 6 Byte Konstante besteht.

Nein.
Wenn die Zeile teil einer Funktion zum Auslesen / Besschreiben des Variablenspeichers ist ist der ganze Sermon kostenlos.
Steht es frei im Code oder einer Funktion für anderen Zweck würde der Variablenteil stimmen, wäre aber Sinnfrei da Du ja jede Zelle deines Variablenspeichers beliebig oft und in beliebiger Kombi referenzieren kannst.

Beim Konstantenteil gibt das gleiche:
Anstatt 7 Byte (4+3+2) könntest Du die hier angegebenen Konstanten mit 2 Byte erledigen: alle Konstanten lassen sich aus $01 und $00 erzeugen, in dem man mehrere davon kombiniert. Der einzige Unterschied zwischne Vars und Knstanten ist hier dass die Konstanten exakt einmal bei Programmstart definiert werden dürfen.

Zitat:
Dürfen Dateien geladen werden, um ganz genau zu sein, Dateien, wo Levels hinterlegt sind.

Nein. Die Regeln sind diesbezüglich ja recht eindeutig.
Geladen werden dürfen:
- ein Beep-Sound
- 1000 Byte einmalig zum Programmstart mit Inhalt des Screenrams
- 1000 Byte einmalig zum Programmstart mit Inhalt des Farbrams
- eine 8*8-Pixel große Bilddatei mit maximal 8 Farben.
C'est ca.
Von mir aus dürft ihr auch den Konstantenspeicher (256 Byte) einmalig zu Beginn einladen.
Es gilt dabei dass nur einmalig zu Programmstart geladen werden darf, bzw. falls das Programm einen Restart macht darf erneut geladen werden, jedoch keine anderen Daten. Simpler gesagt: Die Filenamen müssen hardcodiert sein und die Files dürfen nicht manipuliert werden.


Zitat:
Mir ist aber die Darstellungs-Grenze noch nicht ganz klar. Wenn ich das noch richtig in Erinnerung habe. So gab es einen Video Speicher der 320 * 200 Bildpunkte darstellte. Ein Text Bitmap Speicher von 256 Zeichen mit 8*8 bit , macht 2048 Byte . Der Farbspeicher ist 1024 Byte gross.

Wenn Du vom C64 redest liegst Du im wesentlichen krrekt. Es geht hier aber nicht um einen C64 sondern um einen virtuellen - sprich nicht real existierenden- Rechner der einer 8-Bit Architektur entspricht.
Daher auch die Begrenzung auf einen Reinen Textmodus mit 40*25 Zeichen welche Durch jeweils 1 Byte (Zeichen) und 1 Byte (Farbe, nur die unteren drei Bit werden gewertet) repräsentiert werden, was in der Summe 2000Byte für beide RAMS macht.
Die zu verwendende Schriftart sollte also ideal fixed in der Größe auf 8*8 Pixel pro Zeichen sein, so zB der Zeichensatz des C64. Ich lasse aber auch andere Schriftarten gelten, solange Sie in einem Fixed Grid sind.
(ein passender Font wäre zB hier zu finden: http://style64.org/c64-truetype ).
Wenn wirklich ien Zeichen 8*8 Pixel einnimmt passsen die im Startpost gegebenen Koordinaten für das Sprite, ansonsten müssen sie angepasst werden.

EDIT: FIxedsys ist auch okay Smile
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

DAK

BeitragMo, Okt 28, 2013 22:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Beim Konstantenteil gibt das gleiche:
Anstatt 7 Byte (4+3+2) könntest Du die hier angegebenen Konstanten mit 2 Byte erledigen: alle Konstanten lassen sich aus $01 und $00 erzeugen, in dem man mehrere davon kombiniert. Der einzige Unterschied zwischne Vars und Knstanten ist hier dass die Konstanten exakt einmal bei Programmstart definiert werden dürfen.


Da sehe ich Missbrauchspotential.
Beispiel: in die 256 Byte lege ich mir jede beliebe 1-Byte-Kombination. Im Code selbst kombiniere ich diese Bytes je nach Bedarf wieder weiter. Kombiniere ich vier davon, habe ich jeden beliebigen 4-Byte-Int-Wert. Um genau zu sein, kann man dann einfach durch den Code (der ja kostenlos ist), jeden beliebigen Wert überhaupt annehmen, soweit, dass man sich dann rein aus Code mehrere ganze Levels aufbaut, ohne überhaupt irgendeinen weiteren Speicher zu verbrauchen.

Also entweder: weniger als 256 Byte, was dann z.B. bei 64 Byte dafür sorgt, dass man so zum Schummeln 4-Bit-Werte nehmen muss, was mühsamer ist, dafür macht man es für ehrlich spielende Mitbewerber noch viel schwerer, was wohl kontraproduktiv ist.
Oder: Beschränkungen beim Kombinieren der Konstanten, wie z.B. Konstanten dürfen nicht miteinander kombiniert werden, aber auch das wäre schwammig, ließe sich umgehen und stört die, die im Sinne des Erfinders programmieren mehr, als die die die Regeln umgehen wollen.

Das Problem dabei ist eben, dass die Grenze hier zwischen Regelkonform und Schummeln sehr grau ist.
Gewinner der 6. und der 68. BlitzCodeCompo

BladeRunner

Moderator

BeitragMo, Okt 28, 2013 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh, wer es sich antun will ein zweitausendzeilen monster zu basteln was aus den gegebenen Kombis alles bastelt: bitte sehr.
Selbstredend ist das aufweichen der Grenzen, aber um welchen Preis. Und ich denke in der Abstimmung würde das auch passend ... gewürdigt.
Von daher bleibt es so Wink
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

DAK

BeitragMo, Okt 28, 2013 22:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist ok, wollt's nur anmerken, weil's mir aufgefallen ist.
Gewinner der 6. und der 68. BlitzCodeCompo

BladeRunner

Moderator

BeitragMo, Okt 28, 2013 23:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Nebenbei erwähnt klappt es so ja auch nicht, da du ja zum repräsentieren der Kombinationen eine Darstellung in Variablen bräuchte, was recht rasch an Grenzen stößt Wink
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

DAK

BeitragDi, Okt 29, 2013 0:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Man könnte z.B. die Konstanten in ein großes Array packen, das dann in einer Funktion kombinieren und direkt in den Grafikspeicher werfen. Wenn man das Array definiert als "Hat zwar 4 Byte pro Feld, aber es wird nur das unterste Byte verwendet, der Rest ist nur notwendig, da Blitz kein Byte addressieren kann", dann geht das ganz gut.

Btw: ist was Anderes als Blitz erlaubt?
Gewinner der 6. und der 68. BlitzCodeCompo

BladeRunner

Moderator

BeitragMi, Okt 30, 2013 3:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Wenn man das Array definiert als "Hat zwar 4 Byte pro Feld, aber es wird nur das unterste Byte verwendet, der Rest ist nur notwendig, da Blitz kein Byte addressieren kann", dann geht das ganz gut.

Deswegen sind Helferfunktionen erlaubt (und Variablentechnisch kostenlos), die den Zugriff auf das Byte erlauben - keine Sprache soll einen Nachteil haben weil ihr ein paar Datentypen fehlen.
Erlaubt sind alle Hochsprachen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

DAK

BeitragMi, Okt 30, 2013 13:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay, das heißt, wenn ich auf eine Variable immer mit (x Mod 256) zugreife, dann ist es nur ein Byte, oder?
Kann ich dann auch gratis ((x Mod 256)-128)/16 verwenden, um somit ein Signed Byte mit Fixkomma zu bekommen? (Eventuell auch ohne den /16-Teil, wenn das nicht gilt)

Kosten die Variablen (Laufvariablen für das For), die ich brauche, um den Grafikspeicher auf den Bildschirm zu kriegen, etwas?
Gewinner der 6. und der 68. BlitzCodeCompo

BladeRunner

Moderator

BeitragMi, Okt 30, 2013 13:33
Antworten mit Zitat
Benutzer-Profile anzeigen
((x Mod 256)-128)/16 enthalt 3 Konstanten in 4 Byte ($100, &80,$10) und eine Variable(x)

Die Laufvariablen müssen durch die 32 Byte VarSpeicher abgedeckt sein.

Um die Lesbarkeit der Abgabe zu steigern würde ich empfehlen Im Code (kostenlos) Konstanten für die Zugriffe zu definieren.

Beispiel:
BlitzMax: [AUSKLAPPEN]
Const LAUF1:Byte = 0

...
Local i:Byte = GetByte(vars,LAUF1)
For i =consts[0] To consts[221]
SetByte(vars,LAUF1,i) 'weil ja die Variablen immer up2Date gehalten werden müssen...
...
Next
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

DAK

BeitragMi, Okt 30, 2013 15:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Zu ((x Mod 256)-128):

In einer Sprache, wo es den Variablentyp Byte gibt, ist (x Mod 256) kostenlos, da das Byte sowieso so reagiert. Wenn man bei einem unsigned byte 0-1 rechnet, bekommt man 255, und 255+1 ergibt 0. Hat genau die gleiche Funktionalität wie (x Mod 256).
Ähnliches gilt doch auch für eine Sprache, wo es signed bytes gibt, mit ((x Mod 256)-128).

Was ich gemeint hab, war nicht, dass es nur einen Aufruf dieser Art gibt, sondern x nur mit diesem Aufruf verwendet wird, so dass x effektiv ein Byte ist. Wenn man nämlich nur 4-Byte-Variablen hat, dann sind 32 Byte ziemlich schnell weg, wo man sonst deutlich mehr zur Verfügung hat.

Aber dein Wort als Veranstalter gilt.
Gewinner der 6. und der 68. BlitzCodeCompo
 

feider

ehemals "Decelion"

BeitragDi, Nov 05, 2013 12:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Werde mit C und SDL teilnehmen.

Frage zu den Regeln. Bei C habe ich Präprozessor-Anweisungen zur Verfügung. D.h.

Code: [AUSKLAPPEN]

#include <stdio.h>

#define KEINE_KONSTANTE 5

const char eine_konstante = KEINE_KONSTANTE;

int main()
{
    char eine_variable=KEINE_KONSTANTE;
    printf("keine konstante: %i, eine konstante: %i, eine variable %i\n", KEINE_KONSTANTE, eine_konstante, eine_variable);

}

gibt aus:
Zitat:
keine konstante: 5, eine konstante: 5, eine variable: 5


Dabei ersetzt der Präprozessor wörtliche alle Vorkommen von "KEINE_KONSTANTE" mit "5", d.h. im fertigen Maschinencode ist die 5 hart drin, während eine_konstante eine echte Konstante ist, die als solche auch speicher außerhalb des Code-Bereiches benötigt.
eine_variable wird der Wert 5 zugewiesen und gehört ganz klar zu den 32 Byte Platz für Variablen. eine_konstante gehört auch ganz klar in die 256 Byte Platz für konstante Variablen.
Aber wie sieht es mit KEINE_KONSTANTE aus? Habe ich davon unbegrenzt viel zur Verfügung, oder soll das mit zu den Konstanten zählen?

Grüße
feider

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group