Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Sodoku-Labyrinth-Dingenskirchen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
mkfezzo



Anmeldungsdatum: 16.08.2007
Beiträge: 25

BeitragVerfasst am: 18.11.2010, 10:07    Titel: Sodoku-Labyrinth-Dingenskirchen Antworten mit Zitat

Hallo zusammen!

Habe mal nen Projekt -zumindest in der Rohfassung- fertiggestellt. Ihr kennt das sicher, man fängt viele Sachen an und am Ende werden vielleicht 10% wirklich bis zur Rohversion fertig und davon 0.1% dann echt fertiggestellt zwinkern

Das ganze ist eine Sokoban (Kistenschieben) - Pacman (Gegner) - Labyrinth (Weg finden) - Mischung. Kurze Erklärung: Ziel ist es, ein Level von links nach rechts zu durchwandern, indem man z.B. Wände verschiebt und den Ausgang zu erreichen. Dies geht erst, wenn alle Gegner durch Kistenverschieben "übberrollt" wurden. Dann kommt ein neues Level. Dabei gibts ein paar Varianten: Wände wachsen, Wände wandern, mehr Gegner, Levelgröße ändert sich etc.
Bewegen könnt ihr mit den Ziffernblocktasten 4,6,8,2 (erstmal). Achtung: Grafik ist erstmal mehr ASCII als sonstwas - werde ich aber noch ändern.
Warum poste ich das Zeug hier?
Ich möchte mal Eure Meinung hören, was man da noch einbauen könnte (mir fehlt leider etwas um die Spielmotivation zu steigern, weiss aber nicht so recht WAS). Lohnt sich das, da weiterzumachen? Lasst mal was hören.
Code:

RANDOMIZE TIMER
SCREEN 19,32,,

DIM AS INTEGER x,y,z,t,wmax,xmax,mov,x1,y1,level,levelup,walln,wallm,opp
DIM AS INTEGER p0,p1,p2,p3,p4,done,p5,p6,p7,p8,zz,death
DIM AS SINGLE test,ymax
DIM AS STRING a,nwall,mwall,exxit
xmax=30
ymax=15
'wmax=(xmax*ymax)/10
level=1


start:
COLOR RGB(100,100,100),RGB(50,50,50)
CLS
levelup=0
SELECT CASE level
CASE 1
    xmax=30
    ymax=11
    nwall="off"
    walln=0
    mwall="off"
    wallm=0
    opp=1
CASE 2
    xmax=40
    ymax=15
    nwall="off"
    walln=0
    mwall="off"
    wallm=0
    opp=2
CASE 3
    xmax=50
    ymax=15
    nwall="off"
    walln=5
    mwall="on"
    wallm=1
    opp=3
CASE 4
    xmax=60
    ymax=29
    nwall="off"
    walln=5
    mwall="on"
    wallm=2
    opp=4
CASE 5
    xmax=99
    ymax=19
    nwall="on"
    walln=5
    mwall="on"
    wallm=3
    opp=6
CASE 6
    xmax=99
    ymax=29
    nwall="on"
    walln=5
    mwall="on"
    wallm=4
    opp=8
CASE 7
    xmax=99
    ymax=15
    nwall="on"
    walln=4
    mwall="on"
    wallm=4
    opp=10
CASE 8
    xmax=20
    ymax=29
    nwall="on"
    walln=3
    mwall="on"
    wallm=5
    opp=12
CASE 9
    xmax=99
    ymax=9
    nwall="on"
    walln=2
    mwall="on"
    wallm=8
    opp=14
CASE 10
    xmax=50
    ymax=9
    nwall="on"
    walln=1
    mwall="on"
    wallm=10
    opp=16
CASE IS >10
    xmax=INT(RND(1)*90)+10
 
    DO                          'ungerade ymax sicherstellen
        ymax=INT(RND(1)*20)+10
        test=ymax/2
        IF ymax<10 THEN test=2
    LOOP UNTIL test-INT(test)<>0
       
    z=INT(RND(1)*2)+1
    IF z=1 THEN nwall="on"
    IF z=2 THEN nwall="off"
    walln=INT(RND(1)*5)+1
    z=INT(RND(1)*2)+1
    IF z=1 THEN mwall="on"
    IF z=2 THEN mwall="off"
    wallm=INT(RND(1)*20)+1
    opp=INT(RND(1)*16)+4
END SELECT



wmax=(xmax*ymax)/(15-level)
FOR x=1 TO xmax+2
    LOCATE 1,x:? CHR(219);
    LOCATE 2,x:? CHR(219);
    LOCATE ymax+1,x:? CHR(219);
    LOCATE ymax+2,x:? CHR(219);
NEXT x

FOR y=1 TO ymax+2
    LOCATE y,1:? CHR(219);
    LOCATE y,2:? CHR(219);
    LOCATE y,xmax+1:? CHR(219);
    LOCATE y,xmax+2:? CHR(219);
NEXT y

FOR t=1 TO wmax
    DO
        x=INT(RND(1)*xmax)+1
        y=INT(RND(1)*ymax)+1
    LOOP UNTIL SCREEN(y,x)=32
    LOCATE y,x:? CHR(219)
NEXT t


FOR x=1 TO 100
    FOR y=1 TO 30
        IF SCREEN(y,x)=65499 THEN
            LINE(x*8-8,y*16-16)-(x*8-1,y*16-1),RGB(100,100,100),b
            LINE(x*8-7,y*16-15)-(x*8-2,y*16-2),RGB(120,120,120),b
            LINE(x*8-6,y*16-14)-(x*8-3,y*16-3),RGB(140,140,140),b
            LINE(x*8-5,y*16-13)-(x*8-4,y*16-4),RGB(160,160,160),b
        END IF
    NEXT y
NEXT x

FOR t=1 TO opp
    done=0
        DO
            x1=INT(RND(1)*xmax-1)
            y1=INT(RND(1)*ymax-1)
            IF y1>2 AND x1>2 AND SCREEN(y1,x1)=32 THEN done=1
        LOOP UNTIL done=1
       
            LOCATE y1,x1:? CHR(1)
           
NEXT t
   


x=3
y=INT(ymax/2)+2
LOCATE y-1,x:?"  ";
LOCATE y,x:?"  ";
LOCATE y+1,x:?"  ";
LOCATE y,x:? CHR(2);

COLOR RGB(160,160,160),RGB(100,100,100)
LOCATE y-1,xmax+1:? ">";
LOCATE y,xmax+1:? ">";
LOCATE y+1,xmax+1:? ">";
COLOR RGB(100,100,100),RGB(50,50,50)

'if opp>0 then exxit="NO!"
'if opp=0 then exxit="YES! Go to next Level!"
'LOCATE ymax+3,1:?"Level     :";level
'locate ymax+4,1:?"Enemies   :";opp
'locate ymax+5,1:?"Exit open :";exxit

'LOCATE ymax+4,1:?"X=";xmax;"  Y=";ymax
'LOCATE ymax+3,20:?"New Walls : ";nwall
'IF nwall="off" THEN walln=5
'LOCATE ymax+4,20:?"Strengh NW:";5-walln
'LOCATE ymax+3,40:?"Moving Walls: ";mwall
'IF nwall="off" THEN wallm=0
'LOCATE ymax+4,40:?"Strengh MW  :";wallm


