Schiffe dürfen sich nicht berühren[Noch nicht gelöst!!]

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

mas93

Betreff: Schiffe dürfen sich nicht berühren[Noch nicht gelöst!!]

BeitragSo, Sep 09, 2007 15:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
Da ich progge ja gerade an einem schiffe versenken.
Es geht schon fast alles nur möchte ich jetzt machen, dass der computergegner seine Schiffe zufällig platziert.

Ich hab mir da auch schon was ausgedacht, aber leider funktioniert das noch nicht so, wie es soll.
Ich weiss aber nicht, woran das liegt.

Hier mal der code wo man die schiffe platziert:

Code: [AUSKLAPPEN]
;2er
   b=Rnd(1,2)
   If b=1 Then
      x=Rnd(0,9)
      y=Rnd(1,9)
      
      g.gegnership=New gegnership
      g\x=x
      g\y=y
      g\art=1
      g\richtung=1
      g\px=x*40
      g\py=y*40
      enemiemap(x,y)=1
      enemiemap(x,y-1)=2
      
      vw.besetzt=New besetzt
      vw\xxx=x
      vw\yyy=y
      vw.besetzt=New besetzt
      vw\xxx=x
      vw\yyy=y-1
   EndIf
   If b=2 Then
      x=Rnd(0,8)
      y=Rnd(0,9)
      
      g.gegnership=New gegnership
      g\x=x
      g\y=y
      g\art=1
      g\richtung=2      
      g\px=X*40
      g\py=Y*40
      enemiemap(x,y)=1
      enemiemap(x+1,y)=2
      
      vw.besetzt=New besetzt
      vw\xxx=x
      vw\yyy=y
      vw.besetzt=New besetzt
      vw\xxx=x+1
      vw\yyy=y
   EndIf
   b=0
   
   ;3er
   b=Rnd(1,2)
   If b=1 Then
      
      For vw.besetzt=Each besetzt
         Repeat   
            
            x=Rnd(0,9)
            y=Rnd(2,9)
         Until x<>vw\xxx And y<>vw\yyy And y-1<>vw\yyy And y-2<>vw\yyy   
      Next
      
      
      g.gegnership=New gegnership
      g\x=x
      g\y=y
      g\art=2
      g\richtung=1      
      g\px=x*40
      g\py=y*40
      
      enemiemap(x,y)=3
      enemiemap(x,y-1)=4
      enemiemap(x,y-2)=5
      
      vw.besetzt=New besetzt
      vw\xxx=x
      vw\yyy=y
      vw.besetzt=New besetzt
      vw\xxx=x
      vw\yyy=y-1
      vw.besetzt=New besetzt
      vw\xxx=x
      vw\yyy=y-2
   EndIf
   If b=2 Then
      For vw.besetzt=Each besetzt
         Repeat
            
            x=Rnd(0,7)
            y=Rnd(0,9)
         Until x<>vw\xxx And y<>vw\yyy And x+1<>vw\xxx And x+2<>vw\xxx   
      Next
      
      
      
      
      
      g.gegnership=New gegnership
      g\x=x
      g\y=y
      g\art=2
      g\richtung=2      
      g\px=x*40
      g\py=y*40
      
      enemiemap(x,y)=3
      enemiemap(x+1,y)=4
      enemiemap(x+2,y)=5
      
      vw.besetzt=New besetzt
      vw\xxx=x
      vw\yyy=y
      vw.besetzt=New besetzt
      vw\xxx=x+1
      vw\yyy=y
      vw.besetzt=New besetzt
      vw\xxx=x+2
      vw\yyy=y
   EndIf
   b=0



und hier der code zum anzeigen des schiffes:

Code: [AUSKLAPPEN]
For g.gegnership=Each gegnership
      For i=0 To 9
         For j=0 To 9
            
            If g\art=1 Then
               If enemiemap(i,j)=1 Then If g\richtung=1 Then DrawImageRect zweier(1),g\px+40,g\py+40,0,0,40,40
                If enemiemap(i,j)=2 Then If g\richtung=1 Then DrawImageRect zweier(1),g\px+40,g\py+40+40,0,40,40,40
               
               If enemiemap(i,j)=1 Then If g\richtung=2 Then DrawImageRect zweier(0),g\px,g\py+40,0,0,40,40
                If enemiemap(i,j)=2 Then If g\richtung=2 Then DrawImageRect zweier(0),g\px+40,g\py+40,40,0,40,40
            EndIf
            
            
            If g\art=2 Then
               If enemiemap(i,j)=3 Then If g\richtung=1 Then DrawImageRect dreier(1),g\px+40,g\py+40,0,0,40,40
               If enemiemap(i,j)=4 Then If g\richtung=1 Then DrawImageRect dreier(1),g\px+40,g\py+40+40,0,40,40,40
               If enemiemap(i,j)=5 Then If g\richtung=1 Then DrawImageRect dreier(1),g\px+40,g\py+40+40+40,0,80,40,40
               
               If enemiemap(i,j)=3 Then If g\richtung=2 Then DrawImageRect dreier(0),g\px,g\py+40,0,0,40,40
               If enemiemap(i,j)=4 Then If g\richtung=2 Then DrawImageRect dreier(0),g\px+40,g\py+40,40,0,40,40
               If enemiemap(i,j)=5 Then If g\richtung=2 Then DrawImageRect dreier(0),g\px+80,g\py+40,80,0,40,40
               
            EndIf
next
next
next


so, ich weiss, dass ist viel code für nichts, aber normal müsste es funktionieren.
Normal dürfte jetzt der 3er nie auf dem 2er sein.
Es passiert aber trotzdem.

könnt ihr mir da helfen?
mfg
mas93
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau]
  • Zuletzt bearbeitet von mas93 am So, Sep 09, 2007 20:19, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragSo, Sep 09, 2007 15:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Meinst du berühren (also direkt aneinander angrenzen) oder überlappen ?
Du musst die Felder markieren die nicht mehr besetzt werden sollen und bei der Erstellung eines Schiffes darauf prüfen. Wo du das machst ist mir auf den ersten Blick noch nicht ganz klar.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

mas93

BeitragSo, Sep 09, 2007 15:35
Antworten mit Zitat
Benutzer-Profile anzeigen
sie sollen sich nicht überlappen.

Also hier erstell ich ein type mit den feldern die schon besetzt sind:

Code: [AUSKLAPPEN]
 vw.besetzt=New besetzt
      vw\xxx=x
      vw\yyy=y
      vw.besetzt=New besetzt
      vw\xxx=x
      vw\yyy=y-1


und hier lass ich x un y hoffentlich solange random bis es nicht mit dem type über einstimmt:

Code: [AUSKLAPPEN]
For vw.besetzt=Each besetzt
         Repeat   
           
            x=Rnd(0,9)
            y=Rnd(2,9)
         Until x<>vw\xxx And y<>vw\yyy And y-1<>vw\yyy And y-2<>vw\yyy   
      Next


mfg
mas93


Also der obere code ist daraus, wo der 2er erstellt wird und der untere ist von da wo gecheckt werden soll ob der 3er den 2er überlappt
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau]

ToeB

BeitragSo, Sep 09, 2007 15:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
For vw.besetzt=Each besetzt
         Repeat   
           
            x=Rnd(0,9)
            y=Rnd(2,9)
         Until x<>vw\xxx And y<>vw\yyy And y-1<>vw\yyy And y-2<>vw\yyy   
      Next


Du must das so machen :





Code: [AUSKLAPPEN]

         Repeat   
            For vw.besetzt=Each besetzt
            x=Rnd(0,9)
            y=Rnd(2,9)
            If x<>vw\xxx And y<>vw\yyy And y-1<>vw\yyy And y-2<>vw\yyy then Exit
            Next
         ForEver 


Beim ersten wird immer nur der ERSTE untersucht, bei meiner Version werden immer ALLE Untersucht !

mfg Crack93
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

mas93

BeitragSo, Sep 09, 2007 16:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Gute idee!

so, ich habs mal eingebaut, aber es kommt trotzdem noch vor dass sie sich überlappen.
Ich habs so gemacht:
Code: [AUSKLAPPEN]

;3er
   b=Rnd(1,2)
   If b=1 Then
      
      Repeat   
            For vw.besetzt=Each besetzt
            x=Rnd(0,9)
            y=Rnd(2,9)
            If x<>vw\xxx And y<>vw\yyy And y-1<>vw\yyy And y-2<>vw\yyy Then Exit
         Next
         Exit
      Forever 
      
      
      g.gegnership=New gegnership
      g\x=x
      g\y=y
      g\art=2
      g\richtung=1      
      g\px=x*40
      g\py=y*40
      
      enemiemap(x,y)=3
      enemiemap(x,y-1)=4
      enemiemap(x,y-2)=5
      
      vw.besetzt=New besetzt
      vw\xxx=x
      vw\yyy=y
      vw.besetzt=New besetzt
      vw\xxx=x
      vw\yyy=y-1
      vw.besetzt=New besetzt
      vw\xxx=x
      vw\yyy=y-2
   EndIf
   If b=2 Then
      Repeat   
            For vw.besetzt=Each besetzt
            
            x=Rnd(0,7)
            y=Rnd(0,9)
            If x<>vw\xxx And y<>vw\yyy And y-1<>vw\yyy And y-2<>vw\yyy Then Exit
            Next
         Exit
      Forever 


mfg
mas93
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau]

LordArtus

BeitragMo, Sep 10, 2007 2:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

es ist keine Lösung für deinen Code (du kennst ihn ja besser Wink ) , sondern ein Ansatz , vielleicht hilft der Dir.

Ich hoffe du verstehst was ich meine:
Code: [AUSKLAPPEN]

SuperStrict
SeedRnd MilliSecs()
Local Testmap:Byte[10,10]

' 50x zufällig +1(markieren) in Testmap schreiben

For Local i:Byte=0 To 49
   Local x:Byte=Rand(0,9)
   Local y:Byte=Rand(0,9)
   Testmap[x,y]=Testmap[x,y]+1
Next

' Ausgabe

For Local x:Byte=0 To 9
   For Local y:Byte=0 To 9
      WriteStdout Testmap[x,y]
   Next
   WriteStdout("~n")
Next

' Testmap auf 0 setzen

For Local x:Byte=0 To 9
   For Local y:Byte=0 To 9
      Testmap[x,y]=0
   Next
Next
 
' Nochmal 50x zufällig +1(markieren) in Testmap schreiben(diesmal mit Überprüfung)

For Local i:Byte=0 To 49
   Local x:Byte=Rand(0,9)
   Local y:Byte=Rand(0,9)
   '------------------------------
   If Testmap[x,y]>0
      i=i-1
   Else
      Testmap[x,y]=Testmap[x,y]+1
   EndIf
   '------------------------------
Next

' Nochmal Ausgabe

WriteStdout("~n")

For Local x:Byte=0 To 9
   For Local y:Byte=0 To 9
      WriteStdout Testmap[x,y]
   Next
   WriteStdout("~n")
Next


Ist zwar in BlitzMax geschrieben , aber sollte verständlich sein , oder leicht umzusetzten sein.

MfG

LordArtus

p.s. ich denke mit Code kann man etwas besser erklären , als mit Worten , ausserdem hat es Xeres schon erwähnt.

SpionAtom

BeitragMo, Sep 10, 2007 10:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verstehe auch nicht, warum du für die besetzten Felder in Types speicherst. So ein Feld schreit geradezu nach einem Array. Denn ein zweidimensionales Array repräsentiert das Feld perfekt und das Feld wird wohl das gesamte Spiel über seine Ausmaße behalten.
LordArtus machts vor.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

BladeRunner

Moderator

BeitragMo, Sep 10, 2007 11:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau, ein Array sollte die Lösung all deiner Probleme sein. Wenn Du die eingetragenen Schiffe unterscheiden willst kannst du ihnen ja verschiedene Werte zuweisen (Freises Wasser = 0,U-Boot =1, Zerstörer = 2 ...)
So lässt sich auf einen Blich erkennen ob und wenn ja mit was ein Feld belegt ist.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

mas93

BeitragMo, Sep 10, 2007 15:43
Antworten mit Zitat
Benutzer-Profile anzeigen
vielen vielen dank, es hat funktioniert!!!

Man, warum bin ich ncht gleich draufgekommen Rolling Eyes
Vielen dank!

mfg
mas93
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau]

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group