AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem bei Snake

Ein Thema von Longhorn123 · begonnen am 4. Nov 2006 · letzter Beitrag vom 5. Nov 2006
Antwort Antwort
Longhorn123

Registriert seit: 3. Nov 2006
2 Beiträge
 
#1

Problem bei Snake

  Alt 4. Nov 2006, 14:16
Ich wollte mal Snake in Delphi Programmieren, vorab schon mal der Code:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Timer1: TTimer;
    BRechts: TButton;
    BLinks: TButton;
    BUnten: TButton;
    BOben: TButton;
    PaintBox1: TPaintBox;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure BObenClick(Sender: TObject);
    procedure BLinksClick(Sender: TObject);
    procedure BRechtsClick(Sender: TObject);
    procedure BUntenClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);

  private
    { Private-Deklarationen }

map: Array [0..500] of Array [0..450] of Integer;
kopf, richtung, futter: TPoint;
laenge: Integer;
ende: Boolean;
procedure spiel_ende;
procedure neues_futter;
procedure paint_map;
procedure calc_snake;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  calc_snake;
  if not ende then
    paint_map;

end;

procedure TForm1.spiel_ende;
begin
  ende := True;
  Timer1.Enabled := False;
  BOBen.Enabled := False;
  BUnten.Enabled := False;
  BLinks.Enabled := False;
  BRechts.Enabled := False;
  Button1.Enabled := True;
end;

procedure TForm1.neues_futter;
begin
  while map[futter.X, futter.Y] <= 0 do
  futter := Point(Random(PaintBox1.Width)+1, Random(PaintBox1.Height)+1);
  map[futter.X,futter.Y] := -1;
end;

procedure TForm1.paint_map;
var
  i,j: Integer;
  col: TColor;
begin
  for i := 0 to PaintBox1.Width do
    for j := 0 to PaintBox1.Height do
    begin
      case map[i,j] of
        -1: col := clyellow;
         0: col := clgreen;
      else
        col := clred;
      end;
      Paintbox1.Canvas.Brush.Color:= col;
      Paintbox1.Canvas.FillRect(Rect(i*7, j*7, (i+1)*7, (j+1)*7));
    end;
end;

procedure TForm1.calc_snake;
var
  i, j: Integer;
begin
  for i := 0 to Paintbox1.Width do
    for j := 0 to Paintbox1.Height do
      if map[i,j]>0 then
        Dec(map[i,j]);
  Inc(kopf.X, richtung.X);
  Inc(kopf.Y, richtung.Y);
  if (kopf.X<0) or (kopf.X>=PaintBox1.Width) or (kopf.Y<0) or (kopf.Y>=Paintbox1.Height) then
  begin
    spiel_ende;
    ShowMessage('Das Spiel ist zu Ende');
  end;
  if (map[kopf.X,kopf.Y]>0) and (not ende) then
  begin
    spiel_ende;
    ShowMessage('Das Spiel ist zu Ende');
  end;
  if (kopf.X=futter.X) and (kopf.Y=futter.Y) then
  begin
    Inc(laenge);
    neues_futter;
  end;
  map[kopf.X, kopf.Y] := laenge;
end;

procedure TForm1.Button1Click(Sender: TObject);
Var
  i,j : Integer;
begin
  Button1.Enabled := False;
  for i:=0 to Paintbox1.Width do
    for j:=0 to Paintbox1.Height do
      map[i,j] := 0;
  kopf := Point(20, 20);
  richtung := Point (1,0);
  laenge:= 5;
  map[kopf.X, kopf.Y] := laenge;
  neues_futter;
  paint_map;
  Timer1.Enabled := True;
  BOben.Enabled := True;
  BUnten.Enabled := True;
  BLinks.Enabled := True;
  BRechts.Enabled := True;
  ende := False;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   if Button2.Caption = 'Pausethen
    begin
      Timer1.Enabled := False;
      Button2.Caption := 'Fortfahren';
      exit;
    end;
   if Button2.Caption = 'Fortfahrenthen
   begin
     Timer1.Enabled := True;
     Button2.Caption := 'Pause';
   end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 Application.Terminate
end;

procedure TForm1.BObenClick(Sender: TObject);
begin
  if richtung.Y= 0 then
    richtung := Point(0, -1);
end;

procedure TForm1.BLinksClick(Sender: TObject);
begin
  if richtung.X= 0 then
    richtung := Point(-1, 0);
end;

procedure TForm1.BRechtsClick(Sender: TObject);
begin
  if richtung.X= 0 then
    richtung := Point(1, 0);
end;

procedure TForm1.BUntenClick(Sender: TObject);
begin
  if richtung.Y= 0 then
    richtung := Point(0, 1);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  Timer1.Interval := 1500;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
  Timer1.Interval := 1000;
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
  Timer1.Interval := 10;
end;

end.
Allerdings hab ich folgendes Problem: Der Punkt (also das Futter) ist immer in der Schlange selbst! Wie könnte ich diesen an einem belibigen Ort in der Paintbox einfügen? Auch wundert es mich das mein Programm bei mir seeehhhhrrr langsam läuft, selbst wenn der Interval des Timers auf 10 gesetzt wird läuft die Schlange nur mit gemählicher Geschwindigkeit, könnte dies vielleicht an den doppelten Schleifen liegen die ich eingefügt habe? Wisst ihr vielleicht eine bessere Lösung? Vorab schon mal danke für euro antworten..........
  Mit Zitat antworten Zitat
Longhorn123

Registriert seit: 3. Nov 2006
2 Beiträge
 
#2

Re: Problem bei Snake

  Alt 4. Nov 2006, 19:32
Hatt den wirklich niemand von euch eine Idee?
Für mich wäre es auch wichtig zu klären ob es eine Alternative zu den doppelten Schleifen gibt:
Delphi-Quellcode:
for i:=0 to Paintbox1.Width do
    for j:=0 to Paintbox1.Height do
      map[i,j] := 0;
Gibt des den keine Allternative dazu?
Mir sind nur while, repeat, with und for-Schleifen bekannt gibt es den keine anderen Möglichkeiten???????
  Mit Zitat antworten Zitat
Nicolai1234

Registriert seit: 21. Feb 2004
1.008 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Problem bei Snake

  Alt 4. Nov 2006, 19:40
Zitat von Longhorn123:
Hatt den wirklich niemand von euch eine Idee?
Für mich wäre es auch wichtig zu klären ob es eine Alternative zu den doppelten Schleifen gibt:
Delphi-Quellcode:
for i:=0 to Paintbox1.Width do
    for j:=0 to Paintbox1.Height do
      map[i,j] := 0;
Gibt des den keine Allternative dazu?
Mir sind nur while, repeat, with und for-Schleifen bekannt gibt es den keine anderen Möglichkeiten???????
Sehe ich es richtig, dass ein Feld im Spiel bei dir nur 1 Pixel groß ist. Dann wird das ganze doch etwas unübersichtlich.

Aber eigentlich ist die Lösung schon o.
Wie groß ist denn dein Spielfeld dann?
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Problem bei Snake

  Alt 5. Nov 2006, 12:33
Mit der Suchfunktion findest du etliche Beiträge über Snake. Vielleicht findest du da ja Anregungen.
  Mit Zitat antworten Zitat
Antwort Antwort


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 · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz