Re: Schiffe versenken, Platzierung
Zitat:
Grundlagentutorial |
Re: Schiffe versenken, Platzierung
Mhh..
Char zu benutzen wäre auf jedenfall intelligenter, da hast du recht. Nur hab ich noch nie damit gearbeitet, deswegen weiß ich zB. nicht wie ich meinen Quelltext daran anpassen kann. Nehmen wir mal
Delphi-Quellcode:
Diese Abfrage setzt ja Boolean voraus, wie sieht sie unter Verwendung von Char aus?
begin
with sender as TDrawgrid do begin if arr2[acol,arow] then canvas.brush.color := clred else canvas.brush.color := clwhite; canvas.fillrect(rect); end; end; :) |
Re: Schiffe versenken, Platzierung
Das müsste dann so gehen:
Delphi-Quellcode:
begin
with sender as TDrawgrid do begin if not(arr2[acol,arow] = '*') //wenn hier kein * ist, dann wird ... clRed ausgeführt then canvas.brush.color := clred else canvas.brush.color := clwhite; canvas.fillrect(rect); end; end; |
Re: Schiffe versenken, Platzierung
Hat geklappt danke :)
Hab jetzt fast alles umgeschrieben damit array of char akzeptiert wird, nur der Teil mit dem TRect macht mir noch Probleme.
Delphi-Quellcode:
Es ist das Feld um das Schiff, damit man die Schiffe nicht direkt aneinander oder ineinander Platzieren kann.
DrawGrid1.MouseToCell(X, Y,Col, Row); //Mausposition auslesen
r.Left :=Col-1; r.Top :=Row-1; if Horizontal=0 then begin r.Right:=col+z; r.Bottom:=Row+1; end else begin r.Right:=col+1; R.Bottom:=row+z; end; if r.Left = -1 then r.Left := 0; if r.Top = -1 then r.Top := 0; if r.Right =10 then r.Right := r.Right -1; if r.Bottom = 10 then r.Bottom := r.Bottom -1; gueltig:=true; for iX := r.Left to r.Right do //Hier müsste for iY := r.Top to r.Bottom do //noch etwas geändert if (arr2[iX,iY]='k') then gueltig := false; //werden, nur was? Die Platzierung wird in eine If-Abfrage gesetzt (if gueltig then), nur im Moment bin ich ein klein wenig verwirrt. :^) |
Re: Schiffe versenken, Platzierung
Hallo!
Mir war langweilig :), und dachte ich schreib dir schnell meine Variante dazu..
Delphi-Quellcode:
Hoffe das hilft dir :)
type
//Schiff Typ (Size, Senkrecht?) TTypus = Record Size : Integer; Senkrecht : Boolean; end; //Form TForm1 = class(TForm) DrawGrid1: TDrawGrid; procedure DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); procedure DrawGrid1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; //NewGame procedure NewGame(); var Form1: TForm1; //Schiffm Typen (0=Unbesetz, 1=Besetzt, 2=Treffer) Ships : Array[0..25, 0..20] of Integer; Typen : Array[0..2] of TTypus; //Aktiv - Gesetzt Schiff-typ Aktiv : Integer; //State - 0 = Setzen, 1=Play.. State : Integer; implementation {$R *.dfm} procedure NewGame(); var X, Y : Integer; begin //---- //Neues Spiel //---- for Y := 0 to 20 do for X := 0 to 25 do Ships[X, Y] := 0; // Form1.DrawGrid1.Repaint; end; procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin //---- //DrawCell - TDrawGrid //---- with Sender as TDrawGrid do begin // case Ships[aCol, aRow] of 0: Canvas.Brush.Color := clWhite; //Frei 1: Canvas.Brush.Color := clRed; //Besetzt 2: Canvas.Brush.Color := clBlue; //Treffer end; // canvas.fillrect(rect); end; end; procedure TForm1.DrawGrid1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var Row, Col : Integer; I, iX, iY : Integer; Typ : TTypus; //------------------ Collision : Boolean; begin //---- //Setze ein Schiff //---- DrawGrid1.MouseToCell(X, Y, Col, Row); // if State = 1 then begin //Treffer if Ships[Col, Row] = 1 then Ships[Col, Row] := 2 else ShowMessage('Kein Treffer!'); //Alle gefunden? Collision := True; for iY := 0 to 20 do for iX := 0 to 25 do if Ships[iX,iY] = 1 then Collision := False; // if Collision then //Gewonnen ShowMessage('Sie haben gewonnen!'); Exit; end; //Typ Typ := Typen[Aktiv]; //Prüfen Collision := False; if not Typ.Senkrecht then for I := -1 to Typ.Size do begin if Ships[Col+I, Row] = 1 then Collision := True; //Auf den Seiten? if Ships[Col+I, Row+1] = 1 then Collision := True; if Ships[Col+I, Row-1] = 1 then Collision := True end else for I := -1 to Typ.Size do begin if Ships[Col, Row+I] = 1 then Collision := True; //Auf den Seiten? if Ships[Col+1, Row+I] = 1 then Collision := True; if Ships[Col-1, Row+I] = 1 then Collision := True; end; //Collision? if Collision then begin ShowMessage('Sie können hier kein Schiff setzen!'); Exit; end; // if not Typ.Senkrecht then for I := 0 to Typ.Size-1 do Ships[Col+I, Row] := 1 else for I := 0 to Typ.Size-1 do Ships[Col, Row+I] := 1; // DrawGrid1.Repaint; end; procedure TForm1.FormCreate(Sender: TObject); begin //-------- //Form Create //-------- //Typen //-------------------------- //5er Schiff Waagrecht Typen[0].Size := 5; Typen[0].Senkrecht := False; //3er Schiff Senkrecht Typen[1].Size := 3; Typen[1].Senkrecht := True; //2er Schiff Senkrecht Typen[2].Size := 2; Typen[2].Senkrecht := True; //-------------------------- //Aktives Schiff (0-2) Aktiv := 2; // State := 0; end; lg Edit : Spielmode hinzugefügt... Edit2: Dachte man kann die Schiffe auch nebeinander bauen :S Jetzt aber nicht mehr :) |
Re: Schiffe versenken, Platzierung
Vielen, vielen Dank :)
Es gibt nicht mehr viele Leute die so hilfsbereit sind wie du :) Aber ich hab das Gefühl das nahezu alle hier in der DP unglaublich nett sind :) Ich werd mir das alles morgen genauer anschauen, da ich heute im Stress bin. Mit freundlichen Grüßen m2zer0 :) |
Re: Schiffe versenken, Platzierung
Zitat:
Ich weiß nicht ob ich dich richtig verstehe, aber ich glaube du hättest gerne sowas:
Delphi-Quellcode:
...
gueltig:=true; for iX := r.Left to r.Right do for iY := r.Top to r.Bottom do if not(arr2[iX,iY]='*') then gueltig := false; //wenn auf dem Feld ein Schiff irgendeiner Art ist (in deinem Beispiel gingen nur k-Schiffe), wird gueltig auf false gesetzt |
Re: Schiffe versenken, Platzierung
Zitat:
Bei meinem Code erkennt man nicht ob ein ganzes Schiff versenkt worden ist Tipp: Verwende statt "Integer" einen eigenen Typ! z.B.:
Delphi-Quellcode:
lg
type
TShip = Record Typ : TTypus; Treffer : array[0..10] of Boolean; //Wahr = Treffer, max. 11 end; //.. Ships : Array[-1..20, -1..25] of TShip; //Prüfen ob ganzes Schiff versenkt! var iX, iY, I : Integer; for iY := 0 to 20 do for iX := 0 to 25 do begin Collision := True; for I := Low(Ships[iX, iY].Treffer) to High(Ships[iX, iY].Treffer) do if not Ships[iX, iY].Treffer[I] then Collision := False; //Versenkt? if Collision then ShowMessage('Schiff Position (X, Y): ' + inttostr(iX)+', ' + inttostr(iY) +^J+ 'Wurde versenkt!'); end; |
Re: Schiffe versenken, Platzierung
Da ich auch gerne Anzeigen lassen würde welches Schiff versenkt würde, benutze ich lieber, wie mir einige posts zuvor gesagt wurde:
Array of Char; Das hat recht viele Vorteile, nur mein Problem ist, dass ich nicht weiß wie ich die Schleife, die dafür sorgte, dass Schiffe nicht an/ineinander liegen, passend für Array of Char umschreibe. Edit: Ok, das Problem hat sich grad von allein gelöst^^ ich hätte nur einmal nachdenken sollen. Vielleicht ist es schon ein wenig zu spät.. :^) |
Re: Schiffe versenken, Platzierung
So :)
Nun brauche ich einen Computergegner. Er muss keine Taktik haben, es reicht wenn seine Schiffe zufällig platziert werden und seine Schüsse auch zufällig sind. Die Platzierung sollte jedoch unter den gleichen Richtlinien wie die des Spielers ablaufen. Die Frage ist nur wie? :) Naja, es ist spät und ich brauche Schlaf. Bis morgen dann ;) m2zer0. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:35 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