DO
if opp>0 then exxit="NO!"
if opp=0 then exxit="YES! Go to next Level!"
LOCATE ymax+3,1:?"Level     :";level
locate ymax+4,1:?"Enemies   :";opp
locate ymax+5,1:?"Exit open :";exxit
    mov=0
    a=INKEY
        'locate 30,1:? screen(y,x+1), screen(y,x+2)
        IF a="4" AND mov=0 THEN mov=1
       
        IF a="6" AND mov=0 THEN mov=2
       
        IF a="8" AND mov=0 THEN mov=3
       
        IF a="2" AND mov=0 THEN mov=4
       
            IF mov=1 AND SCREEN (y,x-1)=32 THEN
                LOCATE y,x:?" ";
                x=x-1
                LOCATE y,x:? CHR(2)
                mov=-1
            END IF
           
            IF mov=1 AND SCREEN (y,x-1)=65499 THEN
                if screen(y,x-2)=32 then
                    LOCATE y,x:?" ";
                    x=x-1
                    LOCATE y,x:? CHR(2)
                    LOCATE y,x-1:? CHR(219)
                    mov=-1
                end if
                if screen(y,x-2)=1 then
                    LOCATE y,x:?" ";
                    x=x-1
                    LOCATE y,x:? CHR(2)
                    LOCATE y,x-1:? CHR(219)
                    opp=opp-1
                    mov=-1
                end if
            END IF
       
       
            IF mov=2 AND SCREEN (y,x+1)=32 THEN
                LOCATE y,x:?" ";
                x=x+1
                LOCATE y,x:? CHR(2)
                mov=-1
            END IF
           
            IF mov=2 AND SCREEN (y,x+1)=65499 THEN
                if screen(y,x+2)=32 then
                    LOCATE y,x:?" ";
                    x=x+1
                    LOCATE y,x:? CHR(2)
                    LOCATE y,x+1:? CHR(219)
                    mov=-1
                end if
                if screen(y,x+2)=1 then
                    LOCATE y,x:?" ";
                    x=x+1
                    LOCATE y,x:? CHR(2)
                    LOCATE y,x+1:? CHR(219)
                    opp=opp-1
                    mov=-1
                end if
            END IF
           
           
            IF mov=3 AND SCREEN (y-1,x)=32 THEN
                LOCATE y,x:?" ";
                y=y-1
                LOCATE y,x:? CHR(2)
                mov=-1
            END IF
           
            IF mov=3 AND SCREEN (y-1,x)=65499 THEN
                if screen(y-2,x)=32 then
                    LOCATE y,x:?" ";
                    y=y-1
                    LOCATE y,x:? CHR(2)
                    LOCATE y-1,x:? CHR(219)
                    mov=-1
                end if
                if screen(y-2,x)=1 then
                    LOCATE y,x:?" ";
                    y=y-1
                    LOCATE y,x:? CHR(2)
                    LOCATE y-1,x:? CHR(219)
                    opp=opp-1
                    mov=-1
                end if
            END IF           
       
       
            IF mov=4 AND SCREEN (y+1,x)=32 THEN
                LOCATE y,x:?" ";
                y=y+1
                LOCATE y,x:? CHR(2)
                mov=-1
            END IF
           
            IF mov=4 AND SCREEN (y+1,x)=65499 THEN
                if screen(y+2,x)=32 then
                    LOCATE y,x:?" ";
                    y=y+1
                    LOCATE y,x:? CHR(2)
                    LOCATE y+1,x:? CHR(219)
                    mov=-1
                end if
                if screen(y+2,x)=1 then
                    LOCATE y,x:?" ";
                    y=y+1
                    LOCATE y,x:? CHR(2)
                    LOCATE y+1,x:? CHR(219)
                    opp=opp-1
                    mov=-1
                end if
            END IF       
           
                        p0=SCREEN(y,x)
                        p1=SCREEN(y,x+1)
                        p2=SCREEN(y,x-1)
                        p3=SCREEN(y+1,x)
                        p4=SCREEN(y-1,x)
                       
                        if p1=1 then death=death+1
                        if p2=1 then death=death+1
                        if p3=1 then death=death+1
                        if p4=1 then death=death+1
                            if death>0 then
                                do
                                    a=inkey
                                    locate y,x:? chr(1)
                                    locate 31,1:?"Game over! <press ESC>"
                                    screensync:sleep 100
                                    locate y,x:? chr(2)
                                    screensync:sleep 100
                                    locate y,x:? "X"
                                    screensync:sleep 100
                                    locate 31,1:?"                      "
                                loop until a=chr(27)
                                    if level<>1 then level=1
                                    death=0
                                    goto start   
                            end if
           
           
        IF mov=-1 THEN
           
                       
            IF nwall="on" THEN
                z=INT(RND(1)*walln)+1
                IF z=1 THEN
                    DO
                        x1=INT(RND(1)*xmax-2)+1
                        y1=INT(RND(1)*ymax-2)+1
                    LOOP UNTIL SCREEN(y1,x1)=32
                    LOCATE y1,x1:? CHR(219)
                END IF
            END IF
           
           
            IF mwall="on" THEN
                FOR t=1 TO wallm
                    done=0
                    DO
                        x1=INT(RND(1)*xmax-2)
                        y1=INT(RND(1)*ymax-2)
                        IF y1<3 THEN y1=3
                        IF x1<3 THEN x1=3
                        p0=SCREEN(y1,x1)
                        p1=SCREEN(y1,x1+1)
                        p2=SCREEN(y1,x1-1)
                        p3=SCREEN(y1+1,x1)
                        p4=SCREEN(y1-1,x1)
                       
                            IF p0=65499 AND p1=32 THEN
                                LOCATE y1,x1:?" "
                                LOCATE y1,x1+1:? CHR(219)
                                done=1
                            END IF
                            IF p0=65499 AND p2=32 AND done=0 THEN
                                LOCATE y1,x1:?" "
                                LOCATE y1,x1-1:? CHR(219)
                                done=1
                            END IF
                            IF p0=65499 AND p3=32 AND done=0 THEN
                                LOCATE y1,x1:?" "
                                LOCATE y1+1,x1:? CHR(219)
                                done=1
                            END IF
                            IF p0=65499 AND p4=32 AND done=0 THEN
                                LOCATE y1,x1:?" "
                                LOCATE y1-1,x1:? CHR(219)
                                done=1
                            END IF
                    LOOP UNTIL done=1
                NEXT t
            END IF
           
       for z=1 to 4000
            zz=INT(RND(1)*4)+1
            if x<=x1 then zz=1
            if x>=x1 then zz=2
            if y<=y1 then zz=3
            if y>=y1 then zz=4
            x1=int(rnd(1)*99)+1
            y1=int(rnd(1)*30)+1
           
                        p0=SCREEN(y1,x1)
                        p1=SCREEN(y1,x1+1)
                        p2=SCREEN(y1,x1-1)
                        p3=SCREEN(y1+1,x1)
                        p4=SCREEN(y1-1,x1)
                        p5=SCREEN(y1,x1+2)
                        p6=SCREEN(y1,x1-2)
                        p7=SCREEN(y1+2,x1)
                        p8=SCREEN(y1-2,x1)
                        done=0
                       
                IF p0=1 THEN
                   
                        IF p1=32 and done=0 and zz=1 THEN
                            LOCATE y1,x1:?" "
                            LOCATE y1,x1+1:? CHR(1)
                            done=1
                        END IF                   
                       
                        IF p2=32 and done=0 and zz=2 THEN
                            LOCATE y1,x1:?" "
                            LOCATE y1,x1-1:? CHR(1)
                            done=1
                        END IF
                       
                        IF p3=32 and done=0 and zz=3 THEN
                            LOCATE y1,x1:?" "
                            LOCATE y1+1,x1:? CHR(1)
                            done=1
                        END IF

                        IF p4=32 AND done=0 and zz=4 THEN
                            LOCATE y1,x1:?" "
                            LOCATE y1-1,x1:? CHR(1)
                            done=1
                        END IF
                       
                       
                       
                       
                        IF p1=65499 and p5=32 and done=0 and zz=1 THEN
                            LOCATE y1,x1:?" "
                            LOCATE y1,x1+1:? CHR(1)
                            locate y1,x1+2:? chr(219)
                            done=1
                        END IF                   
                       
                        IF p2=65499 and p6=32 and done=0 and zz=2 THEN
                            LOCATE y1,x1:?" "
                            LOCATE y1,x1-1:? CHR(1)
                            locate y1,x1-2:? chr(219)
                            done=1
                        END IF
                       
                        IF p3=65499 and p7=32 and done=0 and zz=3 THEN
                            LOCATE y1,x1:?" "
                            LOCATE y1+1,x1:? CHR(1)
                            locate y1+2,x1:? chr(219)
                            done=1
                        END IF

                        IF p4=65499 and p8=32 AND done=0 and zz=4 THEN
                            LOCATE y1,x1:?" "
                            LOCATE y1-1,x1:? CHR(1)
                            locate y1-2,x1:? chr(219)
                            done=1
                        END IF
     
                END IF
               
               
        next z
           
           
           
            FOR x1=1 TO 100
                FOR y1=1 TO 30
                    IF SCREEN(y1,x1)=65499 THEN
                    LINE(x1*8-8,y1*16-16)-(x1*8-1,y1*16-1),RGB(100,100,100),b
                    LINE(x1*8-7,y1*16-15)-(x1*8-2,y1*16-2),RGB(130,130,130),b
                    LINE(x1*8-6,y1*16-14)-(x1*8-3,y1*16-3),RGB(160,160,160),b
                    LINE(x1*8-5,y1*16-13)-(x1*8-4,y1*16-4),RGB(190,190,190),b
                    END IF
                NEXT y1
            NEXT x1 
            mov=0               
        END IF
       
        IF x=xmax THEN
            IF y>=ymax/2 AND y<=ymax/2+3 and opp=0 THEN levelup=1
        END IF
       
        IF levelup=1 THEN
            level=level+1
            GOTO start
        END IF
       
LOOP UNTIL a=CHR(27)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4701
Wohnort: ~/

BeitragVerfasst am: 18.11.2010, 17:57    Titel: Antworten mit Zitat

Ich würde ja behaupten, an Spielen dran zu bleiben lohnt sich immer. happy

Zitat:
Das ganze ist eine Sokoban (Kistenschieben) - Pacman (Gegner) - Labyrinth (Weg finden) - Mischung

Dann sollte die Überschrift wahrscheinlich "Sokoban-Labyrinth-Dingenskirchen lauten? Sodoku hat mich schon irritiert weil man das ähnlich lautende Zahlenrätsel mit zwei u und einem o schreibt. grinsen

Den Quelltext habe ich mir nicht genauer angesehen, aber das Spiel sieht schon ganz nett aus. Mich irritiert die zufällige sprunghafte Bewegung, die da stattfindet, wenn Gegner oder Wände um zwei Felder gleichzeitig wandern.

Einen "Sprung-Grund" für die Spielerfigur habe ich schon gefunden:
Code:
                if screen(y,x-2)=32 then
                    LOCATE y,x:?" ";
                    x=x-1
                    LOCATE y,x:? CHR(2)
                    LOCATE y,x-1:? CHR(219)
                    mov=-1
                end if
                if screen(y,x-2)=1 then
                    LOCATE y,x:?" ";
                    x=x-1
                    LOCATE y,x:? CHR(2)
                    LOCATE y,x-1:? CHR(219)
                    opp=opp-1
                    mov=-1
                end if

