Autor Beitrag
Illinoisgirl
Hält's aus hier
Beiträge: 6

Win 98 SE
delphi 3
BeitragVerfasst: Do 05.02.04 12:09 
Hey!
Wir programmieren im Informatik-Unterricht ein Labyrinth, durch das der Benutzer laufen soll. Das Labyrinth besteht sozusagen aus 12 T-Stücken, d.h. wenn man einmal falsch gelaufen ist, sieht man das hinter der nächsten Ecke sofort!
Naja, wir sind da nicht so die Experten und programmieren das eben mit delphi 3... Aktueller Stand war eigentlich, dass man flackerfrei(!) durch Gänge laufen kann. Allerdings waren keine Drehungen möglich, um in einen Gang zu gehen, musste man immer auf einen Button klicken.
Ich poste hier jetzt mal den Quelltext, vielleicht kann uns ja jemand helfen, wie man Drehungen einbauen könnte.
Ich hoffe, man kann in etwas nachvollziehen, was unser Problem ist und noch mehr hoffe ich, dass uns jemand helfen kann!! :?: :!:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367:
368:
369:
370:
371:
372:
373:
374:
375:
376:
377:
378:
379:
380:
381:
382:
383:
384:
385:
386:
387:
388:
389:
390:
391:
392:
393:
394:
395:
396:
397:
398:
399:
400:
401:
402:
403:
404:
405:
406:
407:
408:
409:
410:
411:
412:
413:
414:
415:
416:
417:
418:
419:
420:
421:
422:
423:
424:
425:
426:
427:
428:
429:
430:
431:
432:
433:
434:
435:
436:
437:
438:
439:
440:
441:
442:
443:
444:
445:
446:
447:
448:
449:
450:
451:
452:
453:
454:
455:
456:
457:
458:
459:
460:
461:
462:
463:
464:
465:
466:
467:
468:
469:
470:
471:
472:
473:
474:
475:
476:
477:
478:
479:
480:
481:
482:
483:
484:
485:
486:
487:
488:
489:
490:
491:
492:
493:
494:
495:
496:
497:
498:
499:
500:
501:
502:
503:
504:
505:
506:
507:
508:
509:
510:
511:
512:
513:
514:
515:
516:
517:
518:
519:
520:
521:
522:
523:
524:
525:
526:
527:
528:
529:
530:
531:
532:
533:
534:
535:
536:
537:
538:
539:
540:
541:
542:
543:
544:
545:
546:
547:
548:
549:
550:
551:
552:
553:
554:
555:
556:
557:
558:
559:
560:
561:
562:
563:
564:
565:
566:
567:
568:
569:
570:
571:
572:
573:
574:
575:
576:
577:
578:
579:
580:
581:
582:
583:
584:
585:
586:
587:
588:
589:
590:
591:
592:
593:
594:
595:
596:
597:
598:
599:
600:
601:
602:
603:
604:
605:
606:
607:
608:
609:
610:
611:
612:
613:
614:
615:
616:
617:
618:
619:
620:
621:
622:
623:
624:
625:
626:
627:
628:
629:
630:
631:
632:
633:
634:
635:
636:
637:
638:
639:
640:
641:
642:
643:
644:
645:
646:
647:
648:
649:
650:
651:
652:
653:
654:
655:
656:
657:
658:
659:
660:
661:
662:
663:
664:
665:
666:
667:
668:
669:
670:
671:
672:
673:
674:
675:
676:
677:
678:
679:
680:
681:
682:
683:
684:
685:
686:
687:
688:
689:
690:
691:
692:
693:
694:
695:
696:
697:
698:
699:
700:
701:
702:
703:
704:
705:
706:
707:
708:
709:
710:
711:
712:
713:
714:
715:
716:
717:
718:
719:
720:
721:
722:
723:
724:
725:
726:
727:
728:
729:
730:
731:
732:
733:
734:
735:
736:
737:
738:
739:
740:
741:
742:
743:
744:
745:
746:
747:
748:
749:
750:
751:
752:
753:
754:
755:
756:
757:
758:
759:
760:
761:
762:
763:
764:
765:
766:
767:
768:
769:
770:
771:
772:
773:
774:
775:
776:
777:
778:
779:
780:
781:
782:
783:
784:
785:
786:
787:
788:
789:
790:
791:
792:
793:
794:
795:
796:
797:
798:
799:
800:
801:
802:
803:
804:
805:
806:
807:
808:
809:
810:
811:
812:
813:
814:
815:
816:
817:
818:
819:
820:
821:
822:
823:
824:
825:
826:
827:
828:
829:
830:
831:
832:
833:
834:
835:
836:
837:
838:
839:
840:
841:
842:
843:
844:
845:
846:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, Buttons, Spin;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Labelstart: TLabel;
    Labeleditor: TLabel;
    ZeichneGerade: TButton;
    ZeichneLinks: TButton;
    ZeichneRechts: TButton;
    ZeichneLinksRaus: TButton;
    ZeichneRechtsRaus: TButton;
    ZeichneEnde: TButton;
    BitBtnAbbiegung: TBitBtn;
    procedure FormKyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormCreate(Sender: TObject);
    procedure LabelstartMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure LabeleditorMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure ZeichneGeradeClick(Sender: TObject);
    procedure ZeichneLinksClick(Sender: TObject);
    procedure ZeichneRechtsClick(Sender: TObject);
    procedure ZeichneLinksRausClick(Sender: TObject);
    procedure ZeichneRechtsRausClick(Sender: TObject);
    procedure ZeichneEndeClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

type
    TZeiger=^TLabyrinth;

    TLabyrinth= record
                  Links, Rechts:TZeiger;
                  Zurueck: string;
                end;


var
  Form1: TForm1;
  Mitte,MitteSicher:TPoint;
  Distanz,DistanzSicher,Links,LinksDreh,a,b:integer;
  Liste: array[1..4]of TPoint;
  Richtung,AktuelleZeichnung:string;
  Wurzel, Z:TZeiger;
  Datei: file of integer;
  WirrWarr, Stop:boolean;

implementation

uses Unit2;

{$R *.DFM}

var x1:Integer=10;
    y1:Integer=100;
    x2:Integer=80;
    y2:Integer=170;
    backpuffer: TBitmap;


function tan(X:extended):extended;
begin
  tan:=sin(x)/cos(x);
end;


procedure einendrueberauswaehlen(Z1:TZeiger);// Vermutlich Fehlerfrei
begin
  if Z1<>nil then
    begin
      if Z1^.Links<>Z then einendrueberauswaehlen(Z1^.Links)
       else Z:=Z1;
      if Z1^.Rechts<>Z then einendrueberauswaehlen(Z1^.Rechts)
       else Z:=Z1;
    end;
end;



procedure TForm1.LabelstartMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Distanz:=56;
  Mitte.x:=Form1.Clientwidth div 2;
  Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12;
  labelstart.visible:=false;
  labeleditor.visible:=false;
  refresh;
  ZeichneGeradeClick(Sender);
end;



procedure TForm1.ZeichneEndeClick(Sender: TObject);
begin
  AktuelleZeichnung:='ZeichneEnde';
  backpuffer.canvas.pen.color:=clwhite;
  backpuffer.canvas.brush.color:=clwhite;
  backpuffer.canvas.rectangle(0,0,clientwidth,clientheight);
  Liste[1].X:= Mitte.x - round(form1.clientwidth/Distanz);
  Liste[1].Y:= Mitte.y + round(form1.ClientHeight*2/(Distanz*tan(70)));
  Liste[2].x:= Mitte.x - round(form1.clientwidth/Distanz);
  Liste[2].y:= Mitte.y - round(form1.ClientHeight/(Distanz*tan(70)));
  Liste[3].x:=0;
  Liste[3].y:=0;
  Liste[4].x:=0;
  Liste[4].y:=form1.clientheight;
  backpuffer.canvas.pen.color:=clblue;
  backpuffer.canvas.brush.color:=clblue;
  backpuffer.Canvas.Polygon(Liste);
  Liste[1].x:= Mitte.x + round(form1.clientwidth/Distanz);
  Liste[1].y:= Mitte.y + round(form1.ClientHeight*2/(Distanz*tan(70)));
  Liste[2].x:= Mitte.x + round(form1.clientwidth/Distanz);
  Liste[2].y:= Mitte.y - round(form1.ClientHeight/(Distanz*tan(70)));
  Liste[3].x:=form1.clientwidth;
  Liste[3].y:=0;
  Liste[4].x:=form1.clientwidth;
  Liste[4].y:=form1.clientheight;
  backpuffer.Canvas.Polygon(Liste);
  Liste[1].x:= Mitte.x + round(form1.clientwidth/Distanz);
  Liste[1].y:= Mitte.y + round(form1.ClientHeight*2/(Distanz*tan(70)));
  Liste[2].x:= Mitte.x + round(form1.clientwidth/Distanz);
  Liste[2].y:= Mitte.y - round(form1.ClientHeight/(Distanz*tan(70)));
  Liste[3].x:= Mitte.x - round(form1.clientwidth/Distanz);
  Liste[3].y:= Mitte.y - round(form1.ClientHeight/(Distanz*tan(70)));
  Liste[4].x:= Mitte.x - round(form1.clientwidth/Distanz);
  Liste[4].y:= Mitte.y + round(form1.ClientHeight*2/(Distanz*tan(70)));
  backpuffer.Canvas.Polygon(Liste);
  BitBlt(Form1.canvas.handle,0 ,0 ,backpuffer.width ,backpuffer.height ,backpuffer.Canvas.handle,0,0,srccopy);
  if Distanz=6 then
    begin
    Stop:=true;
    end;
end;




procedure TForm1.ZeichneRechtsRausClick(Sender: TObject);
begin
  AktuelleZeichnung:='ZeichneRechtsRaus';
  backpuffer.canvas.pen.color:=clwhite;
  backpuffer.canvas.brush.color:=clwhite;
  backpuffer.canvas.Rectangle(0,0,clientwidth,clientheight);
  Liste[1].X:= Mitte.x - round(form1.clientwidth/Distanz);
  Liste[1].Y:= Mitte.y + round(form1.ClientHeight*2/(Distanz*tan(70)));
  Liste[2].x:= Mitte.x - round(form1.clientwidth/Distanz);
  Liste[2].y:= Mitte.y - round(form1.ClientHeight/(Distanz*tan(70)));
  Liste[3].x:=0;
  Liste[3].y:=0;
  Liste[4].x:=0;
  Liste[4].y:=form1.clientheight;
  backpuffer.canvas.pen.color:=clblue;
  backpuffer.canvas.brush.color:=clblue;
  backpuffer.Canvas.Polygon(Liste);
  Liste[1].x:= Mitte.x + round(form1.clientwidth/Distanz);
  Liste[1].y:= Mitte.y + round(form1.ClientHeight*2/(Distanz*tan(70)));
  Liste[2].x:= Mitte.x + round(form1.clientwidth/Distanz);
  Liste[2].y:= Mitte.y - round(form1.ClientHeight/(Distanz*tan(70)));
  Liste[3].x:=form1.clientwidth;
  Liste[3].y:=0;
  Liste[4].x:=form1.clientwidth;
  Liste[4].y:=form1.clientheight;
  backpuffer.Canvas.Polygon(Liste);
  Liste[1].x:= Mitte.x + round(form1.clientwidth/Distanz);
  Liste[1].y:= Mitte.y + round(form1.ClientHeight*2/(Distanz*tan(70)));
  Liste[2].x:= Mitte.x + round(form1.clientwidth/Distanz);
  Liste[2].y:= Mitte.y - round(form1.ClientHeight/(Distanz*tan(70)));
  Liste[3].x:= Mitte.x - round(form1.clientwidth/Distanz);
  Liste[3].y:= Mitte.y - round(form1.ClientHeight/(Distanz*tan(70)));
  Liste[4].x:= Mitte.x - round(form1.clientwidth/Distanz);
  Liste[4].y:= Mitte.y + round(form1.ClientHeight*2/(Distanz*tan(70)));
  backpuffer.Canvas.Polygon(Liste);
  Liste[1].x:=form1.clientwidth - round((form1.clientheight*Mitte.x-form1.clientheight*round(form1.clientwidth/Distanz))/(form1.clientheight+round(form1.ClientHeight*2/(Distanz*tan(70)))+round(form1.ClientHeight/(Distanz*tan(70)))) -6000000/(Distanz*Distanz*Distanz)   );
  Liste[1].y:=0;
  Liste[2].x:=form1.clientwidth - round((form1.clientheight*Mitte.x-form1.clientheight*round(form1.clientwidth/Distanz))/(form1.clientheight+round(form1.ClientHeight*2/(Distanz*tan(70)))+round(form1.ClientHeight/(Distanz*tan(70)))) -3600000/(Distanz*Distanz*Distanz)   );
  Liste[2].y:=0;
  Liste[3].x:=form1.clientwidth - round((form1.clientheight*Mitte.x-form1.clientheight*round(form1.clientwidth/Distanz))/(form1.clientheight+round(form1.ClientHeight*2/(Distanz*tan(70)))+round(form1.ClientHeight/(Distanz*tan(70)))) -3600000/(Distanz*Distanz*Distanz)   );
  Liste[3].y:=form1.clientheight;
  Liste[4].x:=form1.clientwidth - round((form1.clientheight*Mitte.x-form1.clientheight*round(form1.clientwidth/Distanz))/(form1.clientheight+round(form1.ClientHeight*2/(Distanz*tan(70)))+round(form1.ClientHeight/(Distanz*tan(70)))) -6000000/(Distanz*Distanz*Distanz)   );
  Liste[4].y:=form1.clientheight;
  backpuffer.canvas.brush.color:=clwhite;
  backpuffer.canvas.Pen.color:=clwhite;
  backpuffer.Canvas.Polygon(Liste);
  BitBlt(Form1.canvas.handle,0 ,0 ,backpuffer.width ,backpuffer.height ,backpuffer.Canvas.handle,0,0,srccopy);
  if Distanz=28 then
    begin
    Stop:=true;
    bitbtnabbiegung.visible:=true;
    end
  else if Distanz=6 then
    begin
    Stop:=true;
    end;
end;



procedure TForm1.ZeichneLinksRausClick(Sender: TObject);
begin
  AktuelleZeichnung:='ZeichneLinksRaus';
  backpuffer.canvas.pen.color:=clwhite;
  backpuffer.canvas.brush.color:=clwhite;
  backpuffer.canvas.rectangle(0,0,clientwidth,clientheight);
  Liste[1].X:= Mitte.x - round(form1.clientwidth/Distanz);
  Liste[1].Y:= Mitte.y + round(form1.ClientHeight*2/(Distanz*tan(70)));
  Liste[2].x:= Mitte.x - round(form1.clientwidth/Distanz);
  Liste[2].y:= Mitte.y - round(form1.ClientHeight/(Distanz*tan(70)));
  Liste[3].x:=0;
  Liste[3].y:=0;
  Liste[4].x:=0;
  Liste[4].y:=form1.clientheight;
  backpuffer.canvas.pen.color:=clblue;
  backpuffer.canvas.brush.color:=clblue;
  backpuffer.Canvas.Polygon(Liste);
  Liste[1].x:= Mitte.x + round(form1.clientwidth/Distanz);
  Liste[1].y:= Mitte.y + round(form1.ClientHeight*2/(Distanz*tan(70)));
  Liste[2].x:= Mitte.x + round(form1.clientwidth/Distanz);
  Liste[2].y:= Mitte.y - round(form1.ClientHeight/(Distanz*tan(70)));
  Liste[3].x:=form1.clientwidth;
  Liste[3].y:=0;
  Liste[4].x:=form1.clientwidth;
  Liste[4].y:=form1.clientheight;
  backpuffer.Canvas.Polygon(Liste);
  Liste[1].x:= Mitte.x + round(form1.clientwidth/Distanz);
  Liste[1].y:= Mitte.y + round(form1.ClientHeight*2/(Distanz*tan(70)));
  Liste[2].x:= Mitte.x + round(form1.clientwidth/Distanz);
  Liste[2].y:= Mitte.y - round(form1.ClientHeight/(Distanz*tan(70)));
  Liste[3].x:= Mitte.x - round(form1.clientwidth/Distanz);
  Liste[3].y:= Mitte.y - round(form1.ClientHeight/(Distanz*tan(70)));
  Liste[4].x:= Mitte.x - round(form1.clientwidth/Distanz);
  Liste[4].y:= Mitte.y + round(form1.ClientHeight*2/(Distanz*tan(70)));
  backpuffer.Canvas.Polygon(Liste);
  Liste[1].x:=round((form1.clientheight*Mitte.x-form1.clientheight*round(form1.clientwidth/Distanz))/(form1.clientheight+round(form1.ClientHeight*2/(Distanz*tan(70)))+round(form1.ClientHeight/(Distanz*tan(70)))) -6000000/(Distanz*Distanz*Distanz)   );
  Liste[1].y:=0;
  Liste[2].x:=round((form1.clientheight*Mitte.x-form1.clientheight*round(form1.clientwidth/Distanz))/(form1.clientheight+round(form1.ClientHeight*2/(Distanz*tan(70)))+round(form1.ClientHeight/(Distanz*tan(70)))) -3600000/(Distanz*Distanz*Distanz)   );
  Liste[2].y:=0;
  Liste[3].x:=round((form1.clientheight*Mitte.x-form1.clientheight*round(form1.clientwidth/Distanz))/(form1.clientheight+round(form1.ClientHeight*2/(Distanz*tan(70)))+round(form1.ClientHeight/(Distanz*tan(70)))) -3600000/(Distanz*Distanz*Distanz)   );
  Liste[3].y:=form1.clientheight;
  Liste[4].x:=round((form1.clientheight*Mitte.x-form1.clientheight*round(form1.clientwidth/Distanz))/(form1.clientheight+round(form1.ClientHeight*2/(Distanz*tan(70)))+round(form1.ClientHeight/(Distanz*tan(70)))) -6000000/(Distanz*Distanz*Distanz)   );
  Liste[4].y:=form1.clientheight;
  backpuffer.canvas.brush.color:=clwhite;
  backpuffer.canvas.Pen.color:=clwhite;
  backpuffer.Canvas.Polygon(Liste);
  BitBlt(Form1.canvas.handle,0 ,0 ,backpuffer.width ,backpuffer.height ,backpuffer.Canvas.handle,0,0,srccopy);
  if Distanz=28 then
    begin
    bitbtnabbiegung.visible:=true;
    Stop:=true;
    end
  else if Distanz=6 then
    begin
    Stop:=true;
    end;
end;



procedure TForm1.ZeichneLinksClick(Sender: TObject);
begin
  AktuelleZeichnung:='ZeichneLinks';
  backpuffer.canvas.pen.color:=clwhite;
  backpuffer.canvas.brush.color:=clwhite;
  backpuffer.canvas.rectangle(0,0,clientwidth,clientheight);
  Liste[1].X:= Mitte.x - round(clientwidth/Distanz);
  Liste[1].Y:= Mitte.y + round(ClientHeight*2/(Distanz*tan(70)));
  Liste[2].x:= Mitte.x - round(clientwidth/Distanz);
  Liste[2].y:= Mitte.y - round(ClientHeight/(Distanz*tan(70)));
  Liste[3].x:=0;
  Liste[3].y:=0;
  Liste[4].x:=0;
  Liste[4].y:=clientheight;
  backpuffer.Canvas.pen.color:=clblue;
  backpuffer.Canvas.brush.color:=clblue;
  backpuffer.Canvas.Polygon(Liste);
  Liste[1].x:= Mitte.x + round(clientwidth/Distanz);
  Liste[1].y:= Mitte.y + round(ClientHeight*2/(Distanz*tan(70)));
  Liste[2].x:= Mitte.x + round(clientwidth/Distanz);
  Liste[2].y:= Mitte.y - round(ClientHeight/(Distanz*tan(70)));
  Liste[3].x:=clientwidth;
  Liste[3].y:=0;
  Liste[4].x:=clientwidth;
  Liste[4].y:=clientheight;
  backpuffer.Canvas.Polygon(Liste);
  Liste[1].x:=round((clientheight*Mitte.x-clientheight*round(clientwidth/Distanz))/(form1.clientheight+round(form1.ClientHeight*2/(Distanz*tan(70)))+round(form1.ClientHeight/(Distanz*tan(70)))) -6000000/(Distanz*Distanz*Distanz)   );
  Liste[1].y:=0;
  Liste[2].x:=round((clientheight*Mitte.x-clientheight*round(clientwidth/Distanz))/(form1.clientheight+round(form1.ClientHeight*2/(Distanz*tan(70)))+round(form1.ClientHeight/(Distanz*tan(70)))) -3600000/(Distanz*Distanz*Distanz)   );
  Liste[2].y:=0;
  Liste[3].x:=round((clientheight*Mitte.x-clientheight*round(clientwidth/Distanz))/(form1.clientheight+round(form1.ClientHeight*2/(Distanz*tan(70)))+round(form1.ClientHeight/(Distanz*tan(70)))) -3600000/(Distanz*Distanz*Distanz)   );
  Liste[3].y:=form1.clientheight;
  Liste[4].x:=round((clientheight*Mitte.x-clientheight*round(clientwidth/Distanz))/(form1.clientheight+round(form1.ClientHeight*2/(Distanz*tan(70)))+round(form1.ClientHeight/(Distanz*tan(70)))) -6000000/(Distanz*Distanz*Distanz)   );
  Liste[4].y:=clientheight;
  backpuffer.Canvas.pen.color:=clwhite;
  backpuffer.Canvas.brush.color:=clwhite;
  backpuffer.Canvas.Polygon(Liste);
  BitBlt(Form1.canvas.handle,0 ,0 ,backpuffer.width ,backpuffer.height ,backpuffer.Canvas.handle,0,0,srccopy);
  if Distanz=28 then
    begin
    bitbtnabbiegung.visible:=true;
    Stop:=true;
    end
  else if Distanz=6 then
    begin
    bitbtnabbiegung.visible:=true;
    Stop:=true;
    end;
end;


procedure TForm1.ZeichneRechtsClick(Sender: TObject);
begin
  AktuelleZeichnung:='ZeichneRechts';
  backpuffer.canvas.pen.color:=clwhite;
  backpuffer.canvas.brush.color:=clwhite;
  backpuffer.canvas.rectangle(0,0,clientwidth,clientheight);
  Liste[1].X:= Mitte.x - round(form1.clientwidth/Distanz);
  Liste[1].Y:= Mitte.y + round(form1.ClientHeight*2/(Distanz*tan(70)));
  Liste[2].x:= Mitte.x - round(form1.clientwidth/Distanz);
  Liste[2].y:= Mitte.y - round(form1.ClientHeight/(Distanz*tan(70)));
  Liste[3].x:=0;
  Liste[3].y:=0;
  Liste[4].x:=0;
  Liste[4].y:=form1.clientheight;
  backpuffer.canvas.pen.color:=clblue;
  backpuffer.canvas.brush.color:=clblue;
  backpuffer.Canvas.Polygon(Liste);
  Liste[1].x:= Mitte.x + round(form1.clientwidth/Distanz);
  Liste[1].y:= Mitte.y + round(form1.ClientHeight*2/(Distanz*tan(70)));
  Liste[2].x:= Mitte.x + round(form1.clientwidth/Distanz);
  Liste[2].y:= Mitte.y - round(form1.ClientHeight/(Distanz*tan(70)));
  Liste[3].x:=form1.clientwidth;
  Liste[3].y:=0;
  Liste[4].x:=form1.clientwidth;
  Liste[4].y:=form1.clientheight;
  backpuffer.Canvas.Polygon(Liste);
  Liste[1].x:=form1.clientwidth - round((form1.clientheight*Mitte.x-form1.clientheight*round(form1.clientwidth/Distanz))/(form1.clientheight+round(form1.ClientHeight*2/(Distanz*tan(70)))+round(form1.ClientHeight/(Distanz*tan(70)))) -6000000/(Distanz*Distanz*Distanz)   );
  Liste[1].y:=0;
  Liste[2].x:=form1.clientwidth - round((form1.clientheight*Mitte.x-form1.clientheight*round(form1.clientwidth/Distanz))/(form1.clientheight+round(form1.ClientHeight*2/(Distanz*tan(70)))+round(form1.ClientHeight/(Distanz*tan(70)))) -3600000/(Distanz*Distanz*Distanz)   );
  Liste[2].y:=0;
  Liste[3].x:=form1.clientwidth - round((form1.clientheight*Mitte.x-form1.clientheight*round(form1.clientwidth/Distanz))/(form1.clientheight+round(form1.ClientHeight*2/(Distanz*tan(70)))+round(form1.ClientHeight/(Distanz*tan(70)))) -3600000/(Distanz*Distanz*Distanz)   );
  Liste[3].y:=form1.clientheight;
  Liste[4].x:=clientwidth - round((form1.clientheight*Mitte.x-form1.clientheight*round(form1.clientwidth/Distanz))/(form1.clientheight+round(form1.ClientHeight*2/(Distanz*tan(70)))+round(form1.ClientHeight/(Distanz*tan(70)))) -6000000/(Distanz*Distanz*Distanz)   );
  Liste[4].y:=clientheight;
  backpuffer.canvas.brush.color:=clwhite;
  backpuffer.canvas.Pen.color:=clwhite;
  backpuffer.Canvas.Polygon(Liste);
  BitBlt(Form1.canvas.handle,0 ,0 ,backpuffer.width ,backpuffer.height ,backpuffer.Canvas.handle,0,0,srccopy);
  if Distanz=28 then
    begin
    bitbtnabbiegung.visible:=true;
    Stop:=true;
    end
  else if Distanz=6 then
    begin
    bitbtnabbiegung.visible:=true;
    Stop:=true;
    end;
end;


procedure TForm1.ZeichneGeradeClick(Sender: TObject);
begin
  AktuelleZeichnung:='ZeichneGerade';
  backpuffer.canvas.pen.color:=clwhite;
  backpuffer.canvas.brush.color:=clwhite;
  backpuffer.canvas.Rectangle(0,0,clientwidth,clientheight);
  Liste[1].X:= Mitte.x - round(clientwidth/Distanz);
  Liste[1].Y:= Mitte.y + round(ClientHeight*2/(Distanz*tan(70)));
  Liste[2].x:= Mitte.x - round(clientwidth/Distanz);
  Liste[2].y:= Mitte.y - round(ClientHeight/(Distanz*tan(70)));
  Liste[3].x:=0;
  Liste[3].y:=0;
  Liste[4].x:=0;
  Liste[4].y:=clientheight;
  backpuffer.canvas.pen.color:=clblue;
  backpuffer.canvas.brush.color:=clblue;
  backpuffer.Canvas.Polygon(Liste);
  Liste[1].x:= Mitte.x + round(clientwidth/Distanz);
  Liste[1].y:= Mitte.y + round(ClientHeight*2/(Distanz*tan(70)));
  Liste[2].x:= Mitte.x + round(clientwidth/Distanz);
  Liste[2].y:= Mitte.y - round(ClientHeight/(Distanz*tan(70)));
  Liste[3].x:=form1.clientwidth;
  Liste[3].y:=0;
  Liste[4].x:=form1.clientwidth;
  Liste[4].y:=form1.clientheight;
  backpuffer.Canvas.Polygon(Liste);
  BitBlt(Form1.canvas.handle,0 ,0 ,backpuffer.width ,backpuffer.height ,backpuffer.Canvas.handle,0,0,srccopy);
  if Distanz=6 then
    begin
    bitbtnabbiegung.visible:=true;
    Stop:=true;
    end;
end;



procedure TForm1.FormKyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
    case key of
        VK_UP:
          begin
            if not Stop then
            begin
            if Distanz>2 then
              begin
                dec(Distanz);
                dec(mitte.y);
              end;
            end
            else if Distanz=28 then
            begin
bitbtnabbiegung.visible:=false;
Stop:=false;
dec(Distanz);
  if WirrWarr then
    begin
      if Richtung='Runter' then
        begin
          Links:=-Links;
        end
      else {if Richtung='Hoch'then}
        begin
          WirrWarr:=false;
        end
    end
  else {if not WirrWarr + nur denkbar bei Richtung='Runter'}
    begin
      WirrWarr:=true;
    end;
            end;
          end;



       VK_DOWN:
          begin
            Stop:=false;
            bitbtnabbiegung.visible:=false;
            if WirrWarr then
              begin
                if Richtung='Hoch'then
                  begin
                    Distanz:=56-Distanz;
                    Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 - Distanz;
                    ZeichneGeradeClick(Sender);
                    Richtung:='Runter';
                  end
                else {if Richtung='Runter'then}
                  begin
                    if (AktuelleZeichnung='ZeichneLinksRaus')and(Distanz>2)or(AktuelleZeichnung='ZeichneRechtsRaus')and(Distanz>2)then
                      begin
                        Distanz:=28-Distanz;
                        Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 - Distanz;
                        ZeichneEndeClick(Sender);
                      end
                    else
                    if Links>0 then
                      begin
                        Distanz:=56-Distanz;
                        Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 - Distanz;
                        ZeichneLinksRausClick(Sender);
                      end
                    else if Links<0 then
                      begin
                        Distanz:=56-Distanz;
                        Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 - Distanz;
                        ZeichneRechtsRausClicK(Sender);
                      end
                    else
                      begin
                        Richtung:='Hoch';
                        Distanz:=56-Distanz;
                        Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 - Distanz;
                        if Z^.Zurueck='ZeichneLinks'then ZeichneRechtsClick(Sender)
                        else ZeichneLinksClick(Sender);
                      end
                  end
              end
            else {if not WirrWarr then}
              begin
                if Richtung='Hoch'then
                  begin
                    Richtung:='Runter';
                    Distanz:=56-Distanz;
                    Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 - Distanz;
                    if Z^.Zurueck='ZeichneLinks'then ZeichneLinksClick(Sender)
                    else if Z^.Zurueck='ZeichneRechts'then ZeichneRechtsClick(Sender)
                    else
                      begin
                        ZeichneEndeClick(Sender);
                        Distanz:=28-Distanz;
                        Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 - Distanz;
                      end;
                  end
                else {if Richtung='Runter'then}
                  begin
                    Richtung:='Hoch';
                    Distanz:=56-Distanz;
                    Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 - Distanz;
                    ZeichneGeradeClick(Sender);
                  end;
              end;
                 end;

          VK_Left:
             begin

if Stop then
begin
bitbtnabbiegung.visible:=false;
  if WirrWarr then
    begin
      if Richtung='Runter' then
        begin
          if Links=1 then
            begin
              Distanz:=56;
              Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 -(56- Distanz);
              Richtung:='Hoch';
              dec(Links);
              if Z^.Zurueck='ZeichneLinks'then ZeichneRechtsClick(Sender)
              else if Z^.Zurueck='ZeichneRechts'then ZeichneLinksClick(Sender)
              else ZeichneEndeClick(Sender);
            end
          else
            begin
              Distanz:=28;
              Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 -(56- Distanz);
              dec(Links);
              ZeichneEndeClick(Sender);
            end
        end
      else {if Richtung='Hoch'then}
        begin
          Richtung:='Runter';
          EinenDrueberAuswaehlen(Wurzel);
          WirrWarr:=false;
          if Z^.Zurueck='ZeichneLinks'then
            begin
              Distanz:=56;
              Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 -(56- Distanz);
              ZeichneLinksClick(Sender);
            end
          else if Z^.Zurueck='ZeichneRechts'then
            begin
              Distanz:=56;
              Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 -(56- Distanz);
              ZeichneRechtsClick(Sender);
            end
          else
            begin
              Distanz:=28;
              Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 -(56- Distanz);
              ZeichneEndeClick(Sender);
            end;
        end;
    end
  else{if not WirrWarr then}if Richtung='Hoch'then
    begin
      if Z^.Zurueck<>'Gefunden'then
      begin
        begin
          if Z^.Links<>nil then
            begin
              Z:=Z^.Links;
              Distanz:=28;
              Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 -(56- Distanz);
              ZeichneGeradeClick(Sender);
            end
          else
            begin
              Z:=Z^.Rechts;
              Distanz:=28;
              Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 -(56- Distanz);
              ZeichneGeradeClick(Sender);
              WirrWarr:=true;
              Richtung:='Runter';
            end;
        end
      end
      else
        showmessage('Ziel gefunden');
    end
  else {if not WirrWarr then if Richtung='Runter'then}
    begin
      EinenDrueberAuswaehlen(Wurzel);
      if Z^.Zurueck='ZeichneLinks'then
        begin
          Distanz:=56;
          Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 -(56- Distanz);
          ZeichneLinksClick(Sender);
        end
      else if Z^.Zurueck='ZeichneRechts'then
        begin
          Distanz:=56;
          Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 -(56- Distanz);
          ZeichneRechtsClick(Sender);
        end
      else
        begin
          Distanz:=28;
          Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 -(56- Distanz);
          ZeichneEndeClick(Sender);
        end;
    end;
Stop:=false;
end;
             end;




          VK_Right:
             begin

if Stop then
begin
bitbtnabbiegung.visible:=false;
  if WirrWarr then
    begin
      if Richtung='Runter' then
        begin
          if Links=-1 then
            begin
              Richtung:='Hoch';
              inc(Links);
              if Z^.Zurueck='ZeichneLinks'then
                begin
                  Distanz:=56;
                  Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 -(56- Distanz);
                  ZeichneRechtsClick(Sender);
                end
              else if Z^.Zurueck='ZeichneRechts'then
                begin
                  Distanz:=56;
                  Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 -(56- Distanz);
                  ZeichneLinksClick(Sender);
                end
              else
                begin
                  Distanz:=28;
                  Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 -(56- Distanz);
                  ZeichneEndeClick(Sender);
                end;
            end
          else
            begin
              inc(Links);
              Distanz:=28;
              Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 -(56- Distanz);
              ZeichneEndeClick(Sender);
            end
        end
      else {if Richtung='Hoch'then}
        begin
          Richtung:='Runter';
          WirrWarr:=false;
          EinenDrueberAuswaehlen(Wurzel);
          if Z^.Zurueck='ZeichneLinks'then
            begin
              Distanz:=56;
              Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 -(56- Distanz);
              ZeichneLinksClick(Sender);
            end
          else if Z^.Zurueck='ZeichneRechts'then
            begin
              Distanz:=56;
              Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 -(56- Distanz);
              ZeichneRechtsClick(Sender);
            end
          else
            begin
              Distanz:=28;
              Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 -(56- Distanz);
              ZeichneEndeClick(Sender);
            end;
        end;
    end
  else{if not WirrWarr then}if Richtung='Hoch'then
    begin
      if Z^.Zurueck<>'Gefunden'then
      begin
        if Z^.Rechts<>nil then
          begin
            Z:=Z^.Rechts;
            Distanz:=28;
            Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 -(56- Distanz);
            ZeichneGeradeClick(Sender);
          end
        else
          begin
            Z:=Z^.Links;
            Distanz:=28;
            Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 -(56- Distanz);
            ZeichneGeradeClick(Sender);
            WirrWarr:=true;
            Richtung:='Runter';
          end;
      end
      else showmessage('Ziel gefunden');
    end
  else {if not WirrWarr then if Richtung='Runter'then}
    begin
      EinenDrueberAuswaehlen(Wurzel);
      if Z^.Zurueck='ZeichneLinks'then
        begin
          Distanz:=56;
          Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 -(56- Distanz);
          ZeichneLinksClick(Sender);
        end
      else if Z^.Zurueck='ZeichneRechts'then
        begin
          Distanz:=56;
          Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 -(56- Distanz);
          ZeichneRechtsClick(Sender);
        end
      else
        begin
          Distanz:=28;
          Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12 -(56- Distanz);
          ZeichneEndeClick(Sender);
        end;
    end;
Stop:=false;
end;


             end;
       end;
if AktuelleZeichnung='ZeichneGerade' then ZeichneGeradeClick(Sender)
else if AktuelleZeichnung='ZeichneLinks'then ZeichneLinksClick(Sender)
else if AktuelleZeichnung='ZeichneRechts'then ZeichneRechtsClick(Sender)
else if AktuelleZeichnung='ZeichneLinksRaus'then ZeichneLinksrausClick(Sender)
else if AktuelleZeichnung='ZeichneRechtsRaus'then ZeichneRechtsrausClicK(Sender)
else if AktuelleZeichnung='ZeichneEnde'then ZeichneEndeClick(Sender);
end;



procedure Nachbauen(var Z1:TZeiger);                     // 0=Links; 1=Rechts
begin
  new(Z1);
  if not EOF(Datei) then
     begin
       b:=a;
       read(Datei,a);
       if b=0 then Z1^.Zurueck:='ZeichneRechts'
       else Z1^.Zurueck:='ZeichneLinks';
       if a=0 then begin Z1^.Rechts:=nil; Nachbauen(Z1^.Links);end
       else begin Z1^.Links:=nil; Nachbauen(Z1^.Rechts)end;
     end
  else
    begin
      Z1^.Links:=nil;
      Z1^.Rechts:=nil;
      Z1.Zurueck:='Gefunden';     //Aufruf der Prozedur, wenn das Ziel gefunden wurde
    end;
end;


procedure TForm1.FormCreate(Sender: TObject);
var c:integer;
begin
backpuffer := TBitmap.create;
backpuffer.width := form1.width;
backpuffer.height := form1.height;
AssignFile(Datei,'Test.lab');
rewrite(Datei);
c:=strtoint(label1.caption);
write(Datei,c);
c:=strtoint(label2.caption);
write(Datei,c);
c:=strtoint(label3.caption);
write(Datei,c);
c:=strtoint(label4.caption);
write(Datei,c);
c:=strtoint(label5.caption);
write(Datei,c);
c:=strtoint(label6.caption);
write(Datei,c);
c:=strtoint(label7.caption);
write(Datei,c);
c:=strtoint(label8.caption);
write(Datei,c);
c:=strtoint(label9.caption);
write(Datei,c);
c:=strtoint(label10.caption);
write(Datei,c);
c:=strtoint(label11.caption);
write(Datei,c);
c:=strtoint(label12.caption);
write(Datei,c);
CloseFile(Datei);
  MitteSicher.x:=Form1.Clientwidth div 2;
  a:=0;
  LinksDreh:=0;
  Richtung:='Hoch';
  WirrWarr:=false;
  Links:=0;
  Distanz:=28;
  Mitte.x:=Form1.Clientwidth div 2;
  Mitte.y:=Form1.Clientheight div 3+form1.clientheight div 12;
  AssignFile(Datei, 'Test.lab');
  reset(Datei);
  Nachbauen(Wurzel);
  CloseFile(Datei);
  Wurzel^.Zurueck:='ZeichneEnde';
  Z:=Wurzel;
Stop:=false;
end;



procedure TForm1.LabeleditorMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  labelstart.visible:=false;
  labeleditor.visible:=false;
  form2.show;
  form1.hide;
end;

end.

_________________
Was kann ein Tag schon bringen, der mit dem Aufstehen beginnt?! - Snoopy
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Do 05.02.04 13:48 
Erwarte lieber nicht, daß sich da irgendjemand durch soviel Code gräbt. Vielleicht kannst du dein Problem ein bisschen genauer darstellen, oder zunächst nur ein Teilproblem diskutieren? Das dürfte erfolgreicher sein.

Cu,
Udontknow
Raphael O.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1596


VS 2013
BeitragVerfasst: Do 05.02.04 14:15 
in einem Canvas eine drehung zu simuluieren wird wohl recht scwierig sein (vorausgesetzt ihr habt sowas wie eine 3D-Ansicht und schaut nicht von oben drauf :/ )
dann bräuchte man am besten sowas wie OpenGL... aber gib am besten mal ein screenshot, der das Problem noch näher beschreibt :)