Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ' bomberman.bas - textbasierter Bomberman Klon in FreeBasic
- #LANG "fb"
- dim Dateiname as string
- dim taste as string = ""
- ' Variablen für die Positionsangabe des Spielers
- '
- dim as integer x = 0
- dim as integer y = 0
- ' Wird nur verwendet zur Abfrage zum beenden des Spiels
- dim as boolean ende = FALSE
- 'Variablen für die alte Positionsangabe des Spielers
- '
- dim as integer x_alt = 0
- dim as integer y_alt = 0
- ' Konstanten für Objekte im Spiel und weiteres
- '
- const as string FREI = " "
- const as string FIGUR = "o"
- const as string WAND = "#"
- const as string BOMBE = "*"
- const as string FIGUR_TOD = "@"
- const as string FIGUR_LEGT_BOMBE = "O"
- const as integer MAX_BOMBEN = 3
- ' Positionsangabe für die Startpostion des Spielers
- '
- dim as integer start_x = 0
- dim as integer start_y = 0
- ' Typ für Verwalten der Zündung der Bomben
- '
- type Explosion
- as integer pos_x
- as integer pos_y
- as double start_zeit
- as double abwarte_zeit
- end type
- ' Array für das plazieren der einzelnen Bomben
- dim bomben(0 to MAX_BOMBEN-1) as Explosion
- declare sub zeigeWelt(welt() as string)
- declare function canMove(welt() as String, x as integer, y as integer) as boolean
- declare function bewegeSpieler(welt() as string, x as integer, y as integer, alt_x as integer, alt_y as integer) as boolean
- declare sub spielende()
- declare sub abwarten(wartezeit as double)
- declare function ladeKarte(datei as string, welt() as string, byref start_x as integer, byref start_y as integer) as boolean
- ' Karte die geladen werden soll eingeben
- Dateiname = "karte01.txt"
- ' Array für das Spielfeld
- dim welt(any, any) as string
- ' Wenn die Karte nicht geladen werden konnte Programm beenden
- '
- if not ladeKarte(Dateiname, welt(), start_x, start_y) then
- print !"\34!!!FEHLER!!! beim laden der Datei\34"
- end
- end if
- color 3, 0 ' Spiel in einen schönen blau darstellen :-)
- cls
- zeigeWelt(welt())
- ' Spieler auf aktuelle Position in der Welt setzen
- y = start_y
- x = start_x
- ' Bombenpositionen mit einen Wert belegen damit keine Fehler auftreten
- '
- for i as integer = lbound(bomben) to ubound(bomben)
- bomben(i).pos_x = -1
- bomben(i).pos_y = -1
- next
- ' Cursor unsichtbar machen
- locate , , 0
- ' Hauptschleife
- do
- taste = INKEY
- ' Tastatur abfragen und Spieler bewegen
- select case taste
- case "w"
- if bewegeSpieler(welt(), x, y-1, x, y) then
- y = y - 1
- end if
- zeigeWelt(welt())
- case "s"
- if bewegeSpieler(welt(), x, y+1, x, y) then
- y = y + 1
- end if
- zeigeWelt(welt())
- case "a"
- if bewegeSpieler(welt(), x-1, y, x, y) then
- x = x - 1
- end if
- zeigeWelt(welt())
- case "d"
- if bewegeSpieler(welt(), x+1, y, x, y) then
- x = x + 1
- end if
- zeigeWelt(welt())
- case chr(32) ' Bombe legen mit der Leertaste
- ' Wenn sich auf der aktuellen Spielerposition keine Bombe befindet dann Bombe legen
- '
- if welt(y, x) <> BOMBE then
- ' von jeder Bombe Informationen abfragen
- '
- for i as integer = lbound(bomben) to ubound(bomben)
- '
- ' Wenn die Bombe noch nicht gelegt worden ist dann Bombe legen
- if bomben(i).pos_x = -1 andalso bomben(i).pos_y = -1 then
- welt(y, x) = FIGUR_LEGT_BOMBE ' Spieler legt die Bombe
- zeigeWelt(welt())
- ' alte Postion von Spieler speichern um festzustellen
- ' ob der Spieler sich noch an der Bombe befindet
- '
- x_alt = x
- y_alt = y
- welt(y, x) = BOMBE ' Bombe legen
- ' aktuelle Informationen über Bombe zwischen speichern für spätere Abfragen
- '
- bomben(i).pos_x = x
- bomben(i).pos_y = y
- bomben(i).start_zeit = timer
- bomben(i).abwarte_zeit = 3.0
- exit for ' Aktion abbrechen damit nur die aktuelle Bombe gelegt wird
- end if
- next
- end if
- case chr(27)
- ' Bei Esc-Taste Spiel beenden
- '
- ende = TRUE
- end select
- ' Abfragen ab welchen Zeitpunkt eine Bombe hochgehen soll und was dann zu tun ist
- '
- ' von jeder Bombe Informationen abfragen
- '
- for i as integer = lbound(bomben) to ubound(bomben)
- if bomben(i).pos_x >= 0 andalso bomben(i).pos_y >= 0 then
- ' Wenn der Countdown abgelaufen ist soll die Bombe hochgehen
- '
- if timer > (bomben(i).start_zeit + bomben(i).abwarte_zeit) then
- ' Wenn der Spieler sich noch auf der Bombe befindet ist das Spiel vorbei
- '
- if (welt(y, x) = BOMBE) and (x_alt = x) and (y_alt = y) then
- welt(y_alt, x_alt) = FIGUR_TOD
- ' welt(bomben(i).pos_y, bomben(i).pos_x) = FIGUR_TOD
- zeigeWelt(welt())
- ende = TRUE ' Spielbeenden
- else
- ' Wenn sich der Spieler nicht auf der Bombe befindet
- ' soll die Bombe gelöscht werden
- '
- welt(bomben(i).pos_y, bomben(i).pos_x) = FREI
- bomben(i).pos_x = -1
- bomben(i).pos_y = -1
- zeigeWelt(welt())
- end if
- end if
- end if
- next
- sleep 1
- loop until ende = TRUE ' Solange durchlaufen bis das Spiel beendet wird
- ' Spielende
- spielende()
- end
- ' Soll einfach nur die Welt auf dem Bildschirm ausgeben
- ' jede Bewegung und Aktion wird damit aktuellisiert
- '
- sub zeigeWelt(welt() as string)
- dim as integer j, k
- ' Bildschirm Position zurücksetzen
- locate 1, 1
- for j = lbound(welt, 1) to ubound(welt, 1)
- for k = lbound(welt, 2) to ubound(welt, 2)
- print welt(j, k);
- next
- print
- next
- end sub
- ' Funktion zum bewegen des Spielers soll feststellen ob der Spieler an eine Wand trifft
- '
- function canMove(welt() as String, x as integer, y as integer) as boolean
- if y < lbound(welt,1) or y > ubound(welt, 1) then return false
- if x < lbound(welt,2) or x > ubound(welt, 2) then return false
- if welt(y, x) = WAND then return false
- if welt(y, y) = BOMBE then return false
- return true
- end function
- ' Soll den Spieler bewegen und Eingaben überprüfen ob Sie gültig sind
- ' und abfragen ob man gegen ein Objekt läuft usw
- '
- function bewegeSpieler(welt() as string, x as integer, y as integer, alt_x as integer, alt_y as integer) as boolean
- if not canMove(welt(), x, y) then return false
- if (welt(y, x) = FREI) or (welt(y, x) = FIGUR) then
- welt(y, x) = FIGUR ' Spieler platzieren
- ' alte Spieler Position löschen, wenn keine Bombe gelegt wurde
- if welt(alt_y, alt_x) <> BOMBE then welt(alt_y, alt_x) = FREI
- return true
- end if
- return false
- end function
- ' Soll einfach einige Dinge erledigen nach dem das Spiel vorbei ist
- '
- sub spielende()
- abwarten(1.0)
- cls
- print "Danke fürs spielen :-)"
- end sub
- ' wartet eine übergebene Wartezeit in Sekunden ab
- '
- sub abwarten(wartezeit as double)
- dim as double zeit = 0.0
- zeit = timer
- do
- loop until timer > zeit + wartezeit
- end sub
- ' Diese Funktion ladet binär eine Textdatei und speichert Sie in ein Array das später für das Spielfeld verwendet werden soll
- '
- function ladeKarte(Dateiname as string, welt() as string, byref start_x as integer, byref start_y as integer) as boolean
- dim daten as string
- dim as integer zeilen, spalten
- ' Welt laden
- dim DateiNr as integer = FreeFile
- if open(Dateiname for binary as #DateiNr) = 0 then
- daten = space(lof(DateiNr)) ' Dateigröße ermitteln
- ' und mit Leerzeichen füllen
- get #DateiNr, , daten ' aktuelles Zeichen in daten speichern
- close #DateiNr
- else
- return false
- end if
- ' Weltgröße ermitteln
- '
- spalten = instr(daten, any !"\r\n")-1
- zeilen = len(daten) \ (spalten + iif(daten[spalten] = asc("\r"), 2, 1))
- ' Karte laden und in Array speichern
- redim welt(0 TO zeilen-1, 0 TO spalten-1) as string
- dim as integer x, y
- for i as integer = 0 to len(daten)-1
- if daten[i] = 10 then
- y += 1
- x = 0
- continue for
- end if
- if daten[i] = 13 then continue for
- welt(y, x) = chr(daten[i])
- ' Aktuelle Spieler Position feststellen
- if welt(y, x) = figur then
- start_x = x
- start_y = y
- end if
- x += 1
- next
- return true
- end function
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement