  | 
					
						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 | 
	 
	
		General
 
 
  Anmeldungsdatum: 26.11.2006 Beiträge: 149
 
  | 
		
			
				 Verfasst am: 10.01.2007, 20:31    Titel: Frage zu meinem Programm | 
				     | 
			 
			
				
  | 
			 
			
				also hallo nochma
 
 	  | Code: | 	 		  
 
screen 12
 
x=10
 
y=10
 
Move=0
 
DO
 
 
 a$ = INKEY$
 
 SLEEP 5
 
 
IF MULTIKEY(&h48) THEN Move = 4 ' High
 
IF MULTIKEY(&h4D) THEN Move = 3 ' Right
 
IF MULTIKEY(&h50) THEN Move = 1 ' Down
 
IF MULTIKEY(&h4B) THEN Move = 2 ' Left
 
    locate x,y
 
      print"." 
 
       if Move=4 then
 
            locate x,y
 
            ?"  "
 
            locate x-1,y
 
            ?"."
 
        end if
 
        if Move=3 then
 
            locate x,y
 
            ?"  "
 
            locate x,y+1
 
            ?"."
 
        end if
 
LOOP UNTIL a$ = CHR$(27)
 
 | 	  
 
also das programm soll einfach nur das "."(püncktchen) über den bildschirm laufen lassen, jenachdem was für eine pfeiltase hedrückt wurde, aber ich muss dsa so machen, und irgendwie müsste ich im de programm zählen wie oft die die jeweiligen tasten gedrückt wurden,nur das bekomme ich net so hin. zum zweiten problem wollte ich fragen, wie ich es machen kann, das der punkt dann auf der neuen position weiter"läuft" vielei könnt ihr mir helfen.??? | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Eastler_dart
 
  
  Anmeldungsdatum: 24.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
  | 
		
			
				 Verfasst am: 10.01.2007, 21:19    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hab mal n bisserl rumprobiert
 
Folgender Code würde das tun, was du erklärt hattest:
 
 	  | Code: | 	 		  screen 12
 
 
DIM Move AS INTEGER
 
DIM A$
 
 
DECLARE SUB TuEs(Bewegung AS INTEGER)
 
 
Move=0
 
 
 
DO
 
 a$ = INKEY$
 
 SLEEP 50
 
  IF MULTIKEY(&h48) THEN CALL TuEs(4)
 
  IF MULTIKEY(&h4D) THEN CALL TuEs(3)
 
  IF MULTIKEY(&h50) THEN CALL TuEs(1)
 
  IF MULTIKEY(&h4B) THEN CALL TuEs(2)
 
LOOP UNTIL a$ = CHR$(27)
 
 
 
SUB TuEs(Bewegung AS INTEGER)
 
  STATIC X AS INTEGER, Y AS INTEGER, PktX AS INTEGER, PktY AS INTEGER
 
  STATIC MaxLinks AS INTEGER,MaxRechts AS INTEGER
 
  STATIC MaxOben AS INTEGER, MaxUnten AS INTEGER
 
 
  'Hier die Begrenzungen, wie weit der Punkt jeweils wandern darf
 
  MaxLinks=1 : MaxRechts=60
 
  MaxOben=1  : MaxUnten=24
 
 
  SELECT CASE Bewegung
 
    CASE 4
 
       'Hoch
 
       IF Y > MaxOben THEN
 
          PktY=Y-1
 
          ELSE
 
          PktY=MaxOben
 
       END IF
 
    CASE 3
 
       'Rechts
 
       IF X < MaxRechts THEN
 
          PktX=X+1
 
          ELSE
 
          PktX=MaxRechts
 
       END IF
 
    CASE 1
 
       'runter
 
       IF Y < MaxUnten THEN
 
          PktY=Y+1
 
          ELSE
 
          PktY=MaxUnten
 
       END IF
 
    CASE 2
 
       'links
 
       IF X > MaxLinks THEN
 
          PktX=X-1
 
          ELSE
 
          PktX=MaxLinks
 
       END IF
 
  END SELECT
 
  'Punkt Löschen
 
  LOCATE Y,X
 
  PRINT " ";
 
  'neuer Punkt setzen
 
  LOCATE PktY, PktX
 
  PRINT ".";
 
  X = PktX
 
  Y = PktY
 
END SUB
 
 | 	  
 
Hoffe, das Listing ist noch einfach genug, um es zu verstehen
 
Mit den Max-Variablen begrenze ich das Feld, in dem der Punkt wandern darf, also links, oben, rechts und unten, keinesfalls aus dem Bildschirm raus.
 
Eigentlich sollten diese Werte aus dem Screen-Befehl errechnet werden, damit du ggf. eine größere Auflösung einstellen kannst, ohne die Max-Werte anzupassen
 
 
Eastler _________________ Kaum macht mans richtig, schon geht's | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		WinterStorm
 
  
  Anmeldungsdatum: 14.11.2005 Beiträge: 198 Wohnort: Linz
  | 
		
			
				 Verfasst am: 14.01.2007, 02:31    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				hm, also so ne ähnliche frage hatte ich auch mal gestellt und ne tolle
 
antwort bekommen, thx nebenbei   
 
aber wenn du ein ascii-spiel machen möchtest, wäre
 
folgende lösung vielleicht besser:
 
 
 	  | Code: | 	 		  
 
cls
 
screen 12
 
 
x = 2
 
y = 2
 
 
do
 
    
 
    locate x, y
 
     color 15, 0
 
      ? "."
 
 
    do: t$ = inkey$: loop until t$ <> ""
 
     locate x, y
 
      ? " "
 
 
select case right$(t$, 1)
 
    case "H": x = x - 1
 
    case "K": y = y - 1
 
    case "M": y = y + 1
 
    case "P": x = x + 1
 
    case chr$(27): end
 
end select
 
 
    if x < 1 then x = 1
 
    if y < 1 then y = 1
 
    if y > 79 then y = 79
 
    if x > 29 then x = 29
 
 
loop 
 
 | 	  
 
 
[EDIT:]
 
 
jetzt hat mich auch mal wieder die lust gepackt, ein ascii adventure zu schreiben, und diesmal etwas ordentlicher.
 
natürlich bin ich sofort auf mein erstes problem gestoßen.
 
ich wollte die karte in eine datei: "map.txt" speichern.
 
es soll auf der karte ein rand sein mit: chr$(218), chr$(196), chr$(191), chr$(192), chr$(179), chr$(217) und dann die karte mit einigen bäumen chr$(006) und einigen anderen ascii zeichen.
 
aber ich kann die datei so leider nicht einlesen, weil sie im unicode abgespeichert werden muss um alles korrekt anzuzeigen.
 
nebenbei: ich hab noch nie eine karte in eine externe datei gespeichert, ich hoffe ihr könnt mir helfen. THX
 
 
mfg _________________ Me
 
lastfm...
 
  | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		General
 
 
  Anmeldungsdatum: 26.11.2006 Beiträge: 149
 
  | 
		
			
				 Verfasst am: 14.01.2007, 10:00    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				| ja das is au gut, nur ich habe das gefühl in deinem code, wird nicht realisiert was passiert wenn man zwei pfeiltasten drückt, was bei dem obrigen finde ich besser gemacht wurde, aber ich finde beide ideen gut, besonders deine weil die um einiges kürzer is, aber halt nicht 2 drücke abpasst | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Michael712 aka anfänger, programmierer
 
  Anmeldungsdatum: 26.03.2005 Beiträge: 1593
 
  | 
		
			
				 Verfasst am: 14.01.2007, 12:31    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Da FreeBASIC seit einiger Zeit auch OOP eingebaut hat, kann man sich das ganze einfacher machen  
 
 
 	  | Code: | 	 		  Namespace text_adventure
 
    Type punkttype
 
        Private:
 
            x_ As Integer
 
            y_ As Integer
 
            col_ As Integer
 
            mx As Integer
 
            my As Integer
 
        Public:
 
            Declare Constructor(tmp_x As Integer, tmp_y As Integer, max_x As Integer, max_y As Integer, tmp_col As Integer)
 
                        
 
            Declare Property x As Integer
 
            Declare Property x(neu As Integer)
 
            
 
            Declare Property y As Integer
 
            Declare Property y(neu As Integer)
 
            
 
            Declare Property col As Integer
 
            Declare Property col(neu As Integer)
 
            
 
            Declare Sub Draw
 
            Declare Sub Clear
 
    End Type
 
    
 
    Constructor punkttype(tmp_x As Integer, tmp_y As Integer, max_x As Integer, max_y As Integer, tmp_col As Integer)
 
        x_ = tmp_x
 
        y_ = tmp_y
 
        col_ = tmp_col
 
        mx = max_x
 
        my = max_y
 
        Cls
 
        draw
 
    End Constructor
 
    
 
    Property punkttype.x As Integer
 
        Return x_
 
    End Property
 
    
 
    Property punkttype.x(neu As Integer)
 
        clear
 
        x_ = iif(neu<=mx, iif(neu>0, neu, 1), mx)
 
        draw
 
    End Property
 
    
 
    Property punkttype.y As Integer
 
        Return y_
 
    End Property
 
    
 
    Property punkttype.y(neu As Integer)
 
        clear
 
        y_ = iif(neu<=my, iif(neu>0, neu, 1), my)
 
        draw
 
    End Property
 
    
 
    Property punkttype.col As Integer
 
        Return col_
 
    End Property
 
    
 
    Property punkttype.col(neu As Integer)
 
        col_ = neu
 
        draw
 
    End Property
 
    
 
    Sub punkttype.clear
 
        Locate y,x: Print " ";
 
    End Sub
 
    
 
    Sub punkttype.draw
 
        Locate y,x: Print ".";
 
    End Sub
 
End Namespace
 
    
 
Dim punkt As text_adventure.punkttype = text_adventure.punkttype(10,10, 80, 24, 6)
 
 
Do
 
    With punkt
 
        If Multikey(&h50) Then .y = .y+1
 
        If Multikey(&h48) Then .y = .y-1
 
        If Multikey(&h4D) Then .x = .x+1
 
        If Multikey(&h4B) Then .x = .x-1
 
    End With
 
    Sleep 50, 1
 
Loop | 	  
 
 
Verschafft Überblick in einem großen Projekt, sieht man ja an der kurzen Do:Loop schleife   _________________
  	  | Code: | 	 		  | #include "signatur.bi" | 	 
  | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Mao
 
 
  Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
  | 
		
			
				 Verfasst am: 14.01.2007, 12:36    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				OOP in einer Sprache wie BASIC macht irgendwie Angst.     _________________ Eine handvoll Glück reicht nie für zwei.
 
--
 
  | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Michael712 aka anfänger, programmierer
 
  Anmeldungsdatum: 26.03.2005 Beiträge: 1593
 
  | 
		
			
				 Verfasst am: 14.01.2007, 13:05    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Wieso?
 
 
Also bei kleinen Sachen bringt das nichts, aber wenn man ein größeres Programm hat, dann ist das genial   _________________
  	  | Code: | 	 		  | #include "signatur.bi" | 	 
  | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Mao
 
 
  Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
  | 
		
			
				 Verfasst am: 14.01.2007, 13:13    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Weiß net.  
 
Bin im BASIC-Style halt einfach keine OOP gewöhnt. Zudem erscheint mir das hier ein bisschen komplizierter als wie in Delphi oder C++.   _________________ Eine handvoll Glück reicht nie für zwei.
 
--
 
  | 
			 
		  | 
	 
	
		| 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.
  | 
   
 
     |