 |
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 |
mkfezzo
Anmeldungsdatum: 16.08.2007 Beiträge: 25
|
Verfasst am: 18.11.2010, 10:07 Titel: Sodoku-Labyrinth-Dingenskirchen |
|
|
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
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 18.11.2010, 17:57 Titel: |
|
|
Ich würde ja behaupten, an Spielen dran zu bleiben lohnt sich immer.
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.
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.
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.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
mkfezzo
Anmeldungsdatum: 16.08.2007 Beiträge: 25
|
Verfasst am: 24.11.2010, 20:10 Titel: |
|
|
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.  |
|
Nach oben |
|
 |
croco97

Anmeldungsdatum: 04.11.2005 Beiträge: 260
|
Verfasst am: 24.11.2010, 20:42 Titel: |
|
|
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 |
|
 |
|
|
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.
|
|