Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Anfängerschwierigkeiten mit Snakeklon (https://www.delphipraxis.net/68162-anfaengerschwierigkeiten-mit-snakeklon.html)

plecker 25. Apr 2006 15:27


Anfängerschwierigkeiten mit Snakeklon
 
hey leute...ich bin totaler neuling und wir nehm gerade delphi inner schule durch
hab die erste arbeit verkackt, und jetz müssen wa ne hausarbeit schreiben
wir dürfen uns i-was aussuchen was wir programmieren wollen und dann ne arbeit drüber schreiben!
so ich hab mir heute in kopp gesetzt das ich n snake klon machen will...leider hat sich das als schwerer entpuppt als ich dachte...
naja...jetz brauch ich eure hilfe, denn SO gut sind wa noch nich...da kann auch was "etwas" anderes rauskomm...aber ich weiß nich wie ich es machen soll

habs mir so in etwa gedacht:
i-wie mehrere kleine kästchen als bilder hintereinander setzen<-das is dann die schlange!
den ersten "kasten" (kopf) steuert man mit den pfeiltasten<-das hab cih schon geschafft^^
so aber wie mach ich zum beispiel das die anderen kästchen da hinterhergehen???
also:
der 2. dem 1.; der 3. dem 2.; der 4. dem 3.; usw...

das wär mein allererstes problem damit wäre mir schon sehr geholfen...
wie man zufällig die punkte da erscheinen lässt (random-funktion?) weiß ich auch nich...
und mein lehrer meinte nur: "ich sag dir hier nix. du sollst die schriebne nich ich"
jetz sagt ihr das bitte nich auch!^^

[edit=MrSpock]Titel geändert, da der Ersteller trotz mehrfacher Aufforderung kein sinnvoller Titel eingegeben hat. Mfg, MrSpock[/edit]

Luckie 25. Apr 2006 15:29

Re: NOOB<-brauche hilfe!!!^^
 
Bitte editier deinen ersten Beitrag und gib ihm ein aussagekräftiges Topic. Hilfe braucht hier jeder. Desweiteren dürftest du über die Suche einiges zum Thema Snake schon finden.

Die Muhkuh 25. Apr 2006 15:29

Re: NOOB<-brauche hilfe!!!^^
 
Hi,

bitte ändere mal dein Titel, Hilfe braucht jeder.

Desweiteren. Zeig mal deinen Code, den du schon hast.

Klaus01 25. Apr 2006 15:31

Re: NOOB<-brauche hilfe!!!^^
 
rutscht denn die zweite Grafik nicht auf die Position der ersten Grafik, die dritte auf die Pos. der zweiten usw.

Grüße
Klaus

Nikolas 25. Apr 2006 15:31

Re: NOOB<-brauche hilfe!!!^^
 
Willkommen in der DP. :firejump:

Eine der Regeln hier sagt, dass man sich etwas Gedanken um den Threadtitel machen sollte, damit man weiss, um was es im Thread geht, also das bitte editieren (Button oben rechts)

Zum Snake: Merk dir einfach die Positionen der Körperteile z.B. in einem Array. Wenn sich die Schlange bewegt, setzt du den Kopf Dahin, wo der User will, die ehemalige Position des Kopfes gibst du dann dem nächsten Körperteil usw.

vlees91 25. Apr 2006 16:00

Re: NOOB<-brauche hilfe!!!^^
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe da auch mal vor einiger Zeit gemacht
aber achtung: grafiken sind von snake arena se geklaut!
ich hänge zuerst nur die exe an, denn ich glaube der code wird der ohnehin nichts bringen, denn
1. ist das ein wenig wie "spaghetti-code" und
2. ist er eventuell an einigen stellen kompliziert und wenn du da was übernehmen würdest, würde es dem lehrer bestimmt auffallen, dass soetwas nicht zu einem "schlechten" schüler passt.

ps: steuerung mit w,a,s,d
die KI ist zwar nicht wirklich gut, aber stirbt fast nie ;) (ich muss die mal zum A* alghoritmus umändern)

plecker 25. Apr 2006 16:01

Re: NOOB!!!^^
 
jo danke für so schnelle hilfe...
den quelltext??
das is so: ich hab den inner schule angefangen aber noch nich zu hause.
hab auch noch nich angefangen weil cih egarde deutsch lerne (klausur morgen)
der sieht so aus ungefähr:

button procedure:
timer1.enabled:=true; <-damit der ertse block nach oben geht
button1.visible:=false <-is klar^^