Wenn nun das Feld hinter dem Schiebeziel leer ist, dann wird ja der Stein verschoben; wenn aber das Feld hinter diesem ein Gegner ist, dann wird nochmal verschoben. Das kannst du leicht mit einem ELSEIF verhindern:
Code:
                if screen(y,x-2)=32 then
                    LOCATE y,x:?" ";
                    x=x-1
                    LOCATE y,x:? CHR(2)
                    LOCATE y,x-1:? CHR(219)
                    mov=-1
                elseif screen(y,x-2)=1 then
                    LOCATE y,x:?" ";
                    x=x-1
                    LOCATE y,x:? CHR(2)
                    LOCATE y,x-1:? CHR(219)
                    opp=opp-1
                    mov=-1
                end if


Noch ein kleiner Optimierungsvorschlag:
Code:
IF a="4" AND mov=0 THEN mov=1
IF a="6" AND mov=0 THEN mov=2
IF a="8" AND mov=0 THEN mov=3
IF a="2" AND mov=0 THEN mov=4

lässt sich mit ELSEIF oder gleich mit SELECT CASE mit weniger Vergleichsoperationen schreiben:
Code:
SELECT CASE a
  CASE "4" : mov = 1
  CASE "6" : ' usw.

Dann musst du nicht immer noch auf mov=0 überprüfen.

Ideen hätte ich schon ein paar:

  • Unverschiebbare Steine (klar unterscheidbar von den verschiebbaren), damit die verschiebbaren Steine Sokoban-mäßig durch ein Labyrinth geschoben werden müssen; das setzt dann aber fest konstruierte Level voraus.
  • Gegner, die sich nicht nur bei Tastendruck bewegen, sondern in bestimmten Zeitabständen
  • Gegner mit bestimmten Bewegungsmuster (z. B. laufen immer rechts, wenn das nicht geht geradeaus, wenn das auch nicht geht links, wenn das auch nicht geht zurück). Das Bewegungsmuster kann sich dann für verschiedene Gegener unterschiedlich aussehen und sich vielleicht sogar bei bestimmten Feldern ändern.
  • "Intelligente" Gegner, die den Spieler zu fangen versuchen; Achtung: dem Spieler muss natürlich irgendwie die Chance gegeben werden, zu entkommen. grinsen


Noch kurz was zum Schluss: Bei sehr langen Code-Passagen kannst du, der Lesefreundlichkeit wegen, den Code in ein NoPaste-System stellen (z. B. das "hauseigene" http://www.freebasic-portal.de/porticula) und darauf zu verlinken. Dann muss man nicht so lange durch die Beiträge scrollen. zwinkern
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
mkfezzo



Anmeldungsdatum: 16.08.2007
Beiträge: 25

BeitragVerfasst am: 24.11.2010, 20:10    Titel: Antworten mit Zitat

Jep! Danke für die Vorschläge - den Bewegungsbug habe ich schon mal korrigiert. Habe vergessen einfach nach bereits erfolgtem Zug abzufragen. Du hast recht das ganze krankt an der Zufallsbewegung der Gegner. Mal sehen was ich da machen kann, da ich ja extra nicht mit ner Matrix für das komplette Feld gearbeitet habe - somit haben die auch keine "Erinnerung" welche Bewegung im letzten Zug gemacht haben (grübel). Vielleicht speichere ich die als Farbwert auf einem Pixel oder so. Ich poste nach Überarbeitung mal das Ergebnis im nopaste. happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
croco97



Anmeldungsdatum: 04.11.2005
Beiträge: 260

BeitragVerfasst am: 24.11.2010, 20:42    Titel: Antworten mit Zitat

Bringt meinen Rechner ganz schön zum Schwitzen. Kann es sein, dass da irgendwo ein sleep fehlt? Aber sieht ganz spannend aus! Bin gespannt auf das nächste Release!

VG!

Croco
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz