Advertisement
Guest User

bomberman-game02.bas

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