Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Prism Schiffe versenken Delphi Hilfe!! (https://www.delphipraxis.net/151767-schiffe-versenken-delphi-hilfe.html)

deznutsxi 31. Mai 2010 23:36


Schiffe versenken Delphi Hilfe!!
 
Hallo!!
Ich habe mich mit Delphi beschäftigt und benötige Hilfe.
Wollte SChiffe versenken programmieren, stehe jedoch vor einigen Problemen.
Wenn ich mit der Button2.Click procedure die SChiffe verstecken will (maximal 5) ist es dennoch möglich
mehr als 5 Schiffe zu verstecken, obwohl dies eigentlich durch die Kopfschleife verhindert seien sollte. Beim zufälligen Verstecken werden aber immer nur 5 "versteckt".
Jetzt noch eine andere Frage, wie kann ich die angezeigten Schiffe dann "unsichtbar" machen,sodass erst bei einem Treffer deren Position wieder erkennbar ist, bzw. wie wäre das "Suchen" der Schiffe am Besten umsetzbar!?

Vielen Dank für eure Hilfe :)

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    Image2: TImage;
    Image3: TImage;
    Image4: TImage;
    Image5: TImage;
    Image6: TImage;
    Image7: TImage;
    Image8: TImage;
    Image9: TImage;
    Image10: TImage;
    Image11: TImage;
    Image12: TImage;
    Image13: TImage;
    Image14: TImage;
    Image15: TImage;
    Image16: TImage;
    Image17: TImage;
    Image18: TImage;
    Image19: TImage;
    Image20: TImage;
    Image21: TImage;
    Image22: TImage;
    Image23: TImage;
    Image24: TImage;
    Image25: TImage;
    Image26: TImage;
    Image27: TImage;
    Image28: TImage;
    Image29: TImage;
    Image30: TImage;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label13: TLabel;
    Label12: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure anzeige();
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  i,j,k:integer;
  a:array[1..5,1..6] of integer;

implementation

{$R *.dfm}

procedure TForm1.anzeige();


begin
if a[1][1]=0 then image1.picture.LoadFromFile('wasser.jpg');
if a[1][1]=1 then image1.picture.LoadFromFile('schuss.jpg');
if a[1][1]=2 then image1.picture.LoadFromFile('schiff.jpg');
if a[1][1]=3 then image1.picture.LoadFromFile('wrack.jpg');

if a[1][2]=0 then image2.picture.LoadFromFile('wasser.jpg');
if a[1][2]=1 then image2.picture.LoadFromFile('schuss.jpg');
if a[1][2]=2 then image2.picture.LoadFromFile('schiff.jpg');
if a[1][2]=3 then image2.picture.LoadFromFile('wrack.jpg');

if a[1][3]=0 then image3.picture.LoadFromFile('wasser.jpg');
if a[1][3]=1 then image3.picture.LoadFromFile('schuss.jpg');
if a[1][3]=2 then image3.picture.LoadFromFile('schiff.jpg');
if a[1][3]=3 then image3.picture.LoadFromFile('wrack.jpg');

if a[1][4]=0 then image4.picture.LoadFromFile('wasser.jpg');
if a[1][4]=1 then image4.picture.LoadFromFile('schuss.jpg');
if a[1][4]=2 then image4.picture.LoadFromFile('schiff.jpg');
if a[1][4]=3 then image4.picture.LoadFromFile('wrack.jpg');

if a[1][5]=0 then image5.picture.LoadFromFile('wasser.jpg');
if a[1][5]=1 then image5.picture.LoadFromFile('schuss.jpg');
if a[1][5]=2 then image5.picture.LoadFromFile('schiff.jpg');
if a[1][5]=3 then image5.picture.LoadFromFile('wrack.jpg');

if a[1][6]=0 then image6.picture.LoadFromFile('wasser.jpg');
if a[1][6]=1 then image6.picture.LoadFromFile('schuss.jpg');
if a[1][6]=2 then image6.picture.LoadFromFile('schiff.jpg');
if a[1][6]=3 then image6.picture.LoadFromFile('wrack.jpg');

if a[2][1]=0 then image7.picture.LoadFromFile('wasser.jpg');
if a[2][1]=1 then image7.picture.LoadFromFile('schuss.jpg');
if a[2][1]=2 then image7.picture.LoadFromFile('schiff.jpg');
if a[2][1]=3 then image7.picture.LoadFromFile('wrack.jpg');

if a[2][2]=0 then image8.picture.LoadFromFile('wasser.jpg');
if a[2][2]=1 then image8.picture.LoadFromFile('schuss.jpg');
if a[2][2]=2 then image8.picture.LoadFromFile('schiff.jpg');
if a[2][2]=3 then image8.picture.LoadFromFile('wrack.jpg');

if a[2][3]=0 then image9.picture.LoadFromFile('wasser.jpg');
if a[2][3]=1 then image9.picture.LoadFromFile('schuss.jpg');
if a[2][3]=2 then image9.picture.LoadFromFile('schiff.jpg');
if a[2][3]=3 then image9.picture.LoadFromFile('wrack.jpg');

if a[2][4]=0 then image10.picture.LoadFromFile('wasser.jpg');
if a[2][4]=1 then image10.picture.LoadFromFile('schuss.jpg');
if a[2][4]=2 then image10.picture.LoadFromFile('schiff.jpg');
if a[2][4]=3 then image10.picture.LoadFromFile('wrack.jpg');

if a[2][5]=0 then image11.picture.LoadFromFile('wasser.jpg');
if a[2][5]=1 then image11.picture.LoadFromFile('schuss.jpg');
if a[2][5]=2 then image11.picture.LoadFromFile('schiff.jpg');
if a[2][5]=3 then image11.picture.LoadFromFile('wrack.jpg');

if a[2][6]=0 then image12.picture.LoadFromFile('wasser.jpg');
if a[2][6]=1 then image12.picture.LoadFromFile('schuss.jpg');
if a[2][6]=2 then image12.picture.LoadFromFile('schiff.jpg');
if a[2][6]=3 then image12.picture.LoadFromFile('wrack.jpg');

if a[3][1]=0 then image13.picture.LoadFromFile('wasser.jpg');
if a[3][1]=1 then image13.picture.LoadFromFile('schuss.jpg');
if a[3][1]=2 then image13.picture.LoadFromFile('schiff.jpg');
if a[3][1]=3 then image13.picture.LoadFromFile('wrack.jpg');

if a[3][2]=0 then image14.picture.LoadFromFile('wasser.jpg');
if a[3][2]=1 then image14.picture.LoadFromFile('schuss.jpg');
if a[3][2]=2 then image14.picture.LoadFromFile('schiff.jpg');
if a[3][2]=3 then image14.picture.LoadFromFile('wrack.jpg');

if a[3][3]=0 then image15.picture.LoadFromFile('wasser.jpg');
if a[3][3]=1 then image15.picture.LoadFromFile('schuss.jpg');
if a[3][3]=2 then image15.picture.LoadFromFile('schiff.jpg');
if a[3][3]=3 then image15.picture.LoadFromFile('wrack.jpg');

if a[3][4]=0 then image16.picture.LoadFromFile('wasser.jpg');
if a[3][4]=1 then image16.picture.LoadFromFile('schuss.jpg');
if a[3][4]=2 then image16.picture.LoadFromFile('schiff.jpg');
if a[3][4]=3 then image16.picture.LoadFromFile('wrack.jpg');

if a[3][5]=0 then image17.picture.LoadFromFile('wasser.jpg');
if a[3][5]=1 then image17.picture.LoadFromFile('schuss.jpg');
if a[3][5]=2 then image17.picture.LoadFromFile('schiff.jpg');
if a[3][5]=3 then image17.picture.LoadFromFile('wrack.jpg');

if a[3][6]=0 then image18.picture.LoadFromFile('wasser.jpg');
if a[3][6]=1 then image18.picture.LoadFromFile('schuss.jpg');
if a[3][6]=2 then image18.picture.LoadFromFile('schiff.jpg');
if a[3][6]=3 then image18.picture.LoadFromFile('wrack.jpg');

if a[4][1]=0 then image19.picture.LoadFromFile('wasser.jpg');
if a[4][1]=1 then image19.picture.LoadFromFile('schuss.jpg');
if a[4][1]=2 then image19.picture.LoadFromFile('schiff.jpg');
if a[4][1]=3 then image19.picture.LoadFromFile('wrack.jpg');

if a[4][2]=0 then image20.picture.LoadFromFile('wasser.jpg');
if a[4][2]=1 then image20.picture.LoadFromFile('schuss.jpg');
if a[4][2]=2 then image20.picture.LoadFromFile('schiff.jpg');
if a[4][2]=3 then image20.picture.LoadFromFile('wrack.jpg');

if a[4][3]=0 then image21.picture.LoadFromFile('wasser.jpg');
if a[4][3]=1 then image21.picture.LoadFromFile('schuss.jpg');
if a[4][3]=2 then image21.picture.LoadFromFile('schiff.jpg');
if a[4][3]=3 then image21.picture.LoadFromFile('wrack.jpg');

if a[4][4]=0 then image22.picture.LoadFromFile('wasser.jpg');
if a[4][4]=1 then image22.picture.LoadFromFile('schuss.jpg');
if a[4][4]=2 then image22.picture.LoadFromFile('schiff.jpg');
if a[4][4]=3 then image22.picture.LoadFromFile('wrack.jpg');

if a[4][5]=0 then image23.picture.LoadFromFile('wasser.jpg');
if a[4][5]=1 then image23.picture.LoadFromFile('schuss.jpg');
if a[4][5]=2 then image23.picture.LoadFromFile('schiff.jpg');
if a[4][5]=3 then image23.picture.LoadFromFile('wrack.jpg');

if a[4][6]=0 then image24.picture.LoadFromFile('wasser.jpg');
if a[4][6]=1 then image24.picture.LoadFromFile('schuss.jpg');
if a[4][6]=2 then image24.picture.LoadFromFile('schiff.jpg');
if a[4][6]=3 then image24.picture.LoadFromFile('wrack.jpg');

if a[5][1]=0 then image25.picture.LoadFromFile('wasser.jpg');
if a[5][1]=1 then image25.picture.LoadFromFile('schuss.jpg');
if a[5][1]=2 then image25.picture.LoadFromFile('schiff.jpg');
if a[5][1]=3 then image25.picture.LoadFromFile('wrack.jpg');

if a[5][2]=0 then image26.picture.LoadFromFile('wasser.jpg');
if a[5][2]=1 then image26.picture.LoadFromFile('schuss.jpg');
if a[5][2]=2 then image26.picture.LoadFromFile('schiff.jpg');
if a[5][2]=3 then image26.picture.LoadFromFile('wrack.jpg');

if a[5][3]=0 then image27.picture.LoadFromFile('wasser.jpg');
if a[5][3]=1 then image27.picture.LoadFromFile('schuss.jpg');
if a[5][3]=2 then image27.picture.LoadFromFile('schiff.jpg');
if a[5][3]=3 then image27.picture.LoadFromFile('wrack.jpg');

if a[5][4]=0 then image28.picture.LoadFromFile('wasser.jpg');
if a[5][4]=1 then image28.picture.LoadFromFile('schuss.jpg');
if a[5][4]=2 then image28.picture.LoadFromFile('schiff.jpg');
if a[5][4]=3 then image28.picture.LoadFromFile('wrack.jpg');

if a[5][5]=0 then image29.picture.LoadFromFile('wasser.jpg');
if a[5][5]=1 then image29.picture.LoadFromFile('schuss.jpg');
if a[5][5]=2 then image29.picture.LoadFromFile('schiff.jpg');
if a[5][5]=3 then image29.picture.LoadFromFile('wrack.jpg');

if a[5][6]=0 then image30.picture.LoadFromFile('wasser.jpg');
if a[5][6]=1 then image30.picture.LoadFromFile('schuss.jpg');
if a[5][6]=2 then image30.picture.LoadFromFile('schiff.jpg');
if a[5][6]=3 then image30.picture.LoadFromFile('wrack.jpg');


end;

procedure TForm1.Button1Click(Sender: TObject);

begin
randomize;

for i:=1 to 5 do
  for j:=1 to 6 do
      a[i][j]:=0;

k:=1;
while (k<=5) do
begin
i:=random(5)+1;
j:=random(6)+1;
  if a[i][j]=0 then
  begin
  a[i][j]:=2;
  k:=k+1;
  end;

anzeige();

  end;
  end;



procedure TForm1.Button2Click(Sender: TObject);

begin
k:=1;
i:=strtoint(edit1.Text);
j:=strtoint(edit2.text);
if a[i][j]=0 then
while (k<=5) do
  begin
  a[i][j]:=2;
  k:=k+1;
  end;

anzeige();

  end;


end.

DeddyH 1. Jun 2010 08:19

Re: Schiffe versenken Delphi Hilfe!!
 
Zitat:

Delphi-Quellcode:
while (k<=5) do
  begin
  a[i][j]:=2;
  k:=k+1;
  end;

Überleg einmal, was Du hier tust: Du weist demselben Feld 5 mal nacheinander denselben Wert zu.

[edit] P.S: Willkommen in der DP :dp:
P.P.S: Bist Du sicher, dass es sich um .NET handelt? [/edit]

mkinzler 1. Jun 2010 08:28

Re: Schiffe versenken Delphi Hilfe!!
 
Zitat:

P.P.S: Bist Du sicher, dass es sich um .NET handelt?
Ich bin mir sicher, dass es sich nicht um .Net handelt

idefix2 1. Jun 2010 08:33

Re: Schiffe versenken Delphi Hilfe!!
 
Nur nebenbei: Schleifen mit einer festen Anzahl von Durchläufen sollte man immer mit einer for Schleife und nicht mit einer while Schleife programmieren. Damit wäre dir dann vielleicht noch eher aufgefallen, dass du in der schleife 5 mal genau dasselbe machst:

Delphi-Quellcode:
for k:=1 to 5 do
    a[i][j]:=2;

Jürgen Thomas 1. Jun 2010 08:59

Re: Schiffe versenken Delphi Hilfe!!
 
Hallo und ebenfalls willkommen,

Meine Hinweise stehen unter Vorbehalt: Ich habe mir dein Vorgehen "von der Sachlogik" her nicht durchdacht.

Noch etwas zur Verbesserung: Die 1000 if-then-Konstruktionen sind nicht schön, weil in allen Fällen alle Prüfungen durchlaufen werden müssen, aber in jedem Abschnitt genau eine Variante zutreffen kann. Besser ist eine verschachtelte Konstruktion (kein wirklicher Delphi-Code) etwa so:
Delphi-Quellcode:
var Current_Image;
case (erster Index) of
  1: case (zweiter Index) of
       1: Current_Image = image1;
// usw.
case a[i][j] of

  0: Current_Image.picture.LoadFromFile('wasser.jpg');
// usw.
Damit zusammenhängend könnte die Anzeige-Prozedur geändert werden: Entweder es werden alle Bilder neu angezeigt, dann ist die o.g. Verschachtelung sinnvollerweise in eine doppelte Schleife umzusetzen. Oder es wird ein Bild neu angezeigt, dann sollten die Indizes als Parameter an die Anzeige-Prozedur übergeben und genutzt werden.

Wie gesagt: unter Vorbehalt, aber als Anregung auf jeden Fall nützlich.

Gruß Jürgen

[edit=mkinzler]Code-Tag durch Delphi-Tag ersetzt Mfg, mkinzler[/edit]

idefix2 1. Jun 2010 09:32

Re: Schiffe versenken Delphi Hilfe!!
 
Die ganzen Abfagen kann man sich sparen mit:

Delphi-Quellcode:
const bildname: array[0..3] of string = ('wasser.jpg', 'schuss.jpg', 'schiff.jpg', 'wrack.jpg');
....

image1.picture.loadfromfile(bildname[a[1][1]]);
image2.picture.loadfromfile(bildname[a[1][2]]);
....
Und auf die Komponenten kann man in einer Schleife über den Namen zugreifen
'image'+intoToStr(i)


Nachdem Windows den Dateizugriff wohl im Cache halten wird, ist es vielleicht egal, trotzdem würde ich eher ein Feld mit 4 TImage Variablen anlegen und in die nur einmal die Bilder einlesen, unzählige Male die Dateien öffnen und lesen ist sicher nicht sinnvoll:

Delphi-Quellcode:
var bild: array [0..3] of timage;
bild[0].loadfromfile ('wasser.jpg');
bild[1].loadfromfile ('schuss.jpg');
und dann
Delphi-Quellcode:
image1.picture := bild[a[1][1]];
image2.picture := bild[a[1][2]];
...

[edit=mkinzler]Delphi-Tag eingefügt Mfg, mkinzler[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:59 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