AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein debugger Exception - pacman macht probleme
Thema durchsuchen
Ansicht
Themen-Optionen

debugger Exception - pacman macht probleme

Ein Thema von mr.winkle · begonnen am 9. Jun 2006 · letzter Beitrag vom 11. Jun 2006
Antwort Antwort
mr.winkle

Registriert seit: 25. Mai 2006
98 Beiträge
 
Delphi 7 Personal
 
#1

debugger Exception - pacman macht probleme

  Alt 9. Jun 2006, 17:38
Tag alle zusammen!
Ich hab ein kleines Problem mit nem Programm.
Ich bekommen eine "Benachrichtung über Debugger-Exception" und weiß echt nicht wieso.

Das Programm soll Blöcke anzeigen und einen gelben kreis der sich darin bewegen kann - soll nachher mal so ähnlich wie pacman werden.

Bei
for i:=1 to high(block) do showblock(i); (ganz unten im ontimer ereignis)
gibts diesen Fehler, blau markiert ist dann die zeile
rectangle(bx,by,bx+21,by+21); in tblock.show.

Delphi-Quellcode:
unit Unit1;

interface

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

type

  tspieler=class(Tobject)
    x,y:integer;
    procedure show;
    procedure bewegen(dir:string);
  end;

  tblock = class(TObject)
    bx,by:integer;
    da:boolean;
    procedure show;
  end;

  TForm1 = class(TForm)
    Image1: TImage;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure malelevel(r:integer);
    procedure Timer1Timer(Sender: TObject);
  end;

var
  Form1: TForm1;
  block:array of Tblock;
  level:array[1..14] of string;
  spieler:Tspieler;

implementation

{$R *.dfm}

procedure Tspieler.show;
begin
form1.Image1.Canvas.Brush.color:=clyellow;
form1.Image1.Canvas.Ellipse(x-8,y-8,x+8,y+8);
end;

procedure Tspieler.bewegen(dir:string);
begin
if (dir='links') then dec(x,5);
if (dir='rechts') then inc(x,5);
if (dir='oben') then dec(y,5);
if (dir='unten') then inc(y,5);
end;

procedure Tblock.show;
begin
with form1.image1.Canvas do begin
 brush.color:=clskyblue;
 rectangle(bx,by,bx+21,by+21);
 end;
end;

procedure Tform1.malelevel(r:integer);
var i,k:integer;
begin
if r=1 then begin
level[1]:= 'xxxxxxxxxxxxxxxxxxxx';
level[2]:= 'x xxxx xx';
level[3]:= 'x xxx x x xx';
level[4]:= 'x x xx';
level[5]:= 'x xx x xxx xx xx';
level[6]:= 'x xx x xxx xx xx';
level[7]:= 'x xx x xxx xx xx';
level[8]:= 'xxxxx xxxxxxx xx';
level[9]:= 'xxxxxx xxxxxxxxxxxxx';
level[10]:= 'xx xxxxxx';
level[11]:= 'xxx xx xxxxxxx';
level[12]:= 'x xxxxxxx x';
level[13]:= 'xxxxxxxxxx xxxx';
level[14]:= 'xxxxxxxxxxxxxxxxxxxx';
end;

setlength(block,high(level)*length(level[1]));

for k:=1 to high(level) do
for i:=1 to length(level[k]) do begin
block[i]:=tblock.Create;
block[i].bx:=i*20;
block[i].by:=k*20;
if level[k][i]='xthen block[i].da:=true;
end; end;

procedure TForm1.FormCreate(Sender: TObject);
begin
spieler:=Tspieler.Create;
malelevel(1);
spieler.x:=100;
spieler.y:=50;
spieler.show;
timer1.Enabled:=true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var i:integer;
begin
if GetAsyncKeyState(VK_LEFT)<0 then spieler.bewegen('links');
if GetAsyncKeyState(VK_RIGHT)<0 then spieler.bewegen('rechts');
if GetAsyncKeyState(VK_UP)<0 then spieler.bewegen('oben');
if GetAsyncKeyState(VK_DOWN)<0 then spieler.bewegen('unten');
image1.Canvas.Brush.color:=clwhite;
image1.Canvas.FillRect(image1.ClientRect);
spieler.show;
for i:=1 to high(block) do block[i].show;
end;

end.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: debugger Exception - pacman macht probleme

  Alt 9. Jun 2006, 17:42
Die Indexzählung eines Arrays beginnt bei 0, deine Schleife zur erzeugung der Blöcke aber bei 1.
Markus Kinzler
  Mit Zitat antworten Zitat
mr.winkle

Registriert seit: 25. Mai 2006
98 Beiträge
 
Delphi 7 Personal
 
#3

Re: debugger Exception - pacman macht probleme

  Alt 9. Jun 2006, 17:52
Hab's geändert, funktioniert aber immer noch nicht.

Delphi-Quellcode:
unit Unit1;

interface

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

type

  tspieler=class(Tobject)
    x,y:integer;
    procedure show;
    procedure bewegen(dir:string);
  end;

  tblock = class(TObject)
    bx,by:integer;
    da:boolean;
    procedure show;
  end;

  TForm1 = class(TForm)
    Image1: TImage;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure malelevel(r:integer);
    procedure Timer1Timer(Sender: TObject);
  end;

var
  Form1: TForm1;
  block:array of Tblock;
  level:array[0..13] of string;
  spieler:Tspieler;

implementation

{$R *.dfm}

procedure Tspieler.show;
begin
form1.Image1.Canvas.Brush.color:=clyellow;
form1.Image1.Canvas.Ellipse(x-8,y-8,x+8,y+8);
end;

procedure Tspieler.bewegen(dir:string);
begin
if (dir='links') then dec(x,5);
if (dir='rechts') then inc(x,5);
if (dir='oben') then dec(y,5);
if (dir='unten') then inc(y,5);
end;

procedure Tblock.show;
begin
with form1.image1.Canvas do begin
 brush.color:=clskyblue;
 rectangle(bx,by,bx+21,by+21)
 end;
end;

procedure Tform1.malelevel(r:integer);
var i,k:integer;
begin
if r=1 then begin
level[0]:= 'xxxxxxxxxxxxxxxxxxxx';
level[1]:= 'x xxxx xx';
level[2]:= 'x xxx x x xx';
level[3]:= 'x x xx';
level[4]:= 'x xx x xxx xx xx';
level[5]:= 'x xx x xxx xx xx';
level[6]:= 'x xx x xxx xx xx';
level[7]:= 'xxxxx xxxxxxx xx';
level[8]:= 'xxxxxx xxxxxxxxxxxxx';
level[9]:= 'xx xxxxxx';
level[10]:= 'xxx xx xxxxxxx';
level[11]:= 'x xxxxxxx x';
level[12]:= 'xxxxxxxxxx xxxx';
level[13]:= 'xxxxxxxxxxxxxxxxxxxx';
end;

setlength(block,high(level)*length(level[1]));

for k:=0 to high(level) do
for i:=0 to length(level[k]) do begin
block[i]:=tblock.Create;
block[i].bx:=i*20;
block[i].by:=k*20;
if level[k][i]='xthen block[i].da:=true else block[i].da:=false;
end; end;

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
spieler:=Tspieler.Create;
malelevel(1);
spieler.x:=100;
spieler.y:=50;
spieler.show;
timer1.Enabled:=true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var i:integer;
begin
if GetAsyncKeyState(VK_LEFT)<0 then spieler.bewegen('links');
if GetAsyncKeyState(VK_RIGHT)<0 then spieler.bewegen('rechts');
if GetAsyncKeyState(VK_UP)<0 then spieler.bewegen('oben');
if GetAsyncKeyState(VK_DOWN)<0 then spieler.bewegen('unten');
image1.Canvas.Brush.color:=clwhite;
image1.Canvas.FillRect(image1.ClientRect);
spieler.show;
 for i:=0 to high(block) do block[i].show;
end;

end.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: debugger Exception - pacman macht probleme

  Alt 9. Jun 2006, 18:04
In Zeile 85 muß es dann folgerichtig heißen
for i:=0 to length(level[k]-1) do begin
Markus Kinzler
  Mit Zitat antworten Zitat
mr.winkle

Registriert seit: 25. Mai 2006
98 Beiträge
 
Delphi 7 Personal
 
#5

Re: debugger Exception - pacman macht probleme

  Alt 9. Jun 2006, 18:21
Ich habs geändert auf

for i:=0 to length(level[k])-1 do begin daran scheints nicht gelegen zu haben.

Ich häng einfach mal das Projekt an, hoffentlich bekommt es noch jemand raus.
Angehängte Dateien
Dateityp: zip pacman_170.zip (2,2 KB, 8x aufgerufen)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: debugger Exception - pacman macht probleme

  Alt 9. Jun 2006, 18:43
Der Fehler tritt in Zeile 59 auf, da bx komischerweise den Wert 65100 hat. Ich Versuche mal das Programm zu debuggen
Markus Kinzler
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: debugger Exception - pacman macht probleme

  Alt 9. Jun 2006, 18:44
Müßte es in Zeile 86 ff nicht block[i,k] heißen?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Cyberbob
Cyberbob

Registriert seit: 24. Jan 2005
Ort: Karben
626 Beiträge
 
Delphi XE7 Architect
 
#8

Re: debugger Exception - pacman macht probleme

  Alt 10. Jun 2006, 00:36
Ich hab den Fehler wegbekommen.

Wenn bei Timer1.OnTimer in der letzten Zeile das High(Block) durch High(level) ersetzt wird, funktioniert es.
Christian
  Mit Zitat antworten Zitat
mr.winkle

Registriert seit: 25. Mai 2006
98 Beiträge
 
Delphi 7 Personal
 
#9

Re: debugger Exception - pacman macht probleme

  Alt 11. Jun 2006, 03:35
Zitat von Cyberbob:
Ich hab den Fehler wegbekommen.

Wenn bei Timer1.OnTimer in der letzten Zeile das High(Block) durch High(level) ersetzt wird, funktioniert es.
bringt aber irgendwie nichts, dann werden halt nur 14 blöcke angezeigt

anstatt high(level) anzugeben kann man eine zahl bis 19 einsetzen und es funktioniert.
beim 20. Block ist dann aber irgendwas faul


Zitat von mkinzler:
Müßte es in Zeile 86 ff nicht block[i,k] heißen?
ok, das hab ich geändert, ein fehler ist gefunden.

Delphi-Quellcode:
setlength(block,high(level)*length(level[1]));

for k:=0 to high(level) do
for i:=0 to length(level[k]) do begin
  block[i*k]:=tblock.Create;
  block[i*k].bx:=i*20;
  block[i*k].by:=k*20;
    if level[k][i]='xthen block[i*k].da:=true else block[i*k].da:=false;
  block[i*k].show;
end;

richtig funktionieren tuts allerdings immer noch nicht.
Wie bitte kommt bx an den wert 65100? muss ich da am anfang irgendetwas initialisieren?
  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 02:34 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