![]() |
Snake umschreiben
also ich habe folgendes problem:
ich hab ein zeichenprogramm programmiert mit malen, rechtec usw, ähnlich wie paint. meine lehrerin sagte nun, denk dir mal noch irgendwas special-mäßiges aus und meine idee ist jetzt, ein snake dort einzubinden (pause-knopf welches neues fenster öffnet mit snake spiel drin) hab bei youtube den unten angeführten quelltext gefunden in einem tutorial, dachte mir, ich mach ihn in ein neues formular, schreib das in ne neue unit (bei mit Unit3) und programmier den knopf so, dass er das andere formular beim anklicken anzeigt. (showmodul ...) hab an uses unit3 und sowas alles gedacht in der hauptunit. trotzdem funktioniert es nicht. er hat immer ein problem mit dem erstellen der tForm1 sagt er mir, obwohl das ja tForm3 sein soll... wenn ich die eins durch ne drei ersetze funktioniert es trotzdem nicht. was kann ich tuen, dass alles so funktioniert, wie ich will?? nutze Delphi 6! Resi
Code:
unit Unit3;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TSnake = class(TObject) private // Private Deklarationen rTeile : array [0..40*30-1] of TPoint; rAnzahlTeile : Word; rCanvas : TCanvas; rRichtung : Byte; rWurdeBewegt : Boolean; function LiesTeil( Index : Word ) : TPoint; function PruefeObTot() : Boolean; procedure AendereRichtung( NeueRichtung : Byte ); public // Öffentliche Deklarationen property Teile[ Index : Word ] : TPoint read LiesTeil; property AnzahlTeile : Word read rAnzahlTeile; property Canvas : TCanvas read rCanvas write rCanvas; property Richtung : Byte read rRichtung write AendereRichtung; property IstTot : Boolean read PruefeObTot; procedure Init(); procedure Render(); procedure Update(); procedure Wachse(); end; TForm1 = class(TForm) Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Timer1Timer(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private-Deklarationen } Schlange : TSnake; Haeppchen : TPoint; Pause : Boolean; procedure SetzeHaeppchen(); public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} { --- Snake Bereich --- } function TSnake.LiesTeil( Index : Word ) : TPoint; begin result := rTeile[ Index ]; end; procedure TSnake.Init(); begin rAnzahlTeile := 2; rTeile[0] := Point( 2, 0 ); rTeile[1] := Point( 1, 0 ); rTeile[2] := Point( 0, 0 ); rRichtung := 3; rWurdeBewegt := true; end; procedure TSnake.Render(); var Index : Word; StartX, StartY : Integer; EndeX, EndeY : Integer; begin rCanvas.Pen.Color := clGreen; rCanvas.Brush.Color := clGreen; for Index := 0 to rAnzahlTeile do begin StartX := rTeile[Index].X * 16; EndeX := rTeile[Index].X * 16 + 16; StartY := rTeile[Index].Y * 16; EndeY := rTeile[Index].Y * 16 + 16; rCanvas.Ellipse( StartX, StartY, EndeX, EndeY ); end; end; procedure TSnake.Update(); var Index : Word; begin for Index := rAnzahlTeile downto 1 do begin rTeile[Index] := rTeile[Index-1]; end; case rRichtung of 0: begin // Hoch rTeile[0].Y := rTeile[0].Y - 1; if ( rTeile[0].Y < 0 ) then rTeile[0].Y := 29; rWurdeBewegt := true; end; 1: begin // Runter rTeile[0].Y := rTeile[0].Y + 1; if ( rTeile[0].Y > 29 ) then rTeile[0].Y := 0; rWurdeBewegt := true; end; 2: begin // Links rTeile[0].X := rTeile[0].X - 1; if ( rTeile[0].X < 0 ) then rTeile[0].X := 39; rWurdeBewegt := true; end; 3: begin // Rechts rTeile[0].X := rTeile[0].X + 1; if ( rTeile[0].X > 39 ) then rTeile[0].X := 0; rWurdeBewegt := true; end; end; end; procedure TSnake.AendereRichtung( NeueRichtung : Byte ); begin if not rWurdeBewegt then Exit; case rRichtung of 0, 1: begin if NeueRichtung = 0 then Exit; if NeueRichtung = 1 then Exit; end; 2, 3: begin if NeueRichtung = 2 then Exit; if NeueRichtung = 3 then Exit; end; end; rRichtung := NeueRichtung; rWurdeBewegt := false; end; procedure TSnake.Wachse(); begin rAnzahlTeile := rAnzahlTeile + 1; end; function TSnake.PruefeObTot() : Boolean; var Index : Word; begin for Index := 1 to rAnzahlTeile do begin if ( rTeile[ 0 ].X = rTeile[ Index ].X ) and ( rTeile[ 0 ].Y = rTeile[ Index].Y ) then begin result := true; Exit; end; end; result := false; end; { --- Fenster Bereich --- } procedure TForm1.FormCreate(Sender: TObject); begin Schlange := TSnake.Create; Schlange.Canvas := Self.Canvas; Schlange.Init(); Self.DoubleBuffered := true; Randomize(); SetzeHaeppchen(); Pause := true; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Schlange.Free; end; procedure TForm1.Timer1Timer(Sender: TObject); begin if ( Pause ) then begin Caption := 'Snake - Pause'; end else begin Caption := 'Snake'; end; Self.Canvas.Pen.Color := clWhite; Self.Canvas.Brush.Color := clWhite; Self.Canvas.Rectangle( 0, 0, ClientWidth, ClientHeight ); Self.Canvas.Pen.Color := clRed; Self.Canvas.Brush.Color := clRed; Self.Canvas.Ellipse( Haeppchen.X * 16, Haeppchen.Y * 16, Haeppchen.X * 16 + 16, Haeppchen.Y * 16 + 16 ); if ( not Pause ) then Schlange.Update(); Schlange.Render(); if ( Schlange.IstTot ) then begin Timer1.Enabled := false; ShowMessage( 'Du hast verloren!' ); Schlange.Init(); SetzeHaeppchen(); Timer1.Enabled := true; end; if ( Schlange.Teile[ 0 ].X = Haeppchen.X ) and ( Schlange.Teile[ 0 ].Y = Haeppchen.Y ) then begin Schlange.Wachse(); SetzeHaeppchen(); end; end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if ( not Pause ) then begin if Key = VK_UP then Schlange.Richtung := 0; if Key = VK_DOWN then Schlange.Richtung := 1; if Key = VK_LEFT then Schlange.Richtung := 2; if Key = VK_RIGHT then Schlange.Richtung := 3; end; if Key = VK_SPACE then Pause := not Pause; end; procedure TForm1.SetzeHaeppchen(); var Spielfeld : array [0..39, 0..29] of Integer; X, Y : Integer; Index : Integer; FreieFelder : array [0..40*30-1] of TPoint; AnzahlFelder : Integer; begin for Y := 0 to 29 do begin for X := 0 to 39 do begin Spielfeld[ X, Y ] := 0; end; end; for Index := 0 to Schlange.AnzahlTeile do begin Spielfeld[ Schlange.Teile[Index].X, Schlange.Teile[Index].Y ] := 1; end; AnzahlFelder := 0; for Y := 0 to 29 do begin for X := 0 to 39 do begin if Spielfeld[X , Y] = 0 then begin FreieFelder[AnzahlFelder] := Point(X, Y); AnzahlFelder := AnzahlFelder + 1; end; end; end; Index := Random(AnzahlFelder + 1); Haeppchen.X := FreieFelder[Index].X; Haeppchen.Y := FreieFelder[Index].Y; end; end. |
AW: Snake umschreiben
Zitat:
Und was hat der Titel mit dem Problem zu tun? Dein Problem ist doch, dass sich das Formular mit dem Snakespiel nicht öffnet. Davon mal abgesehen, ob deine Lehrerin mit etwas besondern meinte, dass du Quelltext aus dem Internet kopieren und einfach benutzen sollst, wage ich zu bezweifeln. Und ob ein Spiel zu einem Zeihenprogramm passt, weiß ich auch nicht so richtig. Wie wäre es mit der Programmierung eines Farbverlaufs oder so? also etwas, was zum Rest des Programms passt. |
AW: Snake umschreiben
naja aber mit so einfachen spielprogrammierungen hab ich weniger probleme als mit anderen zeichenprogramm sachen ..
hab zum beispiel eine vertikal spiegeln taste - aber das verzieht das bild nur, deswegen dachte ich mir, bin ich mit nem spiel besser bedient, da versteh ich den quelltext einfach besser naja da kommt nur "Fehler - TForm1 konnte nicht erzeugt werden!" |
AW: Snake umschreiben
man wächst an den Herausforderungen ...
|
AW: Snake umschreiben
Versuch doch erst mal das Snake in einem neuen Projekt, ohne Zeichenprogramm. Wenn es dann funktioniert kannst versuchen beide zu kombinieren.
Bessere Namen sind hier auch hilfreich. Das TForm für Snake könnte z.B. SnakeForm oder so heißen, dann wird es übersichtlicher. |
AW: Snake umschreiben
Ich bin selbst noch nicht die längste Zeit dabei. Ich kann dir aber versichern, dass du von der ganzen Geschichte nur etwas hast, wenn du auch verstehst was du zusammenkopierst.
Übernehmen ist ja in manchen Fällen okay und gut. Aber man sollte doch verstanden haben was passiert. Vielleicht hilft dir diese Einführung in das Erzeugen von Objekten. Der Befehl, welchen du zur Modalen Ansicht einer Form brauchst, ist dann nurnoch:
Delphi-Quellcode:
Wobei du da vielleicht noch auf die Bezeichner für deine globalen Variablen achten solltest.
Form1.ShowModal;
divBy0 hat dir ja schon eine gute Vorgehensweise vorgeschlagen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:54 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