Snake problem

08/27/2011 21:08 False#1
hey habe vesucht ein snake game zu machen nur dieser fehler kommt immer:
Quote:
Der Index war außerhalb des Arraybereichs.
Der kommt immer wenn ich versuch was zu essen(was man halt in snake machen muss :P)

source:

hoffe ihr könnt mir helfen.
08/28/2011 22:09 .Infinite#2
du versuchst halt - wie du in der Fehlerbeschreibung sehen kannst auf einen Teil des Arrays zuzugreifen, der nicht existiert...
Wenn dein Array beispielsweise als 'Spielfeld[10]' deklariert wurde, kannst du nicht auf 'Spielfeld[11]' zugreifen. Das gleiche gilt auch für mehrdimensionale arrays.

Du musst also versuchen diesen Fehler irgendwie abzufangen. Ich hab zwar keine Ahnung von vb, aber ich würde es so in der art machen...

PHP Code:
int Spielfeld[10];
.....
if (
>=&& <= sizeof(Spielfeld[10])/sizeof(int))
{
     .........

08/28/2011 22:47 False#3
Quote:
Originally Posted by .Infinite View Post
du versuchst halt - wie du in der Fehlerbeschreibung sehen kannst auf einen Teil des Arrays zuzugreifen, der nicht existiert...
Wenn dein Array beispielsweise als 'Spielfeld[10]' deklariert wurde, kannst du nicht auf 'Spielfeld[11]' zugreifen. Das gleiche gilt auch für mehrdimensionale arrays.

Du musst also versuchen diesen Fehler irgendwie abzufangen. Ich hab zwar keine Ahnung von vb, aber ich würde es so in der art machen...

PHP Code:
int Spielfeld[10];
.....
if (
>=&& <= sizeof(Spielfeld[10])/sizeof(int))
{
     .........


aber der bereich muss ja eigentlich da sein da i = m - 1 ist und m ist 10(anfangswert) nur wenn er was ißt ist m += 1 das heißt i = 11 nur dann kommt ja ein error :/
08/28/2011 22:49 Secredo#4
Quote:
Originally Posted by .Infinite View Post
du versuchst halt - wie du in der Fehlerbeschreibung sehen kannst auf einen Teil des Arrays zuzugreifen, der nicht existiert...
Wenn dein Array beispielsweise als 'Spielfeld[10]' deklariert wurde, kannst du nicht auf 'Spielfeld[11]' zugreifen. Das gleiche gilt auch für mehrdimensionale arrays.

Du musst also versuchen diesen Fehler irgendwie abzufangen. Ich hab zwar keine Ahnung von vb, aber ich würde es so in der art machen...

PHP Code:
int Spielfeld[10];
.....
if (
>=&& <= sizeof(Spielfeld[10])/sizeof(int))
{
     .........

Ergänzend dazu noch: Arrays in .NET haben eine schöne Eigenschaft namens "Length". ;)
08/28/2011 23:00 False#5
Quote:
Originally Posted by Secredo View Post
Ergänzend dazu noch: Arrays in .NET haben eine schöne Eigenschaft namens "Length". ;)
erneut getestet natürlich wird es weiter aufgeführt da m ja immer nach dem essen +1 gesetzt wird aber trotzdem kommt der fehler...
08/28/2011 23:32 .Infinite#6
Ich denke den Fehler wirst du jetzt selbst finden müssen. Dein Code sieht leider etwas unstrukturiert aus... Dieses ganzen Objekte "Panel2", "Timer1", "Form1" und diese Variablennamen "m" und "k"... wie soll man da den Überblick behalten? Ich krieg da jedenfalls die Krise.

Und noch was: Ich weiß nicht wie das in VB ist, aber muss man Speicher den man mit "new" reserviert nicht auch hinterher wieder freigeben?
08/28/2011 23:52 False#7
Quote:
Originally Posted by .Infinite View Post
Ich denke den Fehler wirst du jetzt selbst finden müssen. Dein Code sieht leider etwas unstrukturiert aus... Dieses ganzen Objekte "Panel2", "Timer1", "Form1" und diese Variablennamen "m" und "k"... wie soll man da den Überblick behalten? Ich krieg da jedenfalls die Krise.

Und noch was: Ich weiß nicht wie das in VB ist, aber muss man Speicher den man mit "new" reserviert nicht auch hinterher wieder freigeben?
naja so verwirrend kann es nicht sein ;)

panel1 = kopf wegen der kollision
panel2 = das essen
m = länge der schlange
k ist nur wegen der steuerung

das mit new geht nicht.


P.s jeder hat seine eigene ordnung ;)
08/28/2011 23:52 Secredo#8
Quote:
Originally Posted by .Infinite View Post
Und noch was: Ich weiß nicht wie das in VB ist, aber muss man Speicher den man mit "new" reserviert nicht auch hinterher wieder freigeben?
Nope, GarbageCollecor ftw! ^-^
08/29/2011 03:01 link#9
Dim m As Integer = 10
Dim p(m) As Point


"wenn er was ißt ist m += 1"

Code:
Private Sub steuerung()
  If k = Keys.Left Then
    p(m).X -= 16
  End If
  '[...]
?
08/29/2011 09:09 False#10
Quote:
Originally Posted by link View Post
Dim m As Integer = 10
Dim p(m) As Point


"wenn er was ißt ist m += 1"

Code:
Private Sub steuerung()
  If k = Keys.Left Then
    p(m).X -= 16
  End If
  '[...]
?
Hmm mit dem eigenen Code kann schlecht der Fehler weg sein...
08/29/2011 09:32 link#11
Sollte bedeuten: wenn p m groß ist und m mit 10 definiert und danach inkrementiert und dann als Index für p verwendet wird, müsste doch p(11) herauskommen, obwohl p nur 10 groß ist
08/29/2011 10:13 False#12
Quote:
Originally Posted by link View Post
Sollte bedeuten: wenn p m groß ist und m mit 10 definiert und danach inkrementiert und dann als Index für p verwendet wird, müsste doch p(11) herauskommen, obwohl p nur 10 groß ist
aber m wird doch nach dem essen +1 gesetzt o.O
08/29/2011 10:37 link#13
Quote:
Originally Posted by .ƒaℓsє.
aber m wird doch nach dem essen +1 gesetzt o.O
Quote:
Originally Posted by link
Sollte bedeuten: wenn p m groß ist und m mit 10 definiert und danach inkrementiert und dann als Index für p verwendet wird, müsste doch p(11) herauskommen, obwohl p nur 10 groß ist
Sagte ich doch und genau da liegt ja auch das Problem.
Schreib halt einfach mal Dim p(m*2) As Point
08/29/2011 12:49 False#14
Quote:
Originally Posted by link View Post
Sagte ich doch und genau da liegt ja auch das Problem.
Schreib halt einfach mal Dim p(m*2) As Point
ahh,okay danke nun geht es :)
hat jemand eine Idee wie ich das panel per random setzen kann aber so das sie immer 16 ist also das die immer so z.b ist :

0,0
0,16
16,16
64,16
128,0

halt das die location immer so ist.

(ich weiß ich kann doof erklären^^)
08/29/2011 17:18 bammes#15
zum anfang soviel ich weis kann man den arraybereich auch erweitern mit redim preserve array(neuerindex)