AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Snake umschreiben

Offene Frage von "Jonas Shinaniganz"
Ein Thema von resyiii · begonnen am 6. Mär 2012 · letzter Beitrag vom 6. Mär 2012
Antwort Antwort
resyiii

Registriert seit: 11. Mär 2009
Ort: Oranienburg
31 Beiträge
 
#1

Snake umschreiben

  Alt 6. Mär 2012, 20:57
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
35.102 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Snake umschreiben

  Alt 6. Mär 2012, 21:08
Zitat:
trotzdem funktioniert es nicht.
er hat immer ein problem mit dem erstellen der tForm1 sagt er mir,
Geht das etwas genauer?

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.
Michael
"Every language has an optimization operator. In Delphi that operator is: //"
  Mit Zitat antworten Zitat
resyiii

Registriert seit: 11. Mär 2009
Ort: Oranienburg
31 Beiträge
 
#3

AW: Snake umschreiben

  Alt 6. Mär 2012, 21:13
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!"

Geändert von resyiii ( 6. Mär 2012 um 21:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.455 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: Snake umschreiben

  Alt 6. Mär 2012, 21:14
man wächst an den Herausforderungen ...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von divBy0
divBy0

Registriert seit: 4. Mär 2007
Ort: Sponheim
989 Beiträge
 
Delphi XE2 Professional
 
#5

AW: Snake umschreiben

  Alt 6. Mär 2012, 21:22
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.
Marc
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt, die 10. summt die Melodie von Tetris... | Wenn das die Lösung ist, dann hätte ich gerne mein Problem zurück! | engbarth.es
  Mit Zitat antworten Zitat
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
236 Beiträge
 
Delphi XE5 Ultimate
 
#6

AW: Snake umschreiben

  Alt 6. Mär 2012, 21:28
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:


Form1.ShowModal; Wobei du da vielleicht noch auf die Bezeichner für deine globalen Variablen achten solltest.

divBy0 hat dir ja schon eine gute Vorgehensweise vorgeschlagen.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2014 by Daniel R. Wolf