Random, Canvas, Array und anderes

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

Random, Canvas, Array und anderes

Beitrag von scihbam37 »

Hallo ich habe einige fragen:
Kann man eine Abfrage programmieren bei der der Wert einer variablen (x1) zwischen zwei anderen Werten liegt, z.b. (x3+10<x1>x3-10)?

Kann man bei canvas auch nach Farben abfragen, z.b. if color=black then "stop" ?

Kann mir möglichst einfach jemand die Funktionsweise von Arrays erklären?

Und zu allerletzt, hat jemand eine Idee für ein einfaches Spiel, wie zum Beispiel Snake? Snake habe ich schon programmiert, jetzt brauche ich für ein Schulprojekt ein andere Idee.
Ich habe schon an bomberman gedacht, ist aber sehr aufwendig mit den ganzen blöcken.

Vielen Dank für eure Hilfe

u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: Random, Canvas, Array und anderes

Beitrag von u-boot »

scihbam37 hat geschrieben:Hallo ich habe einige fragen:
Kann man eine Abfrage programmieren bei der der Wert einer variablen (x1) zwischen zwei anderen Werten liegt, z.b. (x3+10<x1>x3-10)?
Ist erst mal eine Ungleichung oder 2 Ungleichungen ... keine Ahnung was da ne Abfrage sein soll.
scihbam37 hat geschrieben: Kann man bei canvas auch nach Farben abfragen, z.b. if color=black then "stop" ?
Ja geht schon .. evtl klein wenig anders aber geht...
scihbam37 hat geschrieben: Kann mir möglichst einfach jemand die Funktionsweise von Arrays erklären?
Ein Array ist eine indizierte Liste von Variablen gleichen Typs. <--- Ich persönlich kann mit dieser Definition halbwegs arbeiten. Muss aber nicht unbedingt ganz korrekt sein.
Wenn du schon Schulprojekte machst ... -> dein Lehrer wird dafür bezahlt
scihbam37 hat geschrieben: Und zu allerletzt, hat jemand eine Idee für ein einfaches Spiel, wie zum Beispiel Snake? Snake habe ich schon programmiert, jetzt brauche ich für ein Schulprojekt ein andere Idee.
Ich habe schon an bomberman gedacht, ist aber sehr aufwendig mit den ganzen blöcken.
Vielen Dank für eure Hilfe
Grad nich aber such mal im Forum nach Schule... Gab schon andere Beiträge in der Richtung.

.oO Wie bekommt man snake hin und hat trotzdem noch solche Fragen ?
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

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

Re: Random, Canvas, Array und anderes

Beitrag von scihbam37 »

Danke schonmal dafür...

Also ich habe dieses Feld, 342x342.
Feld
Feld
feld.PNG (9.34 KiB) 2125 mal betrachtet
Jetzt möchte ich, dass der Rote/Blaue Spieler nicht über die schwarzen Blöcke laufen kann, gibt es eine einfachere Möglichkeit als diese

Code: Alles auswählen

if (y1<61) and (y1>2) and (x1=2) then     //y1 und x1 sind die Positionsangaben des roten Spielers
    radiobutton4.checked:=false;
 if (y1<123) and (y1>64)and (x1=2) then
   radiobutton4.Checked:=false;
  if (y1<185) and (y1>126)and (x1=2) then
   radiobutton4.checked:=false;
 if (y1<247) and (y1>190)and (x1=2) then
   radiobutton4.Checked:=false;
  if (y1<309) and (y1>254)and (x1=2) then
   radiobutton4.checked:=false;
dies war jetzt für die 1. Spalte an Blöcken, für eine Seite, sehr aufwendig für meinen Geschmack. :wink:

Benutzeravatar
theo
Beiträge: 10861
Registriert: Mo 11. Sep 2006, 19:01

Re: Random, Canvas, Array und anderes

Beitrag von theo »

scihbam37 hat geschrieben:gibt es eine einfachere Möglichkeit als diese
Ja. :wink:

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Random, Canvas, Array und anderes

Beitrag von mschnell »

Beachte die alte Programmier-Lehre:

Input -> Verarbeitung -> Output.

Das Bild ist ein Output und sollte für die Verarbeitung nicht verwendet werden.

Speicher Dir die Positionen der Spielsteine in ein Feld und mache in einem separaten Schritt die Ausgabe, also die Erzeugung des Bildes auf der Oberfläche.

-Michael

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

Re: Random, Canvas, Array und anderes

Beitrag von scihbam37 »

Schön, aber eine Erklärung wie das geht wäre auch hilfreich ;)

Kann ich im Quelltexeditor links erstellen, die wenn ich auf eine procedure klicke zu dieser springt oder wieder zum anfang?

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Random, Canvas, Array und anderes

Beitrag von MAC »

Ich will nochetwas zu dem Input Verarbeitung Output zeug sagen...

Eigentlich ne tolle idee nachzuprüfen ob das feld schwarz ist, hat aber nur ein Problem... ES IST LANGSAM. VERDAMMT LANGSAM.
So ein Bild ist intern nichts anderes als ein 2 Dimensionales Array. Durch googlen bekommst du genug beschreibungen von Arrays, auch leicht formulierte)

Dein Spielbrett ist 11 x 11 Felder groß.
Dein Bild allerdings 349 x 349.

In deinem Bild kannst du bis zu 16777215 Farbkombinationen spichern, du brauchst aber genau 4.
Außerdem wurde es viel mehr Felder zu durchzuchen geben da dein Feld 349*349 = 121801 Pixel und der Array nur 121 "Pixel" hat (Wenn du 2 Dimensionales Array machst was von [0..10,0..10] geht also auf der x koordinate von 0 zu 10 und auf der y koordinate auch...)...
reichen würde also ein

Code: Alles auswählen

meinarray : Array [0..10,0..10] of byte;
du hast jetzt also 256 verschidene Kombinationen (da zu 1 Byte verwendest) die du in jeden spielfeld speichern kannst.
Z.B sagst du die 0 steht für leer, die 1 für besetzt die 2 für spieler 1 und die 3 für spieler 2...

Ach ja mein Tipp such mal auf DelphiTreff nach arrays oder mit hilfe von Google nach "Lazarus Array" bzw "Delphi Array" da sich Lazarus und Delphi sehr ähneln und es eine Menge tutorial zu delphi gibt...

Code: Alles auswählen

Signatur := nil;

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 »

Da es ein Raster ist kannst du ganz einfach feststellen ob der Player ein schwarzen Punkt beürht oder nicht:
Du hast die Player Koordinaten. Die beziehen sich auf die Linke Obere Ecke. Die musst du einfach nur durch die Größe der Felder im Raster Teilen und schon hast du die Raster Position und kannst prüfen ob da ein Eintrag ist oder nicht.

Z.b. so:

Code: Alles auswählen

X:=(PlayerX div RasterFeldBreite)
Y:=(PlayerY div RasterFeldHoehe)
if Map[y,x].typ > 0 then 
  writeln('belegt')
else
  writeln('unblegt');
Ist nur ein Beispiel, wird bei dir nicht so laufen, aber du kannst es relativ leicht anpassen.

So kannst du auch dein Raster Zeichnen, in dem du es ganz einfach durch gehst und deine Unterschiedlichen Objekte zeichnen, dass können auch Grafiken sein. Wenn du gar nicht zu recht kommst, könnte ich ein einfaches Beispiel machen, aber du es nicht beschreiben kannst, wird es dir nicht viel nützten. Wie hast du dein Snake gemacht? Dann dürfte das hier kein Problem für dich sein.
Zuletzt geändert von Lori am So 4. Mär 2012, 11:33, insgesamt 1-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 »

okey ich werde es probieren... :)

wo ich unbedingt Hilfe bräuchte wäre bei der Abfrage der Farbe von cnavas.

Ich erzeuge an zufälligen Positionen Blöcke, gegen die der Spieler laufen soll, also nicht dran vorbeikommt.
Diese Blöcke male ich mit canvas.
Ich bräuchte jetzt eine Prozedur die ungefähr das macht:

Code: Alles auswählen

procedure blockimweg;
begin
 if x1=canvas.colour=maroon then 
  //nichtweitergehen
end;
das nichtweitergehen ist kein Problem, nur wie bekomme ich die property von dem canvas in die Abfrage?
das erzeugen der blöcke sieht so aus:

Code: Alles auswählen

x3:=30+random(2)*60; 
 
  form1.Image1.Canvas.pen.color:=clblack;
  form1.Image1.Canvas.pen.width:=2;
  form1.Image1.Canvas.brush.color:=clmaroon;
  form1.Image1.canvas.rectangle(x3,0,x3+30,30);

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 »

Du brauchst nicht die Farbe abzufragen.

Du hast ein 2D Array. Jeder Eintrag könnte ein Record sein. Der Record könnte ein Feld unter anderen bekommen, wo der Typ drin ist. Z.B. wenn es nur ein Typ gibt: Frei oder nicht frei könnt es auch ein Boolean Feld sein.
Die kannst du dann ganz einfach abfragen und entsprechend Zeichnen.
Die Player würde in zwei Variablen ablegen: Es könnte ein Player Record geben und du zeichnest dann zuerst das Raster und dann die Player.

Hinweis: " form1.Image1.Canvas.pen.color:=clblack;" Damit legst du die Rahmen Farbe fest, nicht aber den Hintergrund. Der Hintergrund legst du mit form1.image1.canvas.brush.color:=...; fest.
Du hast einmal Raster-Positionen und einmal Zeichnen Positionen. Wenn du ein 2D Array verwendest. Such hier mal nach BreakOut. Du solltest dazu ein Gutes Beispiel Finden, dass ist auch relativ gut Kommentiert.
MFG
Michael Springwald

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Random, Canvas, Array und anderes

Beitrag von MAC »

scihbam37 hat geschrieben: Ich bräuchte jetzt eine Prozedur die ungefähr das macht:

Code: Alles auswählen

procedure blockimweg;
begin
 if x1=canvas.colour=maroon then 
  //nichtweitergehen
end;
Genau das ist es was du verhindern solltest. Das Bild ist der Output.
Du solltest intern ein 2 dimensionales Array verwdenn wo dann gespeichert wird ob das feld frei oder belegt ist...
Und dann diese informationen bearbeiten und alle 100 ms rendern...

Code: Alles auswählen

Signatur := nil;

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 »

Und dann diese informationen bearbeiten und alle 100 ms rendern...
Ist in diesen Fall nicht unbedingt Notwendig, es könnte ausreichen wenn nur neu gerendet wird wenn sich auch was geändert hat, aber es ist deutlich einfacher....
MFG
Michael Springwald

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

Re: Random, Canvas, Array und anderes

Beitrag von scihbam37 »

pluto hat geschrieben:Du brauchst nicht die Farbe abzufragen.

Du hast ein 2D Array. Jeder Eintrag könnte ein Record sein. Der Record könnte ein Feld unter anderen bekommen, wo der Typ drin ist. Z.B. wenn es nur ein Typ gibt: Frei oder nicht frei könnt es auch ein Boolean Feld sein.
Die kannst du dann ganz einfach abfragen und entsprechend Zeichnen.
Die Player würde in zwei Variablen ablegen: Es könnte ein Player Record geben und du zeichnest dann zuerst das Raster und dann die Player.

Hinweis: " form1.Image1.Canvas.pen.color:=clblack;" Damit legst du die Rahmen Farbe fest, nicht aber den Hintergrund. Der Hintergrund legst du mit form1.image1.canvas.brush.color:=...; fest.
Du hast einmal Raster-Positionen und einmal Zeichnen Positionen. Wenn du ein 2D Array verwendest. Such hier mal nach BreakOut. Du solltest dazu ein Gutes Beispiel Finden, dass ist auch relativ gut Kommentiert.
ich glaube ihr habt ein falsches Bild von meinen Delphi Kenntnissen... :?
Ich habe keine Ahnung von arrays oder records, mein snake Spiel war auch nur die Bewegung eines Bildes, und wenn es die Position des Futters erreicht hat gab es einen Punkt. Sehr simpel.

Könntet ihr mir vielleicht die Grundlage geben, also das Erstellen des Arrays und dann die Abfrage nach dem Inhalt?

Im Moment habe ich alle procedures für beide Spieler einzelnd "geschrieben" (copy and paste), mein Quelltext ist ca. 700 Zeilen lang. Dabei unterscheiden diese procedures sich nur um eine Variable.

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Random, Canvas, Array und anderes

Beitrag von MAC »

doch das haben wir, du hast es ja bereits geschrieben :)
Ich will dir nix böses und auch nicht unhöflich sein, aber es wäre besser wenn du nochmal hier die posts liest.
Ich habe eben nämlich erwähnt das die grundlagen in arrays vielfach behandelt werden. Sogar in besonders guten Tutorials.
Man findet sie eigentlich ganz einfach, kurz nach "Lazarus Array" bzw "Delphi Array" suchen...
Ein weiterer Anhaltspunkt für allgemeine Anfänger Tutorials ist der Delphi Treff. Dort gibt es auch eine Einleitung zu Arrays...

Code: Alles auswählen

var
meinarray : Array [0..10,0..10] of boolean; // True wenn Besetzt    False Wenn Frei
Zugriff auf ein Element, das oben Links, bzw das ellement [0,0]

Code: Alles auswählen

meinarray[0,0] := True;
Zugriff auf eine Zeile

Code: Alles auswählen

var
i:integer;
for i := 0 to 10 do meinarray[i,0] := True;
// oder
for i := low(meinarray) to high(meinarray) do meinarray[i,0] := True;
// fals du dein array vergrößern willst musst du es nicht in jeder zeile anpassen...
Zugriff auf alles, ein paar felder frei machen, manche nicht

Code: Alles auswählen

var
i,i2:integer;
for i := 0 to 10 do 
 begin
 for i2 := 0 to 10 do
  begin
  meinarray[i,i2] := (random < 0.2); // wenn eine zuffalszahl von 0 .. 1 kleiner 0.2 ist wird das beld besetzt sonnst ist es frei...
  end;
 end;

Code: Alles auswählen

Signatur := nil;

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 »

@scihbam37
So gemein es auch klingen mag, wenn du es dir selbst erarbeitest, hast du in der Regel mehr davon. Es dauert vielleicht etwas länger, aber der Effekt ist einfach größer.

Hier sind einige Themen, mit den du dich auseinander setzten könntest:
1. 2D Array: Jedes Objekt ist gleich groß. Jede Zeile könnte die gleiche Anzahl von Spalten haben.
2. TPaintBox, TBitMap, Canvas.
3. Für Level Datei Zugriff: TStringList, TMemoryStream
Und wie gesagt: Es gibt hier ein sehr gutes Beispiel: BreakOut. Das haben wir mal bei einem Lazarus-Treffen erstellt. Von Beispieln kann man sehr viel Lernen. Wenn du einige gezielte Fragen hast, können wir dir auch gezielte Antworten geben. Aber deine Fragen sind bisher zu Allgemein gehalten.
MFG
Michael Springwald

Antworten