Advertisement
Guest User

bomberman-game.bas

a guest
Feb 26th, 2017
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ' bomberman.bas - textbasierter Bomberman Klon in FreeBasic
  2. #LANG "fb"
  3.  
  4. dim Dateiname as string
  5. dim taste as string = ""
  6.  
  7. ' Variablen für die Positionsangabe des Spielers
  8. '
  9. dim as integer x = 0
  10. dim as integer y = 0
  11.  
  12. ' Wird nur verwendet zur Abfrage zum beenden des Spiels
  13. dim as boolean ende = FALSE
  14.  
  15. 'Variablen für die alte Positionsangabe des Spielers
  16. '
  17. dim as integer x_alt = 0
  18. dim as integer y_alt = 0
  19.  
  20. ' Konstanten für Objekte im Spiel und weiteres
  21. '
  22. const as string FREI = " "
  23. const as string FIGUR = "o"
  24. const as string WAND = "#"
  25. const as string BOMBE = "*"
  26. const as string FIGUR_TOD = "@"
  27. const as string FIGUR_LEGT_BOMBE = "O"
  28. const as integer MAX_BOMBEN = 3
  29.  
  30. ' Positionsangabe für die Startpostion des Spielers
  31. '
  32. dim as integer start_x = 0
  33. dim as integer start_y = 0
  34.  
  35. ' Typ für Verwalten der Zündung der Bomben
  36. '
  37. type Explosion
  38.     as integer pos_x
  39.     as integer pos_y
  40.     as double start_zeit
  41.     as double abwarte_zeit
  42. end type
  43.  
  44. ' Array für das plazieren der einzelnen Bomben
  45. dim bomben(0 to MAX_BOMBEN-1) as Explosion
  46.  
  47. declare sub zeigeWelt(welt() as string)
  48. declare function canMove(welt() as String, x as integer, y as integer) as boolean
  49. declare function bewegeSpieler(welt() as string, x as integer, y as integer, alt_x as integer, alt_y as integer) as boolean
  50. declare sub spielende()
  51. declare sub abwarten(wartezeit as double)
  52. declare function ladeKarte(datei as string, welt() as string, byref start_x as integer, byref start_y as integer) as boolean
  53.  
  54. ' Karte die geladen werden soll eingeben
  55. Dateiname = "karte01.txt"
  56.  
  57. ' Array für das Spielfeld
  58. dim welt(any, any) as string
  59.  
  60. ' Wenn die Karte nicht geladen werden konnte Programm beenden
  61. '
  62. if not ladeKarte(Dateiname, welt(), start_x, start_y) then
  63.     print !"\34!!!FEHLER!!! beim laden der Datei\34"
  64.     end
  65. end if
  66.  
  67.  
  68. color 3, 0 ' Spiel in einen schönen blau darstellen :-)
  69. cls
  70. zeigeWelt(welt())
  71.  
  72. ' Spieler auf aktuelle Position in der Welt setzen
  73. y = start_y
  74. x = start_x
  75.  
  76. ' Bombenpositionen mit einen Wert belegen damit keine Fehler auftreten
  77. '
  78. for i as integer = lbound(bomben) to ubound(bomben)
  79.     bomben(i).pos_x = -1
  80.     bomben(i).pos_y = -1
  81. next
  82.  
  83. ' Cursor unsichtbar machen
  84. locate , , 0
  85.  
  86. ' Hauptschleife
  87. do
  88.     taste = INKEY
  89.  
  90.     ' Tastatur abfragen und Spieler bewegen
  91.     select case taste
  92.         case "w"
  93.             if bewegeSpieler(welt(), x, y-1, x, y) then
  94.                 y = y - 1
  95.             end if
  96.             zeigeWelt(welt())
  97.  
  98.         case "s"
  99.             if bewegeSpieler(welt(), x, y+1, x, y) then
  100.                 y = y + 1
  101.             end if
  102.             zeigeWelt(welt())
  103.  
  104.         case "a"
  105.             if bewegeSpieler(welt(), x-1, y, x, y) then
  106.                 x = x - 1
  107.             end if
  108.             zeigeWelt(welt())
  109.  
  110.         case "d"
  111.             if bewegeSpieler(welt(), x+1, y, x, y) then
  112.                 x = x + 1
  113.             end if
  114.             zeigeWelt(welt())
  115.  
  116.         case chr(32) ' Bombe legen mit der Leertaste
  117.             ' Wenn sich auf der aktuellen Spielerposition keine Bombe befindet dann Bombe legen
  118.             '
  119.             if welt(y, x) <> BOMBE then
  120.                 ' von jeder  Bombe Informationen abfragen
  121.                 '
  122.                 for i as integer = lbound(bomben) to ubound(bomben)
  123.                     '
  124.                     ' Wenn die Bombe noch nicht gelegt worden ist dann Bombe legen
  125.                     if bomben(i).pos_x = -1 andalso bomben(i).pos_y = -1 then
  126.                    
  127.                         welt(y, x) = FIGUR_LEGT_BOMBE ' Spieler legt die Bombe
  128.                         zeigeWelt(welt())
  129.        
  130.                         ' alte Postion von Spieler speichern um festzustellen
  131.                         ' ob der Spieler sich noch an der Bombe befindet
  132.                         '
  133.                         x_alt = x
  134.                         y_alt = y
  135.        
  136.                         welt(y, x) = BOMBE ' Bombe legen               
  137.            
  138.                         ' aktuelle Informationen über Bombe zwischen speichern für spätere Abfragen
  139.                         '
  140.                         bomben(i).pos_x = x
  141.                         bomben(i).pos_y = y
  142.                         bomben(i).start_zeit = timer
  143.                         bomben(i).abwarte_zeit = 3.0
  144.  
  145.                         exit for ' Aktion abbrechen damit nur die aktuelle Bombe gelegt wird
  146.                     end if
  147.                 next
  148.             end if
  149.  
  150.         case chr(27)
  151.             ' Bei Esc-Taste Spiel beenden
  152.             '
  153.             ende = TRUE
  154.     end select
  155.  
  156.     ' Abfragen ab welchen Zeitpunkt eine Bombe hochgehen soll und was dann zu tun ist
  157.     '
  158.     ' von jeder Bombe Informationen abfragen
  159.     '
  160.     for i as integer = lbound(bomben) to ubound(bomben)
  161.  
  162.         if bomben(i).pos_x >= 0 andalso bomben(i).pos_y >= 0 then
  163.             ' Wenn der Countdown abgelaufen ist soll die Bombe hochgehen
  164.             '
  165.             if timer > (bomben(i).start_zeit + bomben(i).abwarte_zeit) then
  166.                 ' Wenn der Spieler sich noch auf der Bombe befindet ist das Spiel vorbei
  167.                 '
  168.                 if (welt(y, x) = BOMBE) and (x_alt = x) and (y_alt = y) then
  169.                     welt(y_alt, x_alt) = FIGUR_TOD
  170.                     ' welt(bomben(i).pos_y, bomben(i).pos_x) = FIGUR_TOD
  171.                     zeigeWelt(welt())
  172.                     ende = TRUE ' Spielbeenden
  173.                 else
  174.                     ' Wenn sich der Spieler nicht auf der Bombe befindet
  175.                     ' soll die Bombe gelöscht werden
  176.                     '
  177.                     welt(bomben(i).pos_y, bomben(i).pos_x) = FREI
  178.                     bomben(i).pos_x = -1
  179.                     bomben(i).pos_y = -1
  180.                     zeigeWelt(welt())
  181.                 end if
  182.             end if
  183.         end if
  184.     next
  185.  
  186.     sleep 1
  187. loop until ende = TRUE ' Solange durchlaufen bis das Spiel beendet wird
  188.  
  189. ' Spielende
  190. spielende()
  191. end
  192.  
  193. ' Soll einfach nur die Welt auf dem Bildschirm ausgeben
  194. ' jede Bewegung und Aktion wird damit aktuellisiert
  195. '
  196. sub zeigeWelt(welt() as string)
  197.     dim as integer j, k
  198.  
  199.     ' Bildschirm Position zurücksetzen
  200.     locate 1, 1
  201.  
  202.     for j = lbound(welt, 1) to ubound(welt, 1)
  203.         for k = lbound(welt, 2) to ubound(welt, 2)
  204.             print welt(j, k);
  205.         next
  206.         print
  207.     next
  208. end sub
  209.  
  210. ' Funktion zum bewegen des Spielers soll feststellen ob der Spieler an eine Wand trifft
  211. '
  212. function canMove(welt() as String, x as integer, y as integer) as boolean
  213.     if y < lbound(welt,1) or y > ubound(welt, 1) then return false
  214.     if x < lbound(welt,2) or x > ubound(welt, 2) then return false
  215.  
  216.     if welt(y, x) = WAND then return false
  217.     if welt(y, y) = BOMBE then return false
  218.  
  219.     return true
  220. end function
  221.  
  222.  
  223.  
  224. ' Soll den Spieler bewegen und Eingaben überprüfen ob Sie gültig sind
  225. ' und abfragen ob man gegen ein Objekt läuft usw
  226. '
  227. function bewegeSpieler(welt() as string, x as integer, y as integer, alt_x as integer, alt_y as integer) as boolean
  228.  
  229.     if not canMove(welt(), x, y) then return false
  230.  
  231.     if (welt(y, x) = FREI) or (welt(y, x) = FIGUR) then
  232.         welt(y, x) = FIGUR ' Spieler platzieren
  233.  
  234.         ' alte Spieler Position löschen, wenn keine Bombe gelegt wurde
  235.         if welt(alt_y, alt_x) <> BOMBE then welt(alt_y, alt_x) = FREI
  236.  
  237.         return true
  238.     end if
  239.    
  240.     return false
  241. end function
  242.  
  243. ' Soll einfach einige Dinge erledigen nach dem das Spiel vorbei ist
  244. '
  245. sub spielende()
  246.     abwarten(1.0)
  247.     cls
  248.     print "Danke fürs spielen :-)"
  249. end sub
  250.  
  251. ' wartet eine übergebene Wartezeit in Sekunden ab
  252. '
  253. sub abwarten(wartezeit as double)
  254.     dim as double zeit = 0.0
  255.  
  256.     zeit = timer
  257.  
  258.     do
  259.     loop until timer > zeit + wartezeit
  260. end sub
  261.  
  262. ' Diese Funktion ladet binär eine Textdatei und speichert Sie in ein Array das später für das Spielfeld verwendet werden soll
  263. '
  264. function ladeKarte(Dateiname as string, welt() as string, byref start_x as integer, byref start_y as integer) as boolean
  265.     dim daten as string
  266.     dim as integer zeilen, spalten
  267.    
  268.     ' Welt laden
  269.     dim DateiNr as integer = FreeFile
  270.     if open(Dateiname for binary as #DateiNr) = 0 then
  271.    
  272.         daten = space(lof(DateiNr)) ' Dateigröße ermitteln
  273.                         ' und mit Leerzeichen füllen
  274.    
  275.         get #DateiNr, , daten ' aktuelles Zeichen in daten speichern
  276.    
  277.         close #DateiNr
  278.     else
  279.         return false
  280.     end if
  281.    
  282.     ' Weltgröße ermitteln
  283.     '
  284.     spalten = instr(daten, any !"\r\n")-1
  285.     zeilen = len(daten) \ (spalten + iif(daten[spalten] = asc("\r"), 2, 1))
  286.    
  287.     ' Karte laden und in Array speichern
  288.     redim welt(0 TO zeilen-1, 0 TO spalten-1) as string
  289.    
  290.     dim as integer x, y
  291.  
  292.     for i as integer = 0 to len(daten)-1
  293.         if daten[i] = 10 then
  294.             y += 1
  295.             x = 0
  296.             continue for
  297.         end if
  298.         if daten[i] = 13 then continue for
  299.        
  300.         welt(y, x) = chr(daten[i])
  301.        
  302.         ' Aktuelle Spieler Position feststellen
  303.         if welt(y, x) = figur then
  304.             start_x = x
  305.             start_y = y
  306.         end if
  307.        
  308.         x += 1
  309.     next
  310.    
  311.     return true
  312. end function
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement