  | 
					
						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 | 
	 
	
		WinterStorm
 
  
  Anmeldungsdatum: 14.11.2005 Beiträge: 198 Wohnort: Linz
  | 
		
			
				 Verfasst am: 15.06.2006, 16:11    Titel: Problem mit ASCII Wand | 
				     | 
			 
			
				
  | 
			 
			
				moin,
 
 
also ich habe folgendes problem:
 
 
ich möchte ein spiel proggen,
 
bei dem man mit einem ascii smiley herumlaufen kann.
 
natürlich soll es auch wände geben, in die man nicht hineinlaufen darf.
 
bis jetzt hab ich alles schon, also fast. mein problem ist, dass
 
ich bei einer wand immer nur von einer seite gestoppt werde.
 
achwas, schaut euch einfach mal den code an:
 
 
  	  | Code: | 	 		  
 
CLS
 
SCREEN 9
 
SCREEN 0
 
 
x = 1
 
y = 1
 
 
 
'WAND
 
 
 
  LOCATE 9, 33
 
   COLOR 8, 7
 
    PRINT "²"
 
 
 
'SCHLEIFE
 
DO
 
 
LOCATE x, y
 
 COLOR 14, 0
 
  PRINT CHR$(1)
 
 
DO: t$ = INKEY$: LOOP UNTIL t$ <> ""
 
 
  LOCATE x, y
 
   PRINT " "
 
 
SELECT CASE RIGHT$(t$, 1)
 
  CASE "H": x = x - 1: schri% = schri% - 1
 
  CASE "K": y = y - 1: schri% = schri% - 1
 
  CASE "M": y = y + 1: schri% = schri% - 1
 
  CASE "P": x = x + 1: schri% = schri% - 1
 
  CASE CHR$(27): END
 
END SELECT
 
 
'Bediengungen
 
 
   IF x = 9 AND y = 33 THEN x = 8: y = 33
 
 
'
 
 
LOOP
 
 
 | 	  
 
 
in diesem fall bleibt der smiley nur stehen, wenn ich von oben komme.
 
 
danke schon mal für alle antworten.
 
 
mfg
 
WinterStorm _________________ Me
 
lastfm...
 
  | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Skilltronic
 
  
  Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
  | 
		
			
				 Verfasst am: 15.06.2006, 16:29    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hallo
 
 
Der Fehler ist der, dass du den Smilie immer auf die gleiche x-y-Position zurücksetzt wenn er die Wand berührt, egal aus welcher Richtung er kommt. Übrigens wird bei LOCATE zuerst die Zeile dann die Spalte angegeben, x und y sind bei dir also vertauscht wenn man es genau nimmt. Du musst also prüfen, ob das Zielfeld frei ist bevor du die Spielfigur dorthin verschiebst.
 
 
Mit der SCREEN-Funktion (nicht Anweisung!) kannst du übrigens prüfen welches Zeichen an einer bestimmten Bildschirmposition angezeigt wird. Wenn du das benutzt, brauchst du nicht die Koordinaten aller Wandelement in der Schleife einzeln durchzuprüfen.
 
 
Gruss
 
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		WinterStorm
 
  
  Anmeldungsdatum: 14.11.2005 Beiträge: 198 Wohnort: Linz
  | 
		
			
				 Verfasst am: 15.06.2006, 16:38    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				ok, danke für die antwort.
 
 
dass x und y bei mir vertauscht sind weiß ich, bin allerdings im moment zu 
 
faul um es zu ändern   
 
 
die screen funktion kenne ich leider nicht, da ich noch ziemlicher anfänger bin. ich dachte eigentlich eher an eine leichtere lösung,
 
etwas in der art wie:
 
 
 	  | Code: | 	 		  
 
IF x = 8 AND y = 33 AND INKEY$ = CHR$(0) + "P" THEN x = 9: y = 33
 
 | 	  
 
 
...und dann eben von jeder seite eine bediengung einbauen.
 
allerdings funzt das nicht, kp warum... oder kennt ihr vllt. noch eine andere leichte lösung?
 
 
mfg _________________ Me
 
lastfm...
 
  | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Manuel
 
  
  Anmeldungsdatum: 23.10.2004 Beiträge: 1271 Wohnort: Bayern
  | 
		
			
				 Verfasst am: 15.06.2006, 16:50    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				btw, wenn wir gerade beim Thema sind...
 
 
Ganz ehrlich, aber wenn du auf diese Weise versuchst, ein "etwas" komplexes Spiel zu erstellen, wirst du dir wohl früher oder später die Haare ausraufen    . Stell dir vor, du möchtest sowas wie ein Labyrinth-Spiel machen... Da bräuchtest du eine Menge an IF-Zeilen. Wenn da ein Fehler dabei rauskommt, muss man an den Spruch "wer suchet, der findet" rechnen...   .
 
 
Ich empfehle dir, wenn du ein bisschen komplexere Spiele programmieren willst, dieses Tutorial. Da wird über den Verwendungszweck von sog. "Arrays" gesprochen... wenn du das durchhast, kannst du so ziemlich jedes 2D-Draufsicht-Spiel erstellen   . _________________ DL Walk (Denkspiel) | DL Malek (Denkspiel) | DL Warrior (ASCII-Adventure) | DL Sokodos (Sokoban-Klon)
 
---
 
www.astorek.de.vu | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Michael Frey
 
  
  Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
  | 
		
			
				 Verfasst am: 15.06.2006, 17:04    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				So ist es viel einfacher zum Programmieren:
 
 	  | Code: | 	 		  SCREEN 0
 
CLS
 
 
x = 1
 
y = 1
 
 
 
'WAND
 
 
 
  LOCATE 9, 33
 
   COLOR 8, 7
 
    PRINT "²"
 
 
 
'SCHLEIFE
 
DO
 
 
LOCATE x, y
 
 COLOR 14, 0
 
  PRINT CHR$(1)
 
 
DO: t$ = INKEY$: LOOP UNTIL t$ <> ""
 
 
  LOCATE x, y
 
   PRINT " "
 
 
dx = 0
 
dy = 0
 
SELECT CASE RIGHT$(t$, 1)
 
  CASE "H":
 
        dx = -1
 
        schri% = schri% - 1
 
  CASE "K":
 
        dy = -1
 
        schri% = schri% - 1
 
  CASE "M"
 
        dy = 1
 
        schri% = schri% - 1
 
  CASE "P":
 
        dx = 1
 
        schri% = schri% - 1
 
  CASE CHR$(27): END
 
END SELECT
 
 
'Bediengungen
 
 
   IF SCREEN(x + dx, y + dy) <> ASC("²") THEN
 
        x = x + dx
 
        y = y + dy
 
   END IF
 
 
'
 
 
LOOP | 	 
  _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
 
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
 
Neu mit Syntax Highlight | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Skilltronic
 
  
  Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
  | 
		
			
				 Verfasst am: 15.06.2006, 17:14    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hallo
 
 
Ich habe das Programm mal etwas umgeschrieben. Das mit der SCREEN-Funktion ist ganz einfach. Du gibst die Koordinaten an und erhälst den ASCII-Wert des Zeichens zurück, das dort steht. Der ist 178 für dein Wandsymbol das hier im Forum als ² angezeigt wird, anders als im QB-Editor. Zusätzlich kann man nun nicht mehr aus dem Bildschirm laufen.
 
 
 	  | Code: | 	 		  'WAND
 
 
 
  LOCATE 9, 33
 
   COLOR 8, 7
 
    PRINT "²"
 
 
 
'SCHLEIFE
 
DO
 
 
LOCATE x, y
 
 COLOR 14, 0
 
  PRINT CHR$(1)
 
 
DO: t$ = INKEY$: LOOP UNTIL t$ <> ""
 
 
  LOCATE x, y
 
   PRINT " "
 
   xtest = x
 
   ytest = y
 
 
SELECT CASE RIGHT$(t$, 1)
 
  CASE "H": xtest = x - 1: schri% = schri% - 1
 
  CASE "K": ytest = y - 1: schri% = schri% - 1
 
  CASE "M": ytest = y + 1: schri% = schri% - 1
 
  CASE "P": xtest = x + 1: schri% = schri% - 1
 
  CASE CHR$(27): END
 
END SELECT
 
 
'Bedingungen
 
 
 IF xtest = 0 THEN xtest = 23
 
 IF xtest = 24 THEN xtest = 1
 
 IF ytest = 81 THEN ytest = 1
 
 IF ytest = 0 THEN ytest = 80
 
 
 IF SCREEN(xtest, ytest) <> 178 THEN x = xtest: y = ytest
 
 
LOOP | 	  
 
 
Gruss
 
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		WinterStorm
 
  
  Anmeldungsdatum: 14.11.2005 Beiträge: 198 Wohnort: Linz
  | 
		
			
				 Verfasst am: 15.06.2006, 21:00    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				danke für alle antworten,
 
jetzt funzt's.
 
 
[EDIT]
 
sorry, dass ich nochmal nachfrage, aber wie kann ich ein 2tes
 
"objekt" machen, das die gleichen eigenschaften hat, wie die mauer.
 
also das ich jetzt zb 178 und 177 als mauern habe?
 
[/EDIT]
 
 
mfg
 
WinterStorm _________________ Me
 
lastfm...
 
  | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Michael Frey
 
  
  Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
  | 
		
			
				 Verfasst am: 16.06.2006, 08:28    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				So etwa:
 
 	  | Code: | 	 		  SCREEN 0
 
CLS
 
 
x = 1
 
y = 1
 
 
 
'WAND
 
 
 
  LOCATE 9, 33
 
   COLOR 8, 7
 
    PRINT "²"
 
 
 LOCATE 8, 20
 
   COLOR 8, 7
 
    PRINT CHR$(177)
 
 
 
'SCHLEIFE
 
DO
 
 
LOCATE x, y
 
 COLOR 14, 0
 
  PRINT CHR$(1)
 
 
DO: t$ = INKEY$: LOOP UNTIL t$ <> ""
 
 
  LOCATE x, y
 
   PRINT " "
 
 
dx = 0
 
dy = 0
 
SELECT CASE RIGHT$(t$, 1)
 
  CASE "H":
 
        dx = -1
 
        schri% = schri% - 1
 
  CASE "K":
 
        dy = -1
 
        schri% = schri% - 1
 
  CASE "M"
 
        dy = 1
 
        schri% = schri% - 1
 
  CASE "P":
 
        dx = 1
 
        schri% = schri% - 1
 
  CASE CHR$(27): END
 
END SELECT
 
 
'Bediengungen
 
 
   IF SCREEN(x + dx, y + dy) <> 178 and SCREEN(x + dx, y + dy) <> 177 THEN
 
        x = x + dx
 
        y = y + dy
 
   END IF
 
 
'
 
 
LOOP | 	 
  _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
 
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
 
Neu mit Syntax Highlight | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Skilltronic
 
  
  Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
  | 
		
			
				 Verfasst am: 16.06.2006, 10:55    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hallo
 
 
Du könntest es auch so machen, das er sich grundsätzlich nur auf leere Felder bewegt. Übertragen auf mein Beispiel sähe das so aus:
 
 
 	  | Code: | 	 		  ...
 
IF SCREEN(xtest, ytest) = 32 THEN x = xtest: y = ytest 
 
...
 
 | 	  
 
 
Gruss
 
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		WinterStorm
 
  
  Anmeldungsdatum: 14.11.2005 Beiträge: 198 Wohnort: Linz
  | 
		
			
				 Verfasst am: 16.06.2006, 16:41    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				moin,
 
 
danke für alles,
 
ich denke jetzt hab ich alles was ich im moment
 
benötige, wenn ich was brauch meld ich mich, und wenns
 
fertig is dann könnt ihrs unter projektvorstellungen bewundern^^...
 
 
mfg _________________ Me
 
lastfm...
 
  | 
			 
		  | 
	 
	
		| 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.
  | 
   
 
     |