timer1 procedure
img1.top:=img1.top-10 <-intertvalle und das alles hab ich alles gemacht

dann hab ich das mitm
ON KEY DOWN
if key= vk_right then begin timer1.enabled:=false timer2.enabled:=true
udn das dann für alle richtungen!

der quelltext is auch nich das problem. ich kenn mich halt nich so sehr mitm programm aus dass ich weiß wie ich bestrimmte sachen machen kann/soll so wie mit dem körper der da hinterher soll...

genauso wenig weiß ich was ein "array" ist...aber ich glaub das heißt anker (?). also ich soll die position des vorher gegangenen speicher in nem "array" und die dann dem nächsten "zuteilen"??? ich dachte vllt an ne variable, war mir aber nich sicher...und wie macht masn son array??

edit: colles game!!! lol..."schlecht" is gut...ne normalerweise bin ich n guter bis sehr guter schüler in physik/informastik das war die erste arbeit die ich verhauen hab... was heißt verhauen 3+!! aber ich brauch unbedingt ne 2!!!^^ okay... die schlangen find ich cool!wie macht amn so was? kann man mir das zutrauen udn is das einfacher als das was ich mir überlegt hab?`ich weiß nich sieht aber viuel cooler aus als sone "blockparade" ^^

Nikolas 25. Apr 2006 16:07

Re: NOOB!!!^^
 
Zitat:

und wie macht masn son array??
Einfach mal 'Array' in der IDE markieren und F1 drücken. Am Besten auch mal das Kapitel über dynamische Arrays durchlesen.

Ganz grob:
Delphi-Quellcode:
myarray: array[0..42] of integer; // Damit hast du 43 Integer-Variablen

myarray[0]:=23; // einen wert in die erste Position des Array schreiben
EineIntegerVariable := myarray[12] // und wieder einen Wert auslesen.

vlees91 25. Apr 2006 18:01

Re: NOOB!!!^^
 
Hmmmpf
mein Beispiel war glaube ich doch nicht so gut, denn wo ich grade den QT hier habe, sind da einige Sachen, die dir unverständlich sein werden (Arrays), aber auch das:
Du hast bestimmt gesehen, dass es bei mir eigene "Kurvenbilder" gibt. Damit würde das nicht funktionieren mit dem "die Bilder nacheinenander durchschieben", denn die Kurven müssen ja auf der gleichen Stelle bleiben.
Deshalb habe ich eine Idee:
Du machst das so, wie das alte Snake auf einem uraltem Nokia-Handy (NICHT Snake II)
D.h.: außenrum ist alles begrenzt und innendrin nichts. Das Essen erscheint zufällig. Was du dann noch daran ändern könntest, wäre ein MENSCHLICHER Gegenspieler (ich glaube KI ist zu schwierig).

Noch einige Fragen mit der ich mal versuchen will dich einzuschätzen:
1. Wie lange hast du schon Informatik (In welchem Schuljahr bist du jetzt und wann hast du angefangen?)?
2. Was war bisher dein komplextes Project?
3. Kennst du dich mit ein wenig Grafikprogrammierung aus? (Canvas reicht)

MisterNiceGuy 25. Apr 2006 18:07

Re: NOOB!!!^^
 
Zitat:

NOOB!!!^^
... ist auch kein aussagekräftiger Titel, wie wäre es mit
Zitat:

Anfängerschwierigkeiten mit Snakeklon
Da wüsste jeder, worum es in dem Topic geht und dir wird eher geholfen!

ichbins 25. Apr 2006 18:36

Re: NOOB!!!^^
 
Du solltest es nicht so machen dass du ein Image hast, dass du um zehn nach oben verschiebst oder so. Damit verlierst du irgendwann die Kontrolle. Verwende ein Array, in dem du den Status aller Felder speicherst, also ob es leer ist, oder ob ein Schlangenkopf drin ist, oder ein Futter, oder ein Schlangenschwanz.


Arrays sind eine Art Listen, in denen du numeriert Daten speichern kannst.

Damit du dein zweidimensionales Spielfeld speichern kannst, brauchst du auch ein zweidimensionales Array:

Delphi-Quellcode:

var
  array2d:array [0..100 {der x-Wert des Arrays geht von null bis hundert}, 0..100 {der y-Wert auch}] of integer {in jedem Feld des Arrays kannst du einen Integer-Wert speichern};


//Beispiele des Zugriffs:

array2d[7,8]:=9;  //ins Feld mit der x-Koordinate 7 und der y-Koordinate 8 im Array
label1.caption:=inttostr(array2d[15,16])); //den Wert in den Koordinaten x:15/y:16 des Arrays auslesen und im Label ausgeben
Arrays verhalten sich genauso wie "normale" Variablentypen, nur dass sie eben noch zusätzlich eine Angabe der Koordinaten innerhalb des Arrays brauchen.

Auf die einzelnen Elemente kannst du dann gut in for-Schleifen zugreifen:
Delphi-Quellcode:
var
  a:array [1..100,1..100] of string;
  x,y:integer;
begin
  for x:=0 to 100 do
    for y:=0 to 100 do
      a[x,y]:='Hallo';
end;
dieser Code setzt in jedes der 100x100 Felder des Arrays den Text 'Hallo', so dass dieser dann 10000 mal innerhalb des Arrays gespeichert ist.


Ich hoffe das war einigermaßen verständlich ;)



jetzt sollst du dein komplettes Spielfeld speichern in einem solchen Array:

Delphi-Quellcode:
var
  spielfeld:array[1..64,1..48 {Spielfeld besteht aus 64x48 Feldern}] of integer; {die Inhalte der einzelnen Felder des Spielfeldes speicherst du als Integer-Werte (0 = Leeres Feld, 1 = Futter, 2 = Schlangenkopf, 3 = Schwanz)}


Als nächstes solltest du dann eine Prozedur schreiben (am besten nimmst du einen neuen Timer, stellst das Intervall so niedrig wie möglich und schreibst den Code dann in die Timer.Click), welche das Spielfeld, über das du genaue Informationen im Array gespeichert hast, auf den Canvas zeichnet. Zuerst musst du in der form.create vier Bilder in tbitmap-Variablen laden, eines für 'Leer', eines für 'Kopf' etc. Die sieht dann etwa so aus:

Delphi-Quellcode:
var
  x,y:integer;
  feldtyp:integer;
begin
  for x:=1 to 64 do begin //alle Horizontalen Reihen nacheinander durchgehen und darstellen
    for y:=1 to 48 do begin //für jede Horizontale Reihe von oben nach unten in dieser Reihe alle Felder durchlaufen
      //und diese Felder dann aktualisieren bzw. den Inhalt des Arrays bei diesen Koordinaten dort anzeigen
      feldtyp:=spielfeld[x,y] //den Wert des Spielfeldarrays bei den gegebenen Koordinaten auslesen
      //und dann das entsprechende Bitmap an den Koordinaten auf dem Canvas ablegen:
      case feldtyp of
        0: form1.canvas.draw(leer,x*16,y*16);
        1: form1.canvas.draw(kopf,x*16,y*16);
        2: form1.canvas.draw(schwanz,x*16,y*16);
        3: form1.canvas.draw(futter,x*16,y*16);
      end;
    end;
  end;
end;
Leer, Kopf, Schwanz und Futter sind hier natürlich die in der form.create geladenen Bitmap-Variablen.

Die Koordinaten, an denen das Bitmap abgelegt wird, werden berechnet, indem der x- und y-Wert mit 16 multipliziert werden, also verwende ich hier eine Größe der einzelnen Felder von 16x16 Pixeln. Du musst die Bitmap-Dateien natürlich entsprechend anpassen oder eine andere Größe verwenden.




Jetzt zur Bewegung:


du solltest vielleicht noch ein Array machen, in dem die Ausrichtung der einzelnen Elemente, also Schwanzteile etc. gespeichert wird. Die Ausrichtung speicherst du auch für jedes Kästchen auf dem Bildschirm.

Mach noch einen Timer, und immer wenn der schlägt, dann wird die Schlange bewegt. Das wird schon schwieriger *g*
Du musst einfach nur auf die Spielfeldvariable zugreifen, und diese entsprechend verändern. Also einfach mal mit einer For-Schleife durchsuchen und z.B. nach einem Kopf-Feld suchen. Wenn du eins gefunden hast, dann setzt du das Feld eins weiter vorne auch auf Kopf. Das alte setzt du auf Leer. Wenn im Umkreis um das alte Feld (4 möglichkeiten) ein Schwanzteil ist, welches in die Richtung dieses Feldes zeigt, dann musst du dieses auf dieses Feld setzen und das Feld, auf dem es früher war, löschen. Damit schreitest du solange fort und ziehst die Schlange Teil für Teil so lange nach vorne bis du das Ende erreichst, also kein Feld mehr findest, das in die Richtung des geräumten zeigt.


Wenn der Kopf der Schlange beim Vorrücken auf ein Futterteilchen stößt, dann machst du es so, dass du das letzte Teil der Schlange, bei dem du hinten ankommst, nicht mehr nachziehst, sondern diese Bewegungsrunde lang einfach 'liegen' lässt, also zwar das alte vorschiebst, allerdings das alte nicht durch einen freien Raum ersetzt sondern durch ein einfaches Schwanzteil ersetzt. Und schon ist die Schlange um ein Schwanzteil länger.

Dann erzeugst du an einer mit ramdom ausgewählten Stelle im Array ein neues Futterteilchen. Achte aber darauf dass du nicht versehentlich eines der Schwanzteile überschreibst:

Delphi-Quellcode:
var
  x,y:integer;
begin
  randomize; //evtl. auch in der form.create erledigbar
  x:=random(64)+1;
  y:=random(48)+1; //zufallskoordinaten zuweisen
  while spielfeld[x,y]<>0  //solange das Spielfeld mit den x- und ykoordinaten ungleich Null, also kein freies Feld ist,
  begin
    x:=random(64)+1;
    y:=random(48)+1; //neue Koordinaten erzeugen
  end;

  //jetzt kannst du mit absoluter Sicherheit sagen dass die Koordinaten ein freies Feld anzeigen, da du ja so lange neue erzeugt hast, bis das Feld frei war.

  //deshalb kannst du jetzt ein Futterteilchen an den Koordinaten erzeugen:
  spielfeld[x,y]:=3;
end;



Ich würde dir auch auf jenden Fall meinen Snake-Klon ans Herz legen, da werden alle Tipps, die ich dir soeben gegeben habe, umgesetzt. Der Code ist dabei.

SirThornberry 25. Apr 2006 18:40

Re: NOOB!!!^^
 
Bitte ändere deinen nichtssagenden Titel in einen aussagekräftigen Titel. Du wurdest schon mehrfach dazu aufgefordert einen aussagekräftigen Titel zu wählen und auch in den Forenregeln steht dies drin.
Wenn du dir keinen vernünftigen Titel ausdenkst sind wir gezwungen das Thema zu schließen.

ichbins 25. Apr 2006 18:53

Titelwahl
 
@SirThornberry:

Änder doch einfach du den Titel und lösch dann alle Titel-änder-Posts inklusive deinem und meinem jetzt. Die DP wird ihre Zuwachsrate nicht erhöhen wenn in jedem Thread 2/3 der Posts Titel-änder-Posts sind und der Thread dann ohne Lösung geschlossen wird.

@plecker: Rechts oben auf edit klicken -> oben im Titel-Feld was anderes eingeben

plecker 27. Apr 2006 16:26

Re: Anfängerschwierigkeiten mit Snakeklon
 
sorry für späte antwort...hatt noch keine zeit seit dienstag!
aber dafür jetz...also:
1. Wie lange hast du schon Informatik (In welchem Schuljahr bist du jetzt und wann hast du angefangen?)?
2. Was war bisher dein komplextes Project?
3. Kennst du dich mit ein wenig Grafikprogrammierung aus? (Canvas reicht)

also ich bin inner 10.klasse! hab also fast 2jahre info...
hab aber erst seit nem knmappen halben jahr delphi...

projekte???
also ich hba schon sachen gemacht wie taschenrechner: +,-,*,/...wurzel und quadration (?^^)
son prog, da is sone kiste (img oder was auch immer) und die bewegt sich halt da durch den raum. durch knopfdruck oder auch ohne^^
äh...sonst nix^^...bin also eher schlecht! wasn canvas ist weiß ich auch nich, aber ich kann dir sagen dass ich damit NICHT auskenne!

@jens: danke fürs "tutorial" werds mir zu herzen legen...

ich setz mich ma dran und sag bescheid obs geht...

danke an alle

ps:wie macht man hier den html code an??^^

Airblader 27. Apr 2006 16:30

Re: Titelwahl
 
Zitat:

Zitat von ichbins
Die DP wird ihre Zuwachsrate nicht erhöhen wenn in jedem Thread 2/3 der Posts Titel-änder-Posts sind und der Thread dann ohne Lösung geschlossen wird.

Sorry, ist nun etwas OT - aber willst du ernsthaft hunderte Leute hier haben, die nichtmal selber dazu in der Lage sind etwas richtig zu umschreiben bzw. nach dem Auffordern dies noch immer nicht tun? :gruebel:
Also bei der Argumentation wäre ich wieder ganz schnell raus aus der DP - denn imho zeichnet die DP doch eben auch dieser gute Umgangston hier aus ;)

air


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz