Random, Canvas, Array und anderes

Für Fragen von Einsteigern und Programmieranfängern...
scihbam37
Beiträge: 32
Registriert: Mi 1. Jun 2011, 21:07

Re: Random, Canvas, Array und anderes

Beitrag von scihbam37 »

So weit ok, aber die Verknüpfung von den Koordinaten meines Spielers und dem Array bekomme ich nicht hin.

Wie definiert man das das array[0,0] ein feld der größe 30x30 und den koordinaten 0,0 ist? oder für array[1,1] koordinaten 30,30?

Es tut mir leid wenn ich euch mit meinen allgemeinen Fragen pder Wiederholungen nerve :|

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Random, Canvas, Array und anderes

Beitrag von pluto »

Wie definiert man das das array[0,0] ein feld der größe 30x30 und den koordinaten 0,0 ist? oder für array[1,1] koordinaten 30,30?
Eine Direkte Frage, wie schön. Also:
Wie wäre es wenn du zwei Consten Definieren würdest:
GameW = 30; GameH = 30;

Beim Zeichnen kannst du es jetzt so machen:

Code: Alles auswählen

var
  px, py:Integer;
begin
  foy y:=0 to AnzahlDerZeilen do begin
    for x:=0 to AnzahlderSpalten do begin
      px:=x * GameW;
      py:=y*GameH;
      if GameMap[y,x].typ = stein then canvas.brush.color:=clBlack;
      if GameMap[y,x].typ = player1 then canvas.brush.color:=clred;
      if GameMap[y,x].typ = player2 then canvas.brush.color:=clblue;
      canvas.fillrect(px,py,px+GameW, py+GameH);
    end;
  end;
end;
Schon hast du deine Vierecke gezeichnet. Stein, Player1 und Player2 gehören zu einem Aufzählungstyp der könnte z.b. so aussehen:
TGameFeldTyp =(stein, player1,player2) und muss unterhalb von Type deklariert werden.
GameMap ist dein 2D ARray und Typ ist von TGameFeldTyp, du könntest Theoretisch auch ein caste verwenden.

ps: Den Code musst du natürlich Anpassen, so läuft es noch nicht, dient nur als Schablone.... du könntest auch Grafiken so Zeichnen. Canvas kann auch von TImage Sein.
MFG
Michael Springwald

scihbam37
Beiträge: 32
Registriert: Mi 1. Jun 2011, 21:07

Re: Random, Canvas, Array und anderes

Beitrag von scihbam37 »

Vielen Dank das hat mich jetzt schon echt vorwärts gebracht!

scihbam37
Beiträge: 32
Registriert: Mi 1. Jun 2011, 21:07

Re: Random, Canvas, Array und anderes

Beitrag von scihbam37 »

pluto hat geschrieben: TGameFeldTyp =(stein, player1,player2) und muss unterhalb von Type deklariert werden.
kannst du das bitte nochmal erklären?

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Random, Canvas, Array und anderes

Beitrag von pluto »

kannst du das bitte nochmal erklären?
Das ist ein sogenannter Aufzählungstyp. Damit kannst du z.b. relativ einfach in einem Case oder in eine IF Abfrage prüfen ob die Bedienung zutrifft:
(Mir fällt gerade auf, du solltest noch ein GFT vor Stein, Player1 und Player2 machen, damit es klar ist, dass diese Werte zum TGameFeldTyp gehören und ich habe den Wert NONE vergessen, ganz wichtig).
Z.B.:

Code: Alles auswählen

var1:TGameFeldTyp
...
var1:=GFT_Stein;
 
if var1 = GFT_Stein then ShowMessage('Ein Stein');
In einem 2D Arrray geht es ähnlich, nur das nicht eine sonden N Variablen hast:

Code: Alles auswählen

if Myraster[Zeile, Spalte] = GFT_Stein then ShowMessage('Ein Stein');
vereinfacht da gestellt. Such mal nach Aufzählungstypen oder schau mal hier:
http://delphi-treff.de/object-pascal/datentypen/#c4857" onclick="window.open(this.href);return false;
Zuletzt geändert von Lori am Mo 5. Mär 2012, 19:19, insgesamt 2-mal geändert.
Grund: richtiger Highlighter
MFG
Michael Springwald

scihbam37
Beiträge: 32
Registriert: Mi 1. Jun 2011, 21:07

Re: Random, Canvas, Array und anderes

Beitrag von scihbam37 »

hmm okey setz ich mich mal bei einer ruhigen Minute ran ;)

und die nächste Frage :D

Code: Alles auswählen

if (b div 30 = true) and (c div 30 = true) then   //wobei true hier als ganzzahlig interpretiert werden soll
 ...
wie kann ich abfragen ob der Wert b div 30 eine ganze Zahl ist?

und kann ich folgende koordinaten von l und v leicht speicher und wieder abrufen?
sodass ich weiß wo sich jedes rechteck befindet

Code: Alles auswählen

for v:= 0 to 10 do
     for k:= 0  to 8 do                
     begin
     l:=30*k+random(2)*60;
     form1.Image1.Canvas.pen.color:=clblack;
     form1.Image1.Canvas.pen.width:=1;
     form1.Image1.Canvas.brush.color:=clmaroon;
     form1.Image1.canvas.rectangle(l,30*v,l+30,(v+1)*30);
     end;
 end;

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Random, Canvas, Array und anderes

Beitrag von pluto »

wie kann ich abfragen ob der Wert b div 30 eine ganze Zahl ist?
Das weiß ich leider nicht genau.
und kann ich folgende koordinaten von l und v leicht speicher und wieder abrufen?
Das brauchst du nicht. Denn: Die Player, sind Variablen, die haben z.b. zwei Felder wie X und Y. Wenn du eine Tastertur Steuerung haben möchtest, kannst du einfach X und Y entsprechend verändern.
Jedoch solltest du erst das Spielfeld Zeichnen und dann die Player. Das ist der Vorteil wenn du ein Raster Verwenden kannst. Du kannst ganz leicht auf ein Raster-Feld zugreifen. Aber wenn du die unbedingt speichern möchtest:
Du könntest dir ein Record erstellen, wo du die Felder X und Y angelegst. Dann musst du den Datentyp von deinem Raster ändern und vielleicht noch ein paar kleine Anpassungen vornehmen. Z.B. brauchst du dann noch ein Feld Typ für dein Record. Aber wie schon gesagt: Du brauchst in deinem Raster, keine X und keine Y Werte abspeichern. Ist nicht Notwendig(Meiner Meinung nach).
MFG
Michael Springwald

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: Random, Canvas, Array und anderes

Beitrag von Heinrich Wolf »

scihbam37 hat geschrieben:
und die nächste Frage :D

Code: Alles auswählen

if (b div 30 = true) and (c div 30 = true) then //wobei true hier als ganzzahlig interpretiert werden soll
...
wie kann ich abfragen ob der Wert b div 30 eine ganze Zahl ist?
Hi,

b div 30 ist immer eine ganze Zahl. Vergleich mit true klappt nicht. Wenn b / 30 eine ganze Zahl ist, dann gilt b mod 30 = 0.

Heiner

scihbam37
Beiträge: 32
Registriert: Mi 1. Jun 2011, 21:07

Re: Random, Canvas, Array und anderes

Beitrag von scihbam37 »

pluto hat geschrieben:
und kann ich folgende koordinaten von l und v leicht speicher und wieder abrufen?
Das brauchst du nicht. Denn: Die Player, sind Variablen, die haben z.b. zwei Felder wie X und Y. Wenn du eine Tastertur Steuerung haben möchtest, kannst du einfach X und Y entsprechend verändern.
Jedoch solltest du erst das Spielfeld Zeichnen und dann die Player. Das ist der Vorteil wenn du ein Raster Verwenden kannst. Du kannst ganz leicht auf ein Raster-Feld zugreifen. Aber wenn du die unbedingt speichern möchtest:
Du könntest dir ein Record erstellen, wo du die Felder X und Y angelegst. Dann musst du den Datentyp von deinem Raster ändern und vielleicht noch ein paar kleine Anpassungen vornehmen. Z.B. brauchst du dann noch ein Feld Typ für dein Record. Aber wie schon gesagt: Du brauchst in deinem Raster, keine X und keine Y Werte abspeichern. Ist nicht Notwendig(Meiner Meinung nach).
Das war eher eine allgemeine Frage und nicht auf die Frage davor bezogen.
Kann ich die Werte die bei einer zufälligen Erzeugung in einer Art und Weise abspeichern, die mir ermöglicht, jedem zufällig erzeugtem Objekt die genaue Position zuzuordnen?

Sry aber ich versuche das ohne Arrays zu lösen auch wenn es das vielfack komplizierter und umfassender macht. :wink:

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Random, Canvas, Array und anderes

Beitrag von pluto »

Sry aber ich versuche das ohne Arrays zu lösen auch wenn es das vielfack komplizierter und umfassender macht.
Ohne Array geht es nicht. Du kannst ein Haus auch nicht ohne entsprechendes Material bauen. Es ist wirklich sehr einfach.

Ich habe mir heute überlegt, vielleicht erstelle ich darüber ein kurzes Tutorial.... Hast du dir unser BreakOut angeschaut? Dort haben wir dein Problem bereits gelöst, du musst es nur noch anpassen.
MFG
Michael Springwald

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: Random, Canvas, Array und anderes

Beitrag von Bauer321 »

Ein Array:
Ein Array besteht aus vielen Feldern, wie viele das sind ist festgelegt. Jedes Feld hat einen eigenen Index. Über den Index kann man den Wert den das Array an dieser Stelle hat auslesen.

Code: Alles auswählen

test: array[1..10] of string;
Dieses Array zum Beispiel heißt test und hat 10 Felder vom Typ String deren Index 1, 2 , 3, 4, 5, 6, 7, 8, 9, 10 ist.
Mit array[n] := 'String'; kannst du den String, den das Array an der Stelle n haben soll setzten.
Mit x := array[n]; könntest du diesen dann auch wieder abrufen.

ich weiß, ihr hattet das Thema schon, aber so würde ich den Array erklären.

vielleicht kann man hier auch gleich nochmal einen großen Vorteil nennen ;):
mit einer for Schleife lassen sich Arrays sehr gut auswerten z.B.:

Code: Alles auswählen

//wenn noch kein Text vorhanden ist, dann zaehler erhöhen
for n := 1 to 10 do
  begin
    if array[n] = '' then zaehler += 1; //zaehler += 1 ist das selbe wie zaehler := zaehler + 1;
  end;
Im Gegensatz dazu müsste man wenn man 10 variablen hat, diese erst alle einzeln deklarieren und dann abfragen.
if s1 = '' then ...
if s2 = '' then ...
etc...
www.mcpatcher.net | www.hoeper.me

scihbam37
Beiträge: 32
Registriert: Mi 1. Jun 2011, 21:07

Re: Random, Canvas, Array und anderes

Beitrag von scihbam37 »

ich hab das jetzt so gelöst:

Code: Alles auswählen

for v:= 0 to 10 do
     for k:= 0  to 8 do                
     begin
     l:=30*k+random(2)*60;
     listbox1.Items.Add(inttostr(l));
     listbox2.Items.Add(inttostr(v*30));
     listbox3.Items.Add(inttostr(l+30));
     listbox4.Items.Add(inttostr((v+1)*30));
 
     Image1.Canvas.pen.color:=clblack;
     Image1.Canvas.pen.width:=1;
     Image1.Canvas.brush.color:=clmaroon;
     Image1.canvas.rectangle(l,30*v,l+30,(v+1)*30);
jetzt habe ich die Koordinaten der Blöcke in den Listboxen.

Nun aber die Abfrage ob mein Spieler die gleichen Koordinaten hat bekomme ich nicht richtig hin:

Code: Alles auswählen

for a1:= 0 to listbox1.Items.Count-1 do  
  if (x1=listbox1.item.????) and (y1=listbox2.item.????) then
       ...
x1 soll der Reihe nach mit den Werten aus der 1. Listbox verglichen werden, das selbe soll mit y1 aus der 2.Listbox passieren.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Random, Canvas, Array und anderes

Beitrag von pluto »

jetzt habe ich die Koordinaten der Blöcke in den Listboxen.
Was möchtest du mit den "Koordinaten" anfangen? Das brauchst du nicht. Wirklich.
MFG
Michael Springwald

scihbam37
Beiträge: 32
Registriert: Mi 1. Jun 2011, 21:07

Re: Random, Canvas, Array und anderes

Beitrag von scihbam37 »

Ja ich weiß! Aber trotzdem.

Was muss ich bei der Listbox abfragen damit ich auf den Inhalt zugreifen kann?

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Random, Canvas, Array und anderes

Beitrag von pluto »

Wurde zwar schon angedeutet und ich erkenne auch keinen Sinn darin, aber bitte:
ListBox1.Items[listBox1.ItemIndex] damit bekommst du den Ausgewählten Eintrag als String zurück.
Statt Listbox1.ItemIndex könntest du auch eine direkte zahl nehmen.
MFG
Michael Springwald

Antworten