Created
June 8, 2010 18:50
-
-
Save iiic/430467 to your computer and use it in GitHub Desktop.
Hra 'lodě' v Delphi
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
program Lode; | |
uses | |
Forms, | |
Lode_f in 'Lode_f.pas' {Form1}; | |
{$R *.res} | |
begin | |
Application.Initialize; | |
Application.CreateForm(TForm1, Form1); | |
Application.Run; | |
end. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
object Form1: TForm1 | |
Left = 192 | |
Top = 107 | |
BorderStyle = bsSingle | |
Caption = 'N'#225'mo'#345'n'#237' bitva' | |
ClientHeight = 404 | |
ClientWidth = 677 | |
Color = clBtnFace | |
Font.Charset = DEFAULT_CHARSET | |
Font.Color = clWindowText | |
Font.Height = -11 | |
Font.Name = 'MS Sans Serif' | |
Font.Style = [] | |
Menu = MainMenu1 | |
OldCreateOrder = False | |
OnActivate = HrajePocitac | |
OnClose = FormClose | |
OnCreate = FormCreate | |
PixelsPerInch = 96 | |
TextHeight = 13 | |
object Image1: TImage | |
Left = 0 | |
Top = 0 | |
Width = 96 | |
Height = 16 | |
AutoSize = True | |
Picture.Data = { | |
07544269746D617032030000424D320300000000000076000000280000006000 | |
0000100000000100040002000000BC0200007412000074120000000000000000 | |
0000C0C0C00080008000808080000080000080800000000000000000F8008000 | |
0000F8000000F8F8F80000000000000000000000000000000000000000000000 | |
0000302202020E2202020E2202020E2200000E0002020E0002020E0000040290 | |
0E2202900E2202900E2200000E00000602066000080000086602066408440008 | |
6602990408440006402299000C00000422990C00022200000E00000602066600 | |
0600000A06660206660006440008466602990C44000422990C00000422990C00 | |
022200000E000008020066600400000C66600204666404440008666402990C44 | |
00042299040004330400000422990C0002220000060000049990040000240200 | |
066600066600020446664446664402990C44000422990C00000422990C000222 | |
00000400000609000900040002020400001E6660666000020444666466644402 | |
99000C4400082299003004000008030022990C00022200000400029004000006 | |
90000200040002060466040000080204444604660444000402990C4400142299 | |
00300330030022990C0002220000040002900400000690000200060000046660 | |
0400000402040444000466640444000402990C44001422990030033003002299 | |
0C00022200000400029004000006900002000400020604660400000802044446 | |
04660444000402990C4400082299003004000008030022990C00022200000400 | |
000609000900040002020400001E666066600002044466646664440299000C44 | |
000422990C00000422990C000222000006000004999004000024020006660006 | |
6600020446664446664402990C4400042299040004330400000422990C000222 | |
00000E000008020066600400000C66600204666404440008666402990C440004 | |
22990C00000422990C00022200000E000006020666000600000A066602066600 | |
0644000A46660299040008440006402299000C00000422990C00022200000E00 | |
00060206600008000008660206640844000466020E9902020E9902020E990202 | |
00000E0002020E0002020E0002020E9902900E9902900E99029000000001} | |
Visible = False | |
end | |
object Label1: TLabel | |
Left = 8 | |
Top = 312 | |
Width = 334 | |
Height = 29 | |
Caption = '^ Vyst'#345'el do nep'#345#225'telsk'#253'ch vod !' | |
Font.Charset = DEFAULT_CHARSET | |
Font.Color = clWindowText | |
Font.Height = -23 | |
Font.Name = 'MS Sans Serif' | |
Font.Style = [] | |
ParentFont = False | |
Visible = False | |
end | |
object BitBtn1: TBitBtn | |
Left = 240 | |
Top = 344 | |
Width = 75 | |
Height = 25 | |
Caption = 'nov'#225' h&ra' | |
TabOrder = 0 | |
OnClick = BitBtn1Click | |
Kind = bkRetry | |
end | |
object BitBtn2: TBitBtn | |
Left = 360 | |
Top = 344 | |
Width = 75 | |
Height = 25 | |
Caption = 'U&kon'#269'it' | |
TabOrder = 1 | |
Kind = bkClose | |
end | |
object StatusBar1: TStatusBar | |
Left = 0 | |
Top = 385 | |
Width = 677 | |
Height = 19 | |
Panels = < | |
item | |
Width = 50 | |
end> | |
SimplePanel = True | |
end | |
object GroupBox1: TGroupBox | |
Left = 5 | |
Top = 5 | |
Width = 330 | |
Height = 310 | |
Caption = 'Lod'#283' po'#269#237'ta'#269'e' | |
TabOrder = 3 | |
object Image2: TImage | |
Left = 5 | |
Top = 15 | |
Width = 0 | |
Height = 0 | |
ParentShowHint = False | |
ShowHint = True | |
OnMouseDown = Image2MouseDown | |
end | |
end | |
object GroupBox2: TGroupBox | |
Left = 340 | |
Top = 5 | |
Width = 330 | |
Height = 310 | |
Caption = 'Moje Lo'#271'stvo' | |
TabOrder = 4 | |
object Image3: TImage | |
Left = 5 | |
Top = 15 | |
Width = 0 | |
Height = 0 | |
end | |
end | |
object MainMenu1: TMainMenu | |
Left = 320 | |
Top = 344 | |
object Hra: TMenuItem | |
Caption = '&Hra' | |
object Novhra1: TMenuItem | |
Caption = '&Nov'#225' hra' | |
OnClick = BitBtn1Click | |
end | |
object N1: TMenuItem | |
Caption = '-' | |
end | |
object Konec1: TMenuItem | |
Caption = '&Konec' | |
OnClick = Konec1Click | |
end | |
end | |
object Nastaven1: TMenuItem | |
Caption = 'Na&staven'#237 | |
object Obtnost1: TMenuItem | |
Caption = 'Obt'#237#382'nost' | |
object ICanWin1: TMenuItem | |
AutoCheck = True | |
Caption = 'I Can Win' | |
GroupIndex = 8 | |
RadioItem = True | |
end | |
object BringItOn1: TMenuItem | |
AutoCheck = True | |
Caption = 'Bring It On' | |
Checked = True | |
GroupIndex = 8 | |
RadioItem = True | |
end | |
object HurtMePlanty1: TMenuItem | |
AutoCheck = True | |
Caption = 'Hurt Me Planty' | |
GroupIndex = 8 | |
RadioItem = True | |
end | |
object Hardcore1: TMenuItem | |
AutoCheck = True | |
Caption = 'Hardcore' | |
GroupIndex = 8 | |
RadioItem = True | |
end | |
object Nightmare1: TMenuItem | |
AutoCheck = True | |
Caption = 'Nightmare' | |
GroupIndex = 8 | |
RadioItem = True | |
end | |
end | |
end | |
object Oaplikaci1: TMenuItem | |
Caption = '&N'#225'pov'#283'da' | |
object Pravidlahry1: TMenuItem | |
Caption = 'Pravidla &hry' | |
OnClick = Pravidlahry1Click | |
end | |
object N2: TMenuItem | |
Caption = '-' | |
end | |
object Zdrojovkdy1: TMenuItem | |
Caption = 'Zdrojov'#233' k'#243'dy' | |
OnClick = Zdrojovkdy1Click | |
end | |
object Oaplikaci2: TMenuItem | |
Caption = 'O &aplikaci' | |
OnClick = Oaplikaci2Click | |
end | |
end | |
end | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{* | |
Pokyny ke zpracování: | |
1.Hra bude realizována jako člověk proti počítači. | |
2.Velikost hracího pole i počet a tvar lodí si určete sami. | |
3.V průběhu hry se bude zobrazovat její stav (uhádnutá část soupeřova moře, pokyn ke střelbě,atd.). | |
4.Ovládání (střílení na pozice) realizujte pomocí myši. Zadávání souřadnic ručně by bylo uživatelsky nepřívětivé. | |
5.Kdykoliv je možné začít hrát novou hru nebo ukončit aplikaci | |
6.Umožněte uživateli přečíst si pravidla hry | |
7.Po ukončení hra zobrazí výsledek = kdo vyhrál | |
8.Grafické ztvárnění a ostatní ovládací prvky dle fantazie autora (programátora) | |
Kolik programovacích jazyků umíš tolikrát jsi člověkem. -- @otoman70 | |
*} | |
unit Lode_f; | |
interface | |
uses// Běžní lidé píšou knihy, programátoři knihovny -- @eliskah | |
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, | |
Dialogs, ExtCtrls, StdCtrls, Menus, Buttons, ComCtrls, ShellApi; | |
// globální konstanty | |
const sirka = 20; | |
vyska = 18; | |
velikost = 16;// velikost čtverce s obrázkem | |
delkaLodi0 = 8; | |
delkaLodi1 = 5; | |
delkaLodi2 = 5; | |
delkaLodi3 = 3; | |
delkaLodi4 = 3; | |
delkaLodi5 = 2; | |
delkaLodi6 = 1; | |
delkaLodi7 = 1; | |
delkaLodi8 = 4; | |
delkaLodi9 = 8; | |
delkaLodi10 = 5; | |
// . | |
// . | |
// . | |
type | |
TPolicko = class | |
x,y:integer;// souřadnice políčka x,y | |
Lod,kliknuto,oznaceno:bool; | |
constructor Init(x,y:integer);// konstruktor provádějící inicializaci | |
function najdiPridVraku:string; | |
end; | |
TPole = array of array of TPolicko;// dvourozměrné pole s neurčitým počtem prvků | |
TPoleVedle = array of array of TPolicko; | |
TForm1 = class(TForm) | |
Image1: TImage; | |
Image2: TImage; | |
Image3: TImage; | |
MainMenu1: TMainMenu; | |
Hra: TMenuItem; | |
Novhra1: TMenuItem; | |
N1: TMenuItem; | |
Konec1: TMenuItem; | |
BitBtn1: TBitBtn; | |
BitBtn2: TBitBtn; | |
StatusBar1: TStatusBar; | |
GroupBox1: TGroupBox; | |
Nastaven1: TMenuItem; | |
Oaplikaci1: TMenuItem; | |
Pravidlahry1: TMenuItem; | |
N2: TMenuItem; | |
Oaplikaci2: TMenuItem; | |
GroupBox2: TGroupBox; | |
Zdrojovkdy1: TMenuItem; | |
Obtnost1: TMenuItem; | |
HurtMePlanty1: TMenuItem; | |
Hardcore1: TMenuItem; | |
Nightmare1: TMenuItem; | |
BringItOn1: TMenuItem; | |
ICanWin1: TMenuItem; | |
Label1: TLabel; | |
procedure FormCreate(Sender: TObject); | |
procedure NovaHra; | |
procedure FormClose(Sender: TObject; var Action: TCloseAction); | |
procedure Image2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; x, y: integer); | |
procedure Konec1Click(Sender: TObject); | |
function kolizniKurz(x,y,vypluloLodi,i,znova:integer):bool; | |
procedure Zdrojovkdy1Click(Sender: TObject); | |
procedure BitBtn1Click(Sender: TObject); | |
procedure Oaplikaci2Click(Sender: TObject); | |
procedure Pravidlahry1Click(Sender: TObject); | |
procedure HrajePocitac(Sender: TObject); | |
private | |
public// globální proměnné | |
poleLodi : array[0..7] of byte; | |
silaCizihoLodstva,silaVlastnihoLodstva,obtiznost:byte; | |
konechry,prvniKrok:bool; | |
end; | |
var | |
Form1: TForm1; | |
CiziPole:TPole; | |
VlastniPole:TPoleVedle; | |
implementation | |
{$R *.dfm} | |
constructor TPolicko.Init(x,y:integer);// metoda konstruktor - nastaví defaultní hodnoty | |
begin | |
self.x := x; | |
self.y := y; | |
self.Lod := false; | |
self.Kliknuto := false; | |
self.Oznaceno := false; | |
end; | |
procedure TForm1.FormCreate(Sender: TObject); | |
var x,y:integer; | |
begin | |
randomize; | |
SetLength(CiziPole,sirka,vyska);// nastaví délku pole | |
SetLength(VlastniPole,sirka,vyska);// nastaví délku pole | |
for x := 0 to sirka - 1 do | |
for y := 0 to vyska - 1 do | |
begin | |
CiziPole[x,y] := TPolicko.Init(x,y);// inicializace prvků v poli | |
VlastniPole[x,y] := TPolicko.Init(x,y); | |
end; | |
NovaHra;// rozjede novou hru | |
end; | |
procedure TForm1.HrajePocitac(Sender: TObject); | |
var pokusy:byte; | |
var stopka:bool; | |
var x,y:integer; | |
begin | |
stopka := false; | |
if(prvniKrok) then | |
begin | |
if (MessageDlg(' Kdo bude hrát první'+#13+'---------------------------------'+#13+#13+'Chceš výhodu prvního tahu?',MtConfirmation,[mbyes,mbno],0) = mryes) then stopka := true; | |
prvniKrok := false; | |
end; | |
if not (stopka) then | |
begin | |
pokusy := 0; | |
repeat | |
x := random(sirka); | |
y := random(vyska); | |
inc(pokusy); | |
until( (not VlastniPole[x,y].Kliknuto) and ( ((x mod 2)=1) and ((y mod 2)=0) or (pokusy = 3) ) and ((random(obtiznost)=1) or (VlastniPole[x,y].Lod)) ); //počítač cheatuje! | |
VlastniPole[x,y].Kliknuto := true; | |
if(VlastniPole[x,y].Lod) then | |
begin | |
silaVlastnihoLodstva := silaVlastnihoLodstva-1; | |
if(y>0) then VlastniPole[x,(y-1)].Kliknuto := true; | |
if(y<(vyska-1)) then VlastniPole[x,(y+1)].Kliknuto := true; | |
if( (x<sirka-1) and (VlastniPole[(x+1),y].Kliknuto) ) then | |
begin | |
if(y>0) then VlastniPole[(x+1),(y-1)].Kliknuto:= true; | |
if(y<(vyska-1)) then VlastniPole[(x+1),(y+1)].Kliknuto:= true; | |
end; | |
if( (x>0) and (VlastniPole[(x-1),y].Kliknuto) ) then | |
begin | |
if(y>0) then VlastniPole[(x-1),(y-1)].Kliknuto:= true; | |
if(y<(vyska-1)) then VlastniPole[(x-1),(y+1)].Kliknuto:= true; | |
end; | |
Image3.Canvas.CopyRect(Rect(x*velikost-1,y*velikost-1,(x+1)*velikost-1,(y+1)*velikost-1),Image1.Canvas,Rect(1*velikost,0,2*velikost,velikost)); | |
end | |
else | |
begin | |
Image3.Canvas.CopyRect(Rect(x*velikost-1,y*velikost-1,(x+1)*velikost-1,(y+1)*velikost-1),Image1.Canvas,Rect(0*velikost,0,1*velikost,velikost)); | |
end; | |
end; | |
if silaVlastnihoLodstva = 0 then// kontrola vítězství | |
begin | |
konechry := true;// konec hry | |
if messagedlg('Bohužel, prohrál jsi!,'+#13+'dáme ještě jednu hru?',mtCustom,[mbYes,mbNo],0) = mryes then Novahra;// dotaz na novou hru | |
end; | |
end; | |
procedure TForm1.NovaHra; | |
var i,j,znova,x,y,vypluloLodi:integer;// řídící proměnné cyklu | |
var pridlodi:array[0..2] of byte; | |
var druheKolo:bool; | |
begin | |
poleLodi[0] := delkaLodi0;// délky lodí z jejich konstant | |
poleLodi[1] := delkaLodi1; | |
poleLodi[2] := delkaLodi2; | |
poleLodi[3] := delkaLodi3; | |
poleLodi[4] := delkaLodi4; | |
poleLodi[5] := delkaLodi5; | |
poleLodi[6] := delkaLodi6; | |
poleLodi[7] := delkaLodi7; | |
if(Obtnost1.Items[0].Checked) then obtiznost := 2;// naplnění obtížnosti podle zvolené položky menu | |
if(Obtnost1.Items[1].Checked) then obtiznost := 3; | |
if(Obtnost1.Items[2].Checked) then obtiznost := 5; | |
if(Obtnost1.Items[3].Checked) then obtiznost := 8; | |
if(Obtnost1.Items[4].Checked) then obtiznost := 13; | |
//Fibonacci ty se zase opiješ jako hovado! | |
silaVlastnihoLodstva := 0; | |
silaCizihoLodstva := 0; | |
prvniKrok := true; | |
for x := 0 to sirka - 1 do// vynulování starých hodnot | |
for y := 0 to vyska - 1 do | |
begin | |
CiziPole[x,y].Kliknuto := false; | |
CiziPole[x,y].Lod := false; | |
CiziPole[x,y].Oznaceno := false; | |
VlastniPole[x,y].Kliknuto := false; | |
VlastniPole[x,y].Lod := false; | |
VlastniPole[x,y].Oznaceno := false; | |
end; | |
Image2.Width := sirka*velikost-1;// nastavení rozměrů obrázku v závislosti na velikosti pole | |
Image2.Height := vyska*velikost-1; | |
Image3.Width := sirka*velikost-1;// rovné pole pro všechny | |
Image3.Height := vyska*velikost-1; | |
for x := 0 to sirka - 1 do | |
for y := 0 to vyska - 1 do | |
begin | |
Image2.Canvas.CopyRect(Rect(velikost*x-1,velikost*y-1,velikost*(x+1)-1,velikost*(y+1)-1),Image1.Canvas,Rect(5*velikost,0,6*velikost,velikost));// rozkopírování políček z obrázku Image1 na Image2 | |
Image3.Canvas.CopyRect(Rect(velikost*x-1,velikost*y-1,velikost*(x+1)-1,velikost*(y+1)-1),Image1.Canvas,Rect(5*velikost,0,6*velikost,velikost));// rozkopírování políček z obrázku Image1 na Image3 | |
end; | |
druheKolo := false; | |
for j:=0 to 1 do | |
begin | |
for vypluloLodi := 0 to Length(poleLodi)-1 do | |
begin | |
x := random(sirka); | |
y := random(vyska); | |
i := 0; | |
repeat | |
if(druheKolo) then | |
znova := 1 | |
else | |
znova := 0; | |
if(kolizniKurz(x,y,vypluloLodi,i,znova)) then | |
begin | |
x := random(sirka); | |
y := random(vyska); | |
i := 0; | |
continue; | |
end; | |
if(i=0) then | |
begin | |
pridLodi[0] := x; | |
pridLodi[1] := y; | |
pridLodi[2] := 1;// @todo orientace lodi | |
end; | |
inc(i); | |
inc(x); | |
until (i >= poleLodi[vypluloLodi]);// true opakuje cyklus | |
for i := 1 to poleLodi[vypluloLodi] do | |
begin | |
if (druheKolo) then | |
begin | |
VlastniPole[pridLodi[0],pridLodi[1]].Lod := true;// umístění lodě na políčko | |
Image3.Canvas.CopyRect(Rect(velikost*pridLodi[0]-1,velikost*pridLodi[1]-1,velikost*(pridLodi[0]+1)-1,velikost*(pridLodi[1]+1)-1),Image1.Canvas,Rect(3*velikost,0,4*velikost,velikost));// cheat | |
end | |
else | |
begin | |
CiziPole[pridLodi[0],pridLodi[1]].Lod := true;// umístění lodě na políčko | |
//Image2.Canvas.CopyRect(Rect(velikost*pridLodi[0]-1,velikost*pridLodi[1]-1,velikost*(pridLodi[0]+1)-1,velikost*(pridLodi[1]+1)-1),Image1.Canvas,Rect(3*velikost,0,4*velikost,velikost));// cheat | |
end; | |
pridLodi[0] := pridLodi[0]+1; | |
end; | |
silaCizihoLodstva := silaCizihoLodstva+poleLodi[vypluloLodi]; | |
end; | |
druheKolo := true; | |
end;//konec druhého kola | |
silaCizihoLodstva := (silaCizihoLodstva div 2);// cyklus proběhl 2x (pro obě pole) takže nejjednodužší bude dělit počet lodí 2. | |
silaVlastnihoLodstva := silaCizihoLodstva;// bude to těžký boj | |
StatusBar1.SimpleText := 'Hrajem ! Síla nepřátelsného loďstva: '+inttostr(silaCizihoLodstva);// výpis informací do statusu | |
konechry := false; | |
if (Form1.Active) then HrajePocitac(nil);// Form1.Active vrací false pokud se formulář právě vytvořil (pravděpodobně) | |
Label1.Visible := true;// ukáže popisek aby každý věděl kam klikat | |
end; | |
function TForm1.kolizniKurz(x,y,vypluloLodi,i,znova:integer):bool; | |
begin | |
Result := false; | |
if (x+poleLodi[vypluloLodi]-i > sirka) then Result := true;// loď přepadá svým koncem přes okraj světa | |
if(znova=0) then | |
begin | |
if (CiziPole[x,y].Lod) then Result := true;// lepení přídě na příď je přísně zakázáno | |
if ( (y>0) and (CiziPole[x,(y-1)].Lod) ) then Result := true;// ^ | |
if ( (x<sirka-1) and (y>0) and (CiziPole[(x+1),(y-1)].Lod) ) then Result := true;// ^> | |
if ( (x<sirka-1) and (CiziPole[(x+1),y].Lod) ) then Result := true;// > | |
if ( (x<sirka-1) and (y<vyska-1) and (CiziPole[(x+1),(y+1)].Lod) ) then Result := true;// >v | |
if ( (y<vyska-1) and (CiziPole[x,(y+1)].Lod) ) then Result := true;// v | |
if ( (x>0) and (y<vyska-1) and (CiziPole[(x-1),(y+1)].Lod) ) then Result := true;// v< | |
if ( (x>0) and (CiziPole[(x-1),y].Lod) ) then Result := true;// < | |
if ( (x>0) and (y>0) and (CiziPole[(x-1),(y-1)].Lod) ) then Result := true;// <^ | |
end | |
else | |
begin | |
if (VlastniPole[x,y].Lod) then Result := true;// lepení přídě na příď je přísně zakázáno | |
if ( (y>0) and (VlastniPole[x,(y-1)].Lod) ) then Result := true;// ^ | |
if ( (x<sirka-1) and (y>0) and (VlastniPole[(x+1),(y-1)].Lod) ) then Result := true;// ^> | |
if ( (x<sirka-1) and (VlastniPole[(x+1),y].Lod) ) then Result := true;// > | |
if ( (x<sirka-1) and (y<vyska-1) and (VlastniPole[(x+1),(y+1)].Lod) ) then Result := true;// >v | |
if ( (y<vyska-1) and (VlastniPole[x,(y+1)].Lod) ) then Result := true;// v | |
if ( (x>0) and (y<vyska-1) and (VlastniPole[(x-1),(y+1)].Lod) ) then Result := true;// v< | |
if ( (x>0) and (VlastniPole[(x-1),y].Lod) ) then Result := true;// < | |
if ( (x>0) and (y>0) and (VlastniPole[(x-1),(y-1)].Lod) ) then Result := true;// <^ | |
end; | |
end; | |
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);// hromadné uvlonění z paměti | |
var x,y:byte; | |
begin | |
for x := 0 to sirka - 1 do | |
for y := 0 to vyska - 1 do | |
begin | |
CiziPole[x,y].Free; | |
VlastniPole[x,y].Free; | |
end; | |
CiziPole := nil; | |
VlastniPole := nil; | |
end; | |
function TPolicko.najdiPridVraku:string; | |
var i,j,k:integer; | |
begin | |
i := 0; | |
repeat | |
inc(i); | |
until( ((x-i)<0) or not (CiziPole[(x-i),y].Lod) ); | |
j := x-i+1;// x-ová souřadnice přídi lodi | |
i := 0; | |
k := 1; | |
repeat | |
if (CiziPole[(j+i),y].Kliknuto) then inc(k); | |
inc(i); | |
until( ((j+i)>(sirka-1)) or not CiziPole[(j+i),y].Lod ); | |
if( i=k ) then | |
Result := inttostr(i)+'|'+inttostr(j)// kéž bych věděl jak vrátit pole | |
else | |
Result := 'null'; | |
end; | |
procedure TForm1.Image2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); | |
var sx,sy,i:integer; | |
var pokusy:byte; | |
var vrakLodi:string; | |
begin | |
sx:= x div velikost;// zjištění souřadnic zmáčknutého políčka | |
sy:= y div velikost; | |
if(Label1.Visible) then Label1.Visible := false; | |
if ( (not CiziPole[sx,sy].Kliknuto) and (not konechry) ) then// musíme zkontrolovat, zda-li již není políčko označené a zda-li není konec hry | |
begin | |
if (Button = mbLeft) then// pokud se stříli ostrejma | |
begin | |
if(CiziPole[sx,sy].Lod) then | |
begin | |
silaCizihoLodstva := silaCizihoLodstva-1; | |
vrakLodi := CiziPole[sx,sy].najdiPridVraku;// vrací string int(délka lodi)|int(x-ová souřadnice přídi) | |
if not (vrakLodi = 'null') then// != | |
begin | |
StatusBar1.SimpleText := 'Podařilo se potopit nepřátelskou loď! Síla jejich loďstva je ještě: '+inttostr(silaCizihoLodstva);// výpis informací do statusu | |
for i:= 1 to strtoint(copy(vrakLodi,1,(pos('|',vrakLodi)-1))) do | |
Image2.Canvas.CopyRect(Rect((strtoint(copy(vrakLodi,(pos('|',vrakLodi)+1),99))+i-1)*velikost-1,sy*velikost-1,((strtoint(copy(vrakLodi,(pos('|',vrakLodi)+1),99))+i-1)+1)*velikost-1,(sy+1)*velikost-1),Image1.Canvas,Rect(2*velikost,0,3*velikost,velikost)); | |
end | |
else// jinak ještě pluje | |
begin | |
Image2.Canvas.CopyRect(Rect(sx*velikost-1,sy*velikost-1,(sx+1)*velikost-1,(sy+1)*velikost-1),Image1.Canvas,Rect(1*velikost,0,2*velikost,velikost)); | |
StatusBar1.SimpleText := 'Podařilo se zasáhnout nepřátelskou loď! Síla jejich loďstva je ještě: '+inttostr(silaCizihoLodstva);// výpis informací do statusu | |
end; | |
end | |
else | |
begin | |
Image2.Canvas.CopyRect(Rect(sx*velikost-1,sy*velikost-1,(sx+1)*velikost-1,(sy+1)*velikost-1),Image1.Canvas,Rect(0*velikost,0,1*velikost,velikost)); | |
StatusBar1.SimpleText := 'Jenom voda! Síla nepřátelské flotily je: '+inttostr(silaCizihoLodstva);// výpis informací do statusu | |
end; | |
CiziPole[sx,sy].Kliknuto := true;// označení, že se zde už hrálo | |
if silaCizihoLodstva = 0 then// kontrola vítězství | |
begin | |
konechry := true;// konec hry | |
if messagedlg('Gratuluji, vyhrál jsi!,'+#13+'dáme ještě jednu hru?',mtCustom,[mbYes,mbNo],0) = mryes then Novahra;// dotaz na novou hru | |
end; | |
if (not konechry) then// a teď hraje počítač | |
HrajePocitac(nil);// třeste se | |
end | |
else// jinak se jenom značkuje | |
begin | |
if (CiziPole[sx,sy].Oznaceno) then | |
begin | |
CiziPole[sx,sy].Oznaceno := false; | |
Image2.Canvas.CopyRect(Rect(sx*velikost-1,sy*velikost-1,(sx+1)*velikost-1,(sy+1)*velikost-1),Image1.Canvas,Rect(5*velikost,0,6*velikost,velikost));// odznačím | |
end | |
else | |
begin | |
CiziPole[sx,sy].Oznaceno := true; | |
Image2.Canvas.CopyRect(Rect(sx*velikost-1,sy*velikost-1,(sx+1)*velikost-1,(sy+1)*velikost-1),Image1.Canvas,Rect(4*velikost,0,5*velikost,velikost));// označím | |
end; | |
end; | |
end; | |
end; | |
procedure TForm1.Konec1Click(Sender: TObject);// tlačítko konec z menu | |
begin | |
close();// Kdo se směje naposledy, má největší ping. -- @vtipy | |
end; | |
procedure TForm1.BitBtn1Click(Sender: TObject); | |
begin | |
if ( konechry or (MessageDlg('Chcete začít novou hru?',MtConfirmation,[mbyes,mbno],0) = mryes) ) then | |
novahra; | |
end; | |
procedure TForm1.Zdrojovkdy1Click(Sender: TObject); | |
begin | |
ShellExecute(0,'open',Pchar('http://gist.github.com/430467'),nil,nil,Sw_ShowNormal); | |
showmessage('Stránka se zdrojovýmy kódy se otevře v defaultním prohlížeči.'); | |
end; | |
procedure TForm1.Oaplikaci2Click(Sender: TObject); | |
begin | |
showmessage('Námořní bitva verze 0.0.0.8 '+#13+'Delphi je satan!'+#13+#13+' created by ic '+#13+' ic@icweb.eu'); | |
end; | |
procedure TForm1.Pravidlahry1Click(Sender: TObject); | |
begin | |
showmessage('Námořní bitva verze 0.0.0.8 '+#13+'----------------------------------------------------'+#13+'Lodě se pro oba hráče vygenerují náhodně'+#13+'a oba hráči mají vždy stejný počet lodí.'+#13+#13+'Lodě se nikdy nedotýkají jedna druhé,'+#13+'ale mohou se dotýkat okrajů hracího pole.'+#13+#13+'Začíná vždy uživatel a počítač hraje'+#13+'bezprostředně po něm bez čekání.'+#13+#13+'Vyhrává ten komu se podaří potopit všechny'+#13+'lodě (i části lodí) protihráče.'+#13+#13+'Obtížnost hry si zvolíte v nastavení.'); | |
end; | |
end. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment