| Autor |
Beitrag |
blackmarket
Hält's aus hier
Beiträge: 1
|
Verfasst: Do 28.09.06 21:38
Also, ich habe folgendes Problem. Wir sollen in der Schule im Informatik GK ein Snake Programm erstellen. Nur hab ich den Eindruck gewonnen, das wir so gänzlich anders vorgehn als hier die Beispiele aus dem Forum oder eben aus andern Foren. Auf den Punkt gebracht: Ich komm einfach nicht klar o0.
Mein Snake kann fressen, und wird durch die Pfeiltasten navigiert. Ich hab auch schon teilweise angesetzt um sie wachsen zu lassen. Scheiter jedoch an der konkreten Umsetzung, und nunja, unsere Informatik Lehrerin kann 1. nicht erklären, und 2. wollte sie das in dem Fall auch nicht ..o0. Nunja, ich bräuchte also, am besten ein quote von einem Quelltext (im Optimalfall von meinem), indem dann das "wachsen" schon integriert ist. sachen wie die highscore, multiplayer etc. wären natürlich auch nicht schlecht. kann jedoch auch verstehn wenn ihr mir hier das "spiel" nicht kompl. schreiben wollt.
also, ich brauche:
-"wachsen" funktion
-"highscore" funktion
-"durch die wände gehn" funktion
-"multiplayer" modus
-"schwierigkeitsmodus" einstellung
angehängt hab ich hier meine 3 units. aus denen das Spiel besteht. (*update: nun auch den Snake Ordner) Bin für jede Kritik offen. Für jeden Tipp umsomehr, und wenns dann noch nen geänderter Quelltext von mir ist, boah das wär ja DER Bonus =P.
Gruß
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99:
| unit u_snake;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, U_Snakeklasse, U_Apfelklasse;
type Tspielfeld = class(TForm) bild: TImage; Timer1: TTimer; Label1: TLabel; Punkte: TLabel; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); end;
var spielfeld: Tspielfeld; snake : Tsnake; apfel : tapfel;
implementation
{$R *.dfm}
procedure Tspielfeld.FormCreate(Sender: TObject); begin bild.canvas.Pen.Width:=2; bild.canvas.Brush.Color:=clwhite ; bild.canvas.Rectangle(0,0,bild.width,bild.height); bild.canvas.brush.Style:=bssolid; bild.canvas.Pen.Width:=1; bild.canvas.pen.mode:=pmNOTXOR;
snake.init(clgreen,random(30)*20,Random(20)*20,0,1,10); snake.zeigedich(Bild.Canvas); apfel.init(clred,random(30)*20,Random(20)*20,10); apfel.zeigeDich(Bild.Canvas); end;
procedure Tspielfeld.Timer1Timer(Sender: TObject); var i, laenge:integer; begin snake.zeigedich(Bild.Canvas); snake.bewegedich(Bild); if (snake.x[1]=apfel.a) and (snake.y[1]=apfel.b) then begin Punkte.caption:=inttostr(strtoint(Punkte.Caption)+1); apfel.zeigeDich(Bild.Canvas); apfel.init(clred,random(30)*20,Random(20)*20,10); apfel.zeigeDich(Bild.Canvas); laenge:= laenge+1; end; snake.zeigedich(Bild.Canvas); end;
procedure Tspielfeld.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin case key of 37: begin snake.vx:=-1; snake.vy:=0; end; 38: begin snake.vy:=-1; snake.vx:=0; end; 39: begin snake.vx:=1; snake.vy:=0; end; 40: begin snake.vy:=1; snake.vx:=0; end; end; end;
initialization randomize; snake:= tsnake.Create; apfel:= tapfel.create;
finalization snake.Destroy; apfel.destroy;
end. |
Alles was den 'Apfel' betrifft 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| unit U_Apfelklasse;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type tapfel = class a,b,c: integer; farbe: Tcolor; procedure init(fNeu: Tcolor; xNeu, yNeu, rNeu: integer); procedure zeigeDich(Canvas:TCanvas); end;
implementation
procedure tapfel.init(fNeu: Tcolor; xNeu, yNeu, rNeu: integer); begin farbe:= fNeu; a:= xNeu; b:= yNeu; c:= rNeu; end;
procedure tapfel.zeigedich(Canvas:TCanvas); begin Canvas.Brush.Color:=Farbe; Canvas.ellipse(a,b,a+2*c,b+2*c); end;
end. |
Alles was Snake (wohl auch d. 'wachsen') betrifft 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71:
| unit U_Snakeklasse;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type tsnake = class x,y: array[1..1000] of integer; vx,vy,r,laenge:integer; farbe:tcolor; procedure init(fneu:tcolor; xneu,yneu,vxneu,vyneu,rneu:integer); procedure zeigedich(Canvas:TCanvas); procedure bewegedich(Image:TImage); end;
implementation
procedure tsnake.init(fneu:tcolor; xneu,yneu,vxneu,vyneu,rneu:integer); var i: integer; begin farbe:= fneu; for i:=2 to 1000 do begin x[i] := -1000; y[i] := -1000; end; vx := vxneu; vy := vyneu; r := rneu; laenge:=1; end;
procedure tsnake.zeigedich(Canvas:TCanvas); var i: integer; begin canvas.Brush.Color:=Farbe; for i:=1 to laenge do canvas.Rectangle(x[i],y[i],x[i]+2*r,y[i]+2*r); end;
procedure tsnake.bewegedich(Image:TImage); begin x[1] := x[1]+2*r*vx; y[1] := y[1]+2*r*vy; if (x[1]>Image.Width-2*r) then begin x[1]:=Image.Width-4*r; vx:=-vx; end; if x[1]<0 then begin x[1]:=2*r; vx:=-vx; end; if (y[1]>Image.Height-2*r) then Begin y[1]:=Image.Height-4*r; vy:=-vy; end; if y[1]<0 then begin y[1]:=2*r; vy:=-vy; end; end;
end. |
Einloggen, um Attachments anzusehen!
|
|
wulfskin
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: Do 28.09.06 22:17
Hallo,
zum Thema wachsen: Merk dir in einer Liste die letzten x-Koordinaten, wo du Dinge eingesammelt hast und mal diese einfach auf, dann wächst sie auch.
Edit: Sorry, hab jetzt gesehen, dass du schon ein Array zum Speichern hast. Leider befüllst du ihn nie, sondern benutzt immer nur Position eins...
Gruß Hape!
_________________ Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
Zuletzt bearbeitet von wulfskin am Do 28.09.06 22:33, insgesamt 1-mal bearbeitet
|
|
battledevil
      
Beiträge: 96
WinXP, Win7
C#, C++, VBNET
|
Verfasst: Do 28.09.06 22:25
Hi blackmarket,
Natürlich wäre es einfach, dir hier einfach einen kompletten quellcode zu geben, aber da wäre der lerneffekt für dich ja gleich null. Außerdem wirst du mit der Suchfunktion bestimmt ein paar Snakes finden...
Zu deinem Programm:
Die Prozedur bewegdich muss natürlich für die gesamte länge der schlange durchgeführt werden, nicht nur für den kopf (feld 1). Wie das geht? Der Kopf wird wie gehabt mit den Tasten gesteuert, der nachfolgende Schwanz wird hinterhergezogen. Dabei nimmt jedes Feld in einem Bewegungsschritt die Position des Vorgängers an.
Dieses Hinterherziehen implementiert man am einfachsten, indem man im Timer in jedem Bewegungsschritt die alte Positionen nach dem Zeichnen der Schlange und vor der Neuberechnung der Kopfkoordinaten an die Nachfolger weitergibt. In etwa geht das so:
Delphi-Quelltext 1: 2: 3: 4: 5:
| for i:=2 to laenge do begin x[i]:=x[i-1]; y[i]:=y[i-1]; end; |
Die Länge der Schlange ist in der Variable laenge gespeichert und wenn du die Schlange wachsen lassen willst, dann mußt Du nur den Wert von laenge erhöhen (am besten, wenn sie gerade einen Apfel gefressen hat.
|
|
|