 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Seb

Anmeldungsdatum: 29.11.2006 Beiträge: 120 Wohnort: Henfenfeld
|
Verfasst am: 10.02.2008, 16:38 Titel: kleines Spiel |
|
|
Hallo!
Wie kann man ein kleines Spiel programmieren, wo man einen Punkt durch ein Art Labyrint führen muss, aber man kann nicht durch eine Wand(Strich)? _________________ MfG
Seb |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 10.02.2008, 17:03 Titel: |
|
|
Hallo
Genau dieses Problem wurde hier schon öfter besprchen, vielleicht findest Du über die Forensuche was dazu.
Prinzipiell kannst du entweder das Spielfeld in Felder unterteilen wie z.B. bei einem Schachbrett und in einem Array, einer Feldvariablen also, für jedes Feldelement speichern, ob es frei oder besetzt ist. Die andere Möglichkeit ist, auf dem Grafikbildschirm mit POINT (x, y) festzustellen, welche Farbe ein Pixel hat und ob diese evtl. die Farbe eines Hindernisses ist.
In beiden Fällen also erst prüfen, ob die gewünschte Position frei ist und nur, wenn diese Bedingung erfüllt ist, die Bewegung ausführen.
Gruß
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
Seb

Anmeldungsdatum: 29.11.2006 Beiträge: 120 Wohnort: Henfenfeld
|
Verfasst am: 10.02.2008, 18:14 Titel: |
|
|
Ämm...
Ich kann nicht wirklich viel in QBasic programmieren.
Hab bis jetzt nur ein Rechenprogramm und ein Programm zum Speichern von Texten, etc. programmiert...
Das wars dann aber auch schon
Hab mir gerade mal den Script von PacMan unter http://www.east-power-soft.de/index.php?menu=quickbasic_qtuts_2d angeschaut, aber das hilft mir auch nicht viel.
Ich wollte einfach nur ein simples, kleines Spiel machen
Kann mir jemand evtl. einen kleinen Code geben, wie das funktioniert(ich wüsste jetzt nicht, was ich da alles machen muss )? _________________ MfG
Seb |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 10.02.2008, 18:59 Titel: |
|
|
Von mir ein derartiges Beispiel:
http://www.dreael.ch/Deutsch/Download/Labyrinth.html
Geht mit seiner perspektivischen 3D-Darstellung noch einen Schritt weiter, aber grundlegende Dinge wie Labyrinth mit Hilfe von RND generieren sowie Wandkollisionen auswerten wirst Du auf jeden Fall finden. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
Seb

Anmeldungsdatum: 29.11.2006 Beiträge: 120 Wohnort: Henfenfeld
|
Verfasst am: 10.02.2008, 19:07 Titel: |
|
|
Ist das mit der Wandkollision von Zeile 657 bis 732?
Das mit dem "bewegen" habe ich nicht wirklich gefunden
€dit:
Das Programm ist cool  _________________ MfG
Seb |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 10.02.2008, 20:11 Titel: |
|
|
Dann beschäftige dich lieber nochmal mit den Grundlagen. _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
croco97

Anmeldungsdatum: 04.11.2005 Beiträge: 260
|
Verfasst am: 10.02.2008, 20:42 Titel: |
|
|
OK, ein paar kleine Tipps:
1.) "Bewegung" heisst, dass du im einfachsten Fall einen Punkt zeichnest, ihn löschst, an der nächsten Stelle neu zeichnest, ihn wieder löschst usw. ==> Punkt bewegt sich.
2.) Punkt zeichnen mit PSET x,y oder LINE oder PUT
3.) Steuerung: Du packst das "Löschen und Neuzeichnen" in ein Unterprogramm, das aufgerufen wird, wenn eine Taste gedrückt wurde. Abfragen der Tasten mit INKEY$
4.) "Wand": Du verbietest, dass der Punkt dort gezeichnet wird, wo auf dem Bildschirm schon ein Pixel mit einer bestimmten Farbe (Wandfarbe) ist. Hilfreich ist dafür die Funktion POINT()
Viel Spass!
Croco
PS: Schau mal im Oma-Tutorial nach! |
|
Nach oben |
|
 |
Seb

Anmeldungsdatum: 29.11.2006 Beiträge: 120 Wohnort: Henfenfeld
|
Verfasst am: 11.02.2008, 17:36 Titel: |
|
|
Danke!
Ich versuch erstmal einen Punkt oder einen Buchstaben zu bewegen...
Muss das am schluss dann ungefähr so aussehen?:
Code: | SCREEN 12
1 :
PRINT "X"
SELECT CASE INKEY$
CASE CHR$(0) + CHR$(&H48)
PacDir% = 2
CASE CHR$(0) + CHR$(&H50)
PacDir% = 3
END SELECT
IF PacDir% = 2 THEN GOTO 1
IF PacDir% = 3 THEN CLS
IF PacDir% = 3 THEN PRINT
IF PacDir% = 3 THEN PRINT "X" |
_________________ MfG
Seb |
|
Nach oben |
|
 |
Elvis

Anmeldungsdatum: 01.06.2006 Beiträge: 818 Wohnort: Deutschland, BW
|
Verfasst am: 11.02.2008, 19:33 Titel: |
|
|
Du machst eine Hauptschleife, statt GOTO (DO...LOOP), in der du pausieren lässt, bis eine relevante Taste gedrückt wird
(Bewegung des Protagonisten, Pausieren, Beenden etc.). Dein X bekommt zwei Variablen: Xx und Xy. Wenn z.B. die
Linke Pfeiltaste gedürckt wird, verminderst du Xx um 1 (Xx = Xx - 1). Damit sich dein Zeichen nicht außer Reichweite be-
wegt oder an eine Wand stößt, überprüfst du mit ein paar IFs, ob Xx und Xy abhängig vom verwendeten Textmodus (Zeilen
und Spalten) ein Wert überschreiten (<;>) und am besten mit einem Feld oder DATA, ob X z.B. auf Position (5|10) ist
(rechts neben eine Mauer) und sich deshalb nicht nach links bewegen darf.
Das wichtigste sind die Variablen Xx und Xy, mit denen du "X" mit LOCATE auf dem Bildschirm ziemlich einfach richtig po-
sitioniert ausgeben kannst.
Grüße, Elvis _________________ Geforce 7300GT (256MB GDDR3, Gainward) -- 2x 512MB (DDR2 800, MDT) -- AMD Athlon64 X2 EE 3800+ -- Asrock ALiveNF5-eSATA2+ |
|
Nach oben |
|
 |
Seb

Anmeldungsdatum: 29.11.2006 Beiträge: 120 Wohnort: Henfenfeld
|
Verfasst am: 12.02.2008, 17:42 Titel: |
|
|
Code: | SCREEN 12
PRINT "X"
SELECT CASE INKEY$
CASE CHR$(0) + CHR$(&H4B)
Xpos% = 0
CASE CHR$(0) + CHR$(&H4D)
Xpos% = 1
CASE CHR$(0) + CHR$(&H48)
Xpos% = 2
CASE CHR$(0) + CHR$(&H50)
Xpos% = 3
END SELECT
SELECT CASE Xpos%
CASE 0: IF Xpos% = 0 THEN Xx% - 1
CASE 1: IF Xpos% = 1 THEN Xx% + 1
CASE 2: IF Xpos% = 2 THEN Xy% - 1
CASE 3: IF Xpos% = 3 THEN Xy% + 1
END SELECT |
Ich habe erst nur mal das bewegen gemacht(ohne Mauern, etc.)...
Was fehlt noch oder ist falsch? _________________ MfG
Seb |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 12.02.2008, 19:51 Titel: |
|
|
Code: | CASE 0: IF Xpos% = 0 THEN Xx% - 1 |
benötigt eine Anweisung: ... THEN Xx% = Xx% -1. Außerdem ist es
ist doppelt gemoppelt. CASE 0 tritt ja nur ein wenn Xpos = 0.
Eine Anzeige brauchst du noch, z. B.
Code: | LOCATE Xy%, Xx%
PRINT "X" |
Dann solltest du aber noch sicher stellen, dass Xy% und Xx% im anzeigbaren Bereich sind (sonst gibt es einen Programmabbruch).
Das ganze noch in eine Schleife gepackt, damit das Programm nicht sofort wieder zuende ist:
Code: | SCREEN 12
Xy% = 1
Xx% = 1
LOCATE Xy%, Xx%
PRINT "X"
DO
Xpos% = -1 ' keine Bewegung, wenn kein Tastendruck
SELECT CASE INKEY$
CASE CHR$(0) + CHR$(&H4B)
Xpos% = 0
CASE CHR$(0) + CHR$(&H4D)
Xpos% = 1
CASE CHR$(0) + CHR$(&H48)
Xpos% = 2
CASE CHR$(0) + CHR$(&H50)
Xpos% = 3
END SELECT
SELECT CASE Xpos%
CASE 0: Xx% = Xx% - 1
CASE 1: Xx% = Xx% + 1
CASE 2: Xy% = Xy% - 1
CASE 3: Xy% = Xy% + 1
END SELECT
IF Xx% < 1 then Xx% = 1
IF Xx% > 10 then Xx% = 10
IF Xy% < 1 then Xy% = 1
IF Xy% > 10 then Xy% = 10
CLS
LOCATE Xy%, Xx%
PRINT "X"
LOOP UNTIL Xx% = 10 AND Xy% = 10 |
Ist noch bei weitem nicht optimiert (z. B. das ständige Löschen und Neuzeichnen, oder die fehlende Abbruchbedingung; die beiden SELECT-Anweisungen ließen sich auch zu einer zusammenfassen). _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Seb

Anmeldungsdatum: 29.11.2006 Beiträge: 120 Wohnort: Henfenfeld
|
Verfasst am: 12.02.2008, 20:41 Titel: |
|
|
Vielen Dank!
Warum "flackert" das "X" bei mir immer so?
Liegt das am PC oder wo anderes?
€dit:
Ah, das liegt am "CLS"...
Kann man das auch anders machen, dass das nicht "flackert"? _________________ MfG
Seb |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 12.02.2008, 20:50 Titel: |
|
|
Es liegt daran, dass es ständig gelöscht und neugeschrieben wird. Wie gesagt, nicht optimiert. Das könntest du vielleicht so lösen:
Code: | IF Xpos > -1 THEN ' nur wenn eine Richtungstaste gedrückt wurde
CLS
LOCATE Xy%, Xx%
PRINT "X"
END IF |
_________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 12.02.2008, 21:02 Titel: |
|
|
oder statt den bildschirm nicht immer neu zeu schreiben, kannst du dir das alte zeichen auf dem spielerfeld "merken" und bei einer bewegung wieder hinPRINTen...
Im einfachsten fall musst du an der alten position (ab besten X- und Y-wert dafür in zwei neuen variablen ablegen!) ein leerzeichen PRINTen, aber du kannst, wenn du was lernen willst, auch dich mal mit der Funktion SCREEN (nicht der Befehl SCREEN, mit dem man die Bildschirmauflösung festlegt!) auseinandersetzen, denn damit kann man das ein Zeichen vom bildschirm lesen. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 12.02.2008, 21:20 Titel: |
|
|
Langfristig würde ich das über eine SUB lösen, welche das X an der alten Position löscht, den x- oder y-Wert ändert und dann das X an die neue Position zeichnet. Dann kann diese SUB später auch die Überprüfung übernehmen, ob man in die Richtung überhaupt laufen kann. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 13.02.2008, 14:44 Titel: |
|
|
Hallo
Ich habe mir auch mal erlaubt, ein kleines Beispiel zu schreiben. Wie von Jojo vorgeschlagen, wird mit der SCREEN-Funktion überprüft, ob die gewünschte, neue Position frei ist und nur dann die Spielfigur bewegt. Da das ganze Spielfeld von einer "Mauer" umgeben ist, muss auch nicht geprüft werden, ob man den Bildschirmbereich verlässt.
Code: | SCREEN 0
WIDTH 40
CLS
COLOR 7, 6 'Spielfeld zeichnen
FOR s = 1 TO 10
LOCATE 1, s
PRINT CHR$(176)
LOCATE 10, s
PRINT CHR$(176)
NEXT
FOR z = 2 TO 9
LOCATE z, 1
PRINT CHR$(176)
LOCATE z, 10
PRINT CHR$(176)
NEXT
LOCATE 3, 3
PRINT CHR$(176)
LOCATE 6, 8
PRINT CHR$(176)
COLOR 14, 0 'Figur auf Startposition setzen
zeile = 5
spalte = 5
LOCATE zeile, spalte
PRINT CHR$(1)
DO 'Spielschleife
DO
taste$ = INKEY$
LOOP WHILE taste$ = ""
neuezeile = zeile
neuespalte = spalte
SELECT CASE taste$
CASE CHR$(0) + "K"
neuespalte = spalte - 1
CASE CHR$(0) + "M"
neuespalte = spalte + 1
CASE CHR$(0) + "H"
neuezeile = zeile - 1
CASE CHR$(0) + "P"
neuezeile = zeile + 1
CASE CHR$(27) 'Ende mit Escape
END
END SELECT
IF SCREEN(neuezeile, neuespalte) = 32 THEN 'Testen, ob neue Pos. frei ist
LOCATE zeile, spalte
PRINT " "
spalte = neuespalte
zeile = neuezeile
LOCATE zeile, spalte
PRINT CHR$(1)
END IF
LOOP |
Ein nächster Schritt wäre vielleicht, ein zweites Programm zu schreiben, mit dem man Spielfelder erstellen kann, eine Art Editor also. Das könnte man machen, indem man wie im Spiel einen Cursor mit den Richtungstasten bewegt und mit einer weiteren Taste "Steine" setzen bzw. löschen kann. Oder besondere Felder einbauen, bei denen man Punkte bekommt oder in ein neues Level gebeamt wird etc.
Gruß
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
Seb

Anmeldungsdatum: 29.11.2006 Beiträge: 120 Wohnort: Henfenfeld
|
Verfasst am: 13.02.2008, 15:46 Titel: |
|
|
Cool!!!
Kann man das gleiche auch in SCREEN 12(also Vollbild) machen?
Wie ist der genaue Code für die Mauer und wo ist das Ziel? _________________ MfG
Seb |
|
Nach oben |
|
 |
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 13.02.2008, 16:04 Titel: |
|
|
mit dem Code: | IF SCREEN(neuezeile, neuespalte) = 32 THEN 'Testen, ob neue Pos. frei ist | wird überprüft, ob an der neuen stelle ein leerzeichen ist (also keine mauer). ist dies der fall, wird die figur bewegt, gezeichnet etc
aber achtung: ich hab nen pc, bei dem screen einen unzulässigen funktionsaufruf produziert (so hab ich mal ein snake geschrieben)
in screen 12 geht das so nicht, da die screen funktion ausschließlich im screen 0, also im textmodus funktioniert.
außerdem geht das printen in grafikmodi idR langsamer...
was allerdings machbar wäre (und schöner ), ist, eine kleine grafik hinzuzeichnen
die wanderkennung funktioniert dann entweder per point (point(x,y) liefert den farbcode an der position (x,y) zurück) (unsauber aber einfach) oder mittels einem array (was aber bei ein-pixel-großen wänden rel speicherfressend wird *gg*)
das locate wird nicht mehr benötigt, da die grafikanweisungen immer die koordinaten haben wollen
statt PRINT benutzt du bgrafikanweisungen deiner wahl, vielleicht line(x1,y1)-(x2,y2),farbe,BF für ausgefüllte rechtecke (schwarz=hintergrund löschen, weiß=die spiel"figur")
dann würde ich noch etwas größere schritte für die bewegung verwenden (1pixel ist rel. klein ), und die überprüfung mittels POINT muss am rand der bewegungsrichtung ausgefüht werden, in etwa so:
Code: |
stoppen=0
IF <nach rechts> THEN
FOR i=y1 TO y2 'alle punkte mit den koordinaten (x2,i) überprüfen
IF point(x2,i)=<wandfarbe> THEN stoppen=-1
NEXT
ELSEIF <nach links>
...
ENDIF
|
_________________ MFG
Flo
Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.
zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 13.02.2008, 16:18 Titel: |
|
|
Flo hat Folgendes geschrieben: | in screen 12 geht das so nicht, da die screen funktion ausschließlich im screen 0, also im textmodus funktioniert. |
Humbug... Natürlich geht das auch im Grafikmodus.
Erst Denken / Testen, dann Posten. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 13.02.2008, 23:45 Titel: |
|
|
Hallo
Seb hat Folgendes geschrieben: | Kann man das gleiche auch in SCREEN 12(also Vollbild) machen? |
Du kannst jeden SCREEN-Modus im Vollbild darstellen. Entweder Du schaltest mit Alt + ENTER um, oder stellst es unter Windows so ein, dass das Programm bzw. der QB-Editor direkt im Vollbild gestartet wird. Das machst du über Rechtsklick -> Eigenschaften -> Bildschirm und dort auf Vollbild setzen. In den Grafikbildschirmen, also SCREEN 1 und höher, kannst du die Farben für Vorder- und Hintergrund nicht so schön einstellen, in SCREEN 0 kannst Du sogar blinkende Farben einstellen (Farben 16-31)
Seb hat Folgendes geschrieben: | Wie ist der genaue Code für die Mauer und wo ist das Ziel? |
Wie meinst Du das mit dem Code für die Mauer? Das sind zwei Schleifen, in denen jeweils der linke und rechte bzw. der obere und untere Rand gezeichnet wird. In der Hilfe im QB-Editor findest Du unter Themen eine ASCII-Zeichentabelle. Dort sind die Zahlen angegeben wie die 32 für Leerstelle, 1 für die Spielfigur oder 176 für die Mauer. Es gibt dort eine Menge Zeichen, mit denen Du auch einfache Grafiken basteln kannst für den Anfang.
Ein Ziel gibt es nicht, etwas sollst Du ja auch noch selbst zu tun haben
Du könntest z.B. bestimmte Koordinaten festlegen, dort ein Rotes Feld malen und vor der Prüfung, ob es ein freies Feld ist noch testen, ob das Ziel erreicht wurde. Also irgendwie so:
Code: | IF (neuezeile = zielzeile) AND (neuespalte = zielspalte) THEN
PRINT "ZIEL ERREICHT!"
END
END IF |
Oder du prüfst, ob das Zeichen eine bestimmte Farbe hat. Oder Du nimmst ein spezielles Zeichen als Ziel und testest mit der SCREEN-Funktion nicht nur auf Leerstellen (32) sondern auf dein Ziel-ASCII-Zeichen. Du siehst, es gibt ne Menge Möglichkeiten.
Gruß
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|