AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Facharbeit: Vereinfachtes, Listenbasiertes Tetris
Thema durchsuchen
Ansicht
Themen-Optionen

Facharbeit: Vereinfachtes, Listenbasiertes Tetris

Offene Frage von "shervine"
Ein Thema von shervine · begonnen am 18. Mär 2010 · letzter Beitrag vom 20. Mär 2010
Antwort Antwort
Seite 1 von 2  1 2      
shervine

Registriert seit: 18. Mär 2010
6 Beiträge
 
#1

Facharbeit: Vereinfachtes, Listenbasiertes Tetris

  Alt 18. Mär 2010, 18:30
Hallo erstmal

Ich bin so verzweifelt, dass ich mich extra in nem Delphi-Forum angemeldet hab o_O

Also ich schreib meine Facharbeit in Informatik, ein vereinfachtes, listenbasiertes Tetris
Wäre ich nicht unter Zeitdruck würd ich mich ja vorstellen und so, aber da ich meine Facharbeit bis Montag einreichen muss und bisher am Verzweifeln bin, mach ich es kurz:
Ich soll ein vereinfachtes Tetris programmieren, welches auf Listen basier, Programmiersprache: Delphi7
Bedenkt bitte, dass ich erst seit der 11 in Delphi programmiere und auch abgesehen von Schule 0 mit Informatik zu tun hab
Und ja, das Thema ist kacke, man hätte es anders machen können, etc. aber es ist halt jetzt einfach so^^

Aktuelles Problem:
Bei TCurrent.draw; tritt eine EAccessViolation auf... Das Problem liegt ziemlich genau hier:
If SteinListe.findelem(k.copy)<>Nil Then Form1.Image1.Canvas.Rectangle((k.x*50)-50,(k.y*50)-50, k.x, k.y); Es wird nämlich versucht, von NIL eine procedure aufzurufen, sprich
Code:
TListe.findElemFromCurrentPos(nil) führt dazu, dass NIL.compare versucht wird und alles spektakulär abstürzt

Hier mal mein gesamter Quelltext (ich vermute, dass es am Compare scheitert, bin aber nicht sicher):

Für sonstige Anregungen/Verbesserungsvorschläge bin ich sehr offen

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class (TForm)
    Image1: TImage;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure play;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
type
  TStein = class (TBase)
  private
    x,y:integer;
  public
    constructor create(a,b:integer);
    function compare(tb:TBase):integer;OVERRIDE;
    function copy:TBase;OVERRIDE;

end;
type
  TBlock = class
  private
    a,b,c,d: TStein;
  public
    constructor create(w,x,y,z:TStein);
    procedure drop;
    function iswand(cc:TStein):boolean;
    procedure check;
    procedure draw;
    procedure right;
    procedure left;
end;

var
  Form1: TForm1;
  Block:TBlock;
  Stein:TStein;
  SteinListe:TListe;

implementation

{$R *.dfm}

function TStein.compare(tb:TBase):integer;
begin
  If x < TStein(tb).x Then result:=-1;
  If x > TStein(tb).x Then result:=+1;
  If y < TStein(tb).y Then result:=-1;
  If y > TStein(tb).y Then result:=+1;
  If (x = TStein(tb).x) AND (y = TStein(tb).y) Then result:=0;
end;

constructor TStein.create(a,b:integer);
begin
  x:=a;
  y:=b;
end;

function TStein.copy:TBase;
begin
result:=TStein.create(x,y);
end;

procedure TBlock.right;
begin
  IF (a.x<10) AND (b.x<10) AND (c.x<10) AND (d.x<10)
  Then
    Begin
      If SteinListe.findElem(a.copy)<>Nil Then begin a:=TStein.create((a.x)+1,(a.y)); SteinListe.update(a.copy); End;
      If SteinListe.findElem(b.copy)<>Nil Then begin b:=TStein.create((b.x)+1,(b.y)); SteinListe.update(b.copy); End;
      If SteinListe.findElem(c.copy)<>Nil Then begin c:=TStein.create((c.x)+1,(c.y)); SteinListe.update(c.copy); End;
      If SteinListe.findElem(d.copy)<>Nil Then begin d:=TStein.create((d.x)+1,(d.y)); SteinListe.update(d.copy); End;
      draw;
    end;
End;

Procedure TBlock.left;
Begin
  IF (a.x>0) AND (b.x>0) AND (c.x>0) AND (d.x>0)
  Then
    Begin
      If SteinListe.findElem(a.copy)<>Nil Then begin a:=TStein.create((a.x)-1,(a.y)); SteinListe.update(a.copy); End;
      If SteinListe.findElem(b.copy)<>Nil Then begin b:=TStein.create((b.x)-1,(b.y)); SteinListe.update(b.copy); End;
      If SteinListe.findElem(c.copy)<>Nil Then begin c:=TStein.create((c.x)-1,(c.y)); SteinListe.update(c.copy); End;
      If SteinListe.findElem(d.copy)<>Nil Then begin d:=TStein.create((d.x)-1,(d.y)); SteinListe.update(d.copy); End;
      draw;
    end;
End;


constructor TBlock.create(w,x,y,z:TStein);
begin
  a:=w; SteinListe.insertlast(w);
  b:=x; SteinListe.insertlast(c);
  c:=y; SteinListe.insertlast(y);
  d:=z; SteinListe.insertlast(z);
end;

procedure TBlock.drop;
begin
  While (iswand(a)=false) AND (iswand(b)=false) AND (iswand(c)=false) AND (iswand(d)=false)
  Do
    Begin
      If SteinListe.findElem(a.copy)<>Nil Then begin a:=TStein.create((a.x),(a.y)+1); SteinListe.update(a.copy); End;
      If SteinListe.findElem(b.copy)<>Nil Then begin b:=TStein.create((b.x),(b.y)+1); SteinListe.update(b.copy); End;
      If SteinListe.findElem(c.copy)<>Nil Then begin c:=TStein.create((c.x),(c.y)+1); SteinListe.update(c.copy); End;
      If SteinListe.findElem(d.copy)<>Nil Then begin d:=TStein.create((d.x),(d.y)+1); SteinListe.update(d.copy); End;
      draw;
      sleep(500);
      application.processmessages;
    End;
  check;
end;

function TBlock.iswand(cc:TStein):boolean;
var bi:TStein;
begin
result:=false;
Bi:=TStein.create(cc.x,(cc.y)+1);
If (SteinListe.findelem(bi.copy)<>NIL)
Then result:=true;
If (bi.y)>12
Then result:=true;
end;


procedure TBlock.check;
var Ai:integer;

function checkone(ac:integer):boolean;
var kx,i : integer; k:TStein;
begin
i:=0;
For kx:=1 to 10 Do
  Begin
    k:=TStein.create(kx,ac);
    If SteinListe.lookUp(k.copy)<>NIL
    Then i:=i+1;
  End;
If i=10 Then result:=true Else result:=false;

End;

procedure dropall;
var k:TStein; xi,yi:integer;
begin
  For Yi:=1 to 13 Do
    Begin
      For Xi:=1 to 10 Do
        Begin
          k:=TStein.create(xi,yi+1);
          If SteinListe.findElem(k.copy)<>Nil Then SteinListe.update(k.copy);
        End;
      End;
End;

begin
For Ai:=1 to 13 Do
  Begin
    If checkone(AI) Then
      Begin
        dropall;
        draw;
      end;
end;
end;

procedure TBlock.draw;
var k:TStein; xi,yi:integer;
begin
For Yi:=1 to 13 Do
    Begin
      For Xi:=1 to 10 Do
        Begin
          k:=TStein.create(xi,yi);
          If SteinListe.findelem(k.copy)<>Nil Then Form1.Image1.Canvas.Rectangle((k.x*50)-50,(k.y*50)-50, k.x, k.y);
        End;
      End;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Image1.Canvas.brush.Color:=clblue;
SteinListe:=TListe.create;
end;

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

procedure TForm1.play;
begin
randomize;
CASE random(6) OF
1: Begin Block:=TBlock.create(TStein.create(4,1),TStein.create(5,1),TStein.create(6,1),TStein.create(6,2)) end;
2: Begin Block:=TBlock.create(TStein.create(4,1),TStein.create(5,1),TStein.create(6,1),TStein.create(4,2)) end;
3: Begin Block:=TBlock.create(TStein.create(4,2),TStein.create(5,1),TStein.create(6,1),TStein.create(5,2)) end;
4: Begin Block:=TBlock.create(TStein.create(4,1),TStein.create(5,1),TStein.create(6,2),TStein.create(5,2)) end;
5: Begin Block:=TBlock.create(TStein.create(4,2),TStein.create(5,2),TStein.create(6,2),TStein.create(3,2)) end;
0: Begin Block:=TBlock.create(TStein.create(4,1),TStein.create(5,1),TStein.create(5,2),TStein.create(4,2)) end;
end;
Block.draw;
Block.drop;
Block.draw;
play;
end;
INITIALIZATION
  registerclass(TStein);
end.
So far, vielen Dank im Vorraus und wäre über schnelle Hilfe unglaublich dankbar


MfG,
shervine
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Aussagekräftiger Titel

  Alt 18. Mär 2010, 18:38
Bitte gib deinem Beitrag einen aussagekräftigen Titel. Der jetzige Titel lässt nicht erkennen, um was für ein Problem oder Frage es sich handelt. Um den Titel zu ändern, editiere einfach deinen ersten Beitrag. Damit erleichterst du das Auffinden deines Beitrages mit der Suche und ersparst anderen Mitglieder ein unnötiges Öffnen deines Beitrages.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
shervine

Registriert seit: 18. Mär 2010
6 Beiträge
 
#3

Re: Hilfe bei Facharbeit (EAccess Violation) u.v.m.

  Alt 18. Mär 2010, 18:42
Kann doch nicht schaden, wenn der Thread öfter geöffnet wird xP
Ich find EAccessViolation ist schon relativ stark eingegrenzt, aber ich änder es nochmal
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Facharbeit: Vereinfachtes, Listenbasiertes Tetris

  Alt 18. Mär 2010, 18:48
Na dann such mal nach EAccessViolation hier im Forum.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
shervine

Registriert seit: 18. Mär 2010
6 Beiträge
 
#5

Re: Facharbeit: Vereinfachtes, Listenbasiertes Tetris

  Alt 18. Mär 2010, 18:54
Hab ich schon vor der Registrierung^^

Da muss ich dir Recht geben
  Mit Zitat antworten Zitat
shervine

Registriert seit: 18. Mär 2010
6 Beiträge
 
#6

Re: Facharbeit: Vereinfachtes, Listenbasiertes Tetris

  Alt 20. Mär 2010, 13:11
Benötige immer noch dringende Hilfe Abgabe ist am Montag, ich schreib zwar grad den Textteil dazu, wie es funktionieren sollte, aber ein funktionierendes Programm ist immer besser
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Facharbeit: Vereinfachtes, Listenbasiertes Tetris

  Alt 20. Mär 2010, 13:17
Das Problem ist,d u hast uns hier einfach Quellcode vor die Füße geworfen. Eine Fehlermeldung hast du uns zwar genannt, aber nicht wo und wann sie im Quellcode auftritt. Was sollen wir jetzt machen? Im Kopf dein ganzes Programm debuggen? Uns aus dem Quellcode mühsam ein lauffähiges Projekt erstellen? Also entweder grenzt du die Fehlerquelle selber etwas ein oder du hängst hier mal das ganze Projekt an.

Hast du denn schon selber mal das Projekt debuggt? Haltepunkte gesetzt und/oder mal in Einzelschritten den Code durchgegangen und dir mal die Werte der Variablen angeguckt? Die Zugriffsverletzung deutet darauf hin, dass du auf ein nicht initialisiertes Objekt zugreifst oder in einem dynamischen Array auf einen nicht vorhandenes Element außerhalb des Arrays.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
shervine

Registriert seit: 18. Mär 2010
6 Beiträge
 
#8

Re: Facharbeit: Vereinfachtes, Listenbasiertes Tetris

  Alt 20. Mär 2010, 14:13
Ich hab doch oben die Prozedur genannt, an der alles scheitert und sogar schon rausgefunden, dass NIL als Parameter weitergegeben wird, was unweigerlich zum Absturz führt

Aber bitte, hier das gesamte Projekt
Angehängte Dateien
Dateityp: rar facharbeit_classversion_xx_691.rar (217,9 KB, 6x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Facharbeit: Vereinfachtes, Listenbasiertes Tetris

  Alt 20. Mär 2010, 14:25
Na dann übergib eben nicht NIL.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
shervine

Registriert seit: 18. Mär 2010
6 Beiträge
 
#10

Re: Facharbeit: Vereinfachtes, Listenbasiertes Tetris

  Alt 20. Mär 2010, 14:29
Da liegt ja das Problem

Ich hab keinen blassen Schimmer, wieso dort NIl übergeben wird


An der Klasse TListe/TListNode kann es nicht liegen, die funktionierte immer fehlerfrei (genauso wie ihre Methoden), immerhin hab ich die auch von der Schule bekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 13:01 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