Widok po uruchomieniu. Widok w trakcie gry

Podobne dokumenty
Zaprojektuj grę logiczną NIM. Program losuje w każdym rzędzie od 1 do 10 grzybów. Gracz

Opis implementacji: Implementacja przedstawia Grę w życie jako przykład prostej symulacji opartej na automatach.

Nazwa implementacji: Kółko i krzyżyk w Lazarusie. Autor: Piotr Fiorek Andrzej Stefaniuk

PROGRAM: WYSZUKANIE LICZBY MAKSYMALNEJ

Wprowadzenie do systemu Delphi

Po uruchomieniu Lazarusa należy wybrać z paska górnego opcję Projekt i następnie Nowy Projekt. Pokaże się okno:

Wykład 7: Lazarus GUI

5.9 Modyfikacja gry Kółko i krzyżyk

Delphi. Lazarus. Kompilatory Delphi. Linki do stron o Delphi

Ćwiczenie z wykorzystaniem zmiennych i komponentu TGauge. TTimer co pewien czas. Gra. A jednak odlicza. Stoper. Aktualny czas, czyli zegar

Delphi podstawy programowania. Środowisko Delphi

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 3

Unity 3D - podpowiedzi w grze. System cząstek

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0

LibreOffice Calc VBA

Niniejszy ebook jest własnością prywatną. Został zakupiony legalnie w serwisie Netpress.pl, będącym oficjalnym Partnerem Wydawcy.

Delphi 7 + Indy 10 Przykłady prostych aplikacji sieciowych

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Właściwości i metody obiektu Comment Właściwości

Wstęp do programowania. Różne różności

2. Kliknij Insert->Userform. Jeżeli Toolbox nie pojawi się automatycznie, kliknij View -> Toolbox. Otrzymany widok powinien być jak poniżej.

lekcja 8a Gry komputerowe MasterMind

Tworzenie własnych komponentów

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

Projekt Śnieżna wojna

INSTRUKCJA DO ĆWICZENIA 5

Programowanie obiektowe

Instrukcje cykliczne (pętle) WHILE...END WHILE

przedmiot kilka razy, wystarczy kliknąć przycisk Wyczaruj ostatni,

Visual Basic for Applications. Wstęp

Niniejszy ebook jest własnością prywatną.

Kodu z klasą. Tower defense, cz. 2. Scenariusz 8

Rys.2.1. Trzy warstwy stanowiące podstawę popularnego podejścia w zakresie budowy stron internetowych [2]

Cw.12 JAVAScript w dokumentach HTML

Unity 3D - własny ekran startowy i menu gry

Obsługa grafiki w Delphi, rysowanie na płótnie, obsługa myszki, zapisywanie obrazków do plików, bitmapy pozaekranowe.

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

Praktyczny kurs programowania w Delphi na przykładzie wygaszacza ekranu Windows

Laboratorium 15: Bazy Danych Tworzenie bazy danych i programowanie elementów nawigacyjnych aplikacji stworzonej przy pomocy technologii dbexpress

OPERACJE NA PLIKACH. Podstawowe pojęcia:

Delphi podstawy programowania. Dialogi

Język programowania PASCAL

Pascal typy danych. Typy pascalowe. Zmienna i typ. Podział typów danych:

Laboratorium z informatyki sem.iii/ćw. 4 Wydział Transportu PW /19

Informatyka 1. Przetwarzanie tekstów

Aplikacje WWW - laboratorium

Rys.2.1. Drzewo modelu DOM [1]

Politechnika Poznańska Wydział Budowy Maszyn i Zarządzania

Programowanie wielowarstwowe i komponentowe

Podstawy programowania

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

1. Otwórz swój program. 2. Przejdź do źródła. Posłuży ci do tego funkcja Toggle Form/Unit lub naciśnięcie klawisza F12. [rys.1]

Spadające jabłuszka. licencja CC-BY-SA Uznanie autorstwa Na tych samych warunkach 3.0 Polska. Strona 51

Amortyzacja obliczenia ekonomiczne w informatyce.

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Darmowa publikacja dostarczona przez Złote Myśli

Wykład 03 JavaScript. Michał Drabik

Wprowadzenie do języka Java

Pliki. Operacje na plikach w Pascalu

Funkcje i instrukcje języka JavaScript

Propozycje tematów zadań

Programowanie w Turbo Pascal

Programowanie RAD Delphi

Bazy Danych i Usługi Sieciowe

Robert Szmurło. Projektowanie Graficznych Interfejsów Użytkownika

Unity 2D - prosta gra

Aplikacje w środowisku VBA. Visual Basic for Aplications

Języki skryptowe w programie Plans

Programowanie obiektowe

Podstawy Programowania C++

Adam Meissner. SZTUCZNA INTELIGENCJA Gry dwuosobowe

Pascal. 1. Pliki tekstowe. Przykład 1.1. Zapis do pliku tekstowego

Kierunek: ETI Przedmiot: Programowanie w środowisku RAD - Delphi Rok III Semestr 5. Ćwiczenie 5 Aplikacja wielo-okienkowa

Kiedy i czy konieczne?

JAVA W SUPER EXPRESOWEJ PIGUŁCE

JAVAScript w dokumentach HTML (1) JavaScript jest to interpretowany, zorientowany obiektowo, skryptowy język programowania.

Podstawy Programowania semestr drugi. Wykład czternasty

Algorytmy i struktury danych

REFERAT PRACY DYPLOMOWEJ Temat pracy: SUDOKU - Algorytmy tworzenia i rozwiązywania

LIVE Gra w życie. LIVE w JavaScript krok po kroku. ANIMACJA Rozpoczynamy od podstawowego schematu stosowanego w animacji

Aplikacje WWW - laboratorium

Algorytmy i struktury danych

KURSY PROGRAMOWANIA DLA DZIECI

Podstawy programowania

Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

Lab. 3 Typy danych w LabView, zapis do pliku

Tablice, DataGridView

Pętle. Dodał Administrator niedziela, 14 marzec :27

PyGame Gra w Kółko i Krzyżyk

Materiały do laboratorium MS ACCESS BASIC

Scenariusz zajęć. Moduł VI. Projekt Gra logiczna zgadywanie liczby

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

Podstawy JavaScript ćwiczenia

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

JAVA. Platforma JSE: Środowiska programistyczne dla języka Java. Wstęp do programowania w języku obiektowym. Opracował: Andrzej Nowak

Darmowa publikacja dostarczona przez

Informacja o języku. Osadzanie skryptów. Instrukcje, komentarze, zmienne, typy, stałe. Operatory. Struktury kontrolne. Tablice.

Transkrypt:

Nazwa implementacji: Gra logiczna NIM Autor: Stanisław Ubermanowicz Piotr Fiorek Opis implementacji: Realizacja gry logicznej, w której chodzi o to, aby podczas naprzemiennego pobierania obiektów z jednego rzędu na planszy uniknąć konieczności zabrania obiektu ostatniego. Losowane są różne układy do 10 obiektów (np. grzybów) w każdym z trzech rzędów. Komputer ma zaprogramowaną strategię wygranej, dlatego rozpoczyna gracz, aby mieć szansę zwycięstwa. Zaprojektuj grę logiczną NIM. Program losuje w każdym rzędzie od 1 do 10 grzybów. Gracz rywalizuje z komputerem. Podczas ruchu można brać dowolną liczbę grzybów, ale tylko z jednego rzędu. Przegrywa ten, kto musi zabrać ostatniego grzyba. Strategia wygranej polega na tym, aby utrzymywać parzystość grup binarnych. Widok po uruchomieniu Widok w trakcie gry 1

Widok okna projektu Na formularzu należy umieścić tekst (TLabel), który będzie pojawiał się po uprzednim odpowiednim ustawieniu w przypadku wygranej lub przegranej gracza. Należy również dodać obiekt kontenera obrazków (TImageList) oraz obiekt guzika (TButton). Ponadto można dodać elementy tekstowe z instrukcją dla gracza. W oknie Object Inspector można również ustawić nazwy poszczególnych elementów. W tej implementacji używamy nazw: Link dla obiektu typu TLabel prezentującego adres internetowy; Opis dla obiektu typu TLabel przedstawiającego opis gry; Info dla obiektu typu TLabel prezentującego informację o wygranej lub przegranej; Obrazki dla obiektu typu TImageList przechowującego obrazki kolejnych grzybów; Start dla obiektu typu TButton będącego przyciskiem rozpoczynającym grę; Kod: unit gra; {$mode objfpc}{$h+} interface uses Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls; type { TOkno} TOkno = class(tform) Link: TLabel; {Zmienne reprezentujące obiekty na formularzu} Start: TButton; Opis: TLabel; Obrazki: TImageList; Info: TLabel; procedure StartClick(Ser: TObject); {Procedury obsługujące grę} procedure FormCreate(Ser: TObject); 2

procedure Rzad1Click(Ser: TObject); procedure Rzad2Click(Ser: TObject); procedure Rzad3Click(Ser: TObject); procedure Rzad1Action(grzyb: Integer); procedure Rzad2Action(grzyb: Integer); procedure Rzad3Action(grzyb: Integer); procedure SprawdzKoniec(); procedure PCMove(); private {private declarations} ile1, ile2, ile3: Integer; {Zmienne wskazują, ile grzybów jest w danej chwili w rzędzie} tura: Integer; {Zmienna, która określa liczbę tur i to, czyj był ruch} koniec: Boolean; {Zmienna określająca czy nastąpił koniec gry} Grzyb1: array[1..10] of TImage; {Lista obiektów pierwszego rzędu grzybów} Grzyb2: array[1..10] of TImage; {Lista obiektów drugiego rzędu grzybów} Grzyb3: array[1..10] of TImage; {Lista obiektów trzeciego rzędu grzybów} public {public declarations} var Okno: TOkno; i: Integer; {Zmienna pomocnicza, iteracyjna} implementation {TOkno} {Procedura wywoływana tylko raz podczas tworzenia okna} procedure TOkno.FormCreate(Ser: TObject); {Twórz wszystkie elementy tablicy} Grzyb1[i]:= TImage.Create(self); {stwórz element} Grzyb1[i].Parent:= self; {przypisz go do okna} Grzyb1[i].Visible:= False; {ukryj go} Obrazki.GetBitmap(0, Grzyb1[i].Picture.Bitmap); {przypisz mu obrazek} Grzyb1[i].Top:= 16; {określ jego położenie od góry} Grzyb1[i].Left:= (64*i)-48; {określ jego położenie od lewej} Grzyb1[i].Tag:= i; {przypisz mu numer porządkowy} Grzyb1[i].OnClick:= @Rzad1Click; {określ procedurę obsługującą kliknięcie} {Drugi rząd analogicznie jak powyżej} Grzyb2[i]:= TImage.Create(self); Grzyb2[i].Parent:= self; Grzyb2[i].Visible:= False; Obrazki.GetBitmap(1, Grzyb2[i].Picture.Bitmap); Grzyb2[i].Top:= 80; Grzyb2[i].Left:= (64*i)-48; Grzyb2[i].Tag:= i; Grzyb2[i].OnClick:= @Rzad2Click; {Trzeci rząd analogicznie jak powyżej} Grzyb3[i]:= TImage.Create(self); Grzyb3[i].Parent:= self; Grzyb3[i].Visible:= False; Obrazki.GetBitmap(2, Grzyb3[i].Picture.Bitmap); 3

Grzyb3[i].Top:= 144; Grzyb3[i].Left:= (64*i)-48; Grzyb3[i].Tag:= i; Grzyb3[i].OnClick:= @Rzad3Click; Grzyb1[1].Visible:=True; {Pokaż pierwsze grzyby z każdego rzędu} Grzyb2[1].Visible:=True; Grzyb3[1].Visible:=True; procedure TOkno.StartClick(Ser: TObject); {Obsługa kliknięcia przycisku START} Start.Visible:= False; {ukryj przycisk} Link.Visible:= False; {ukryj adres autora ikon} Opis.Visible:= False; {ukryj opis gry} Info.Visible:= False; {ukryj Info o wygranej lub przegranej} koniec:= False; {ustaw zmienną oznaczającą koniec gry na Fałsz} tura:= 1; {ustaw licznik tur na zero} Randomize; {ustaw pozycję startową generatora liczb losowych} ile1:= Random(10)+1; {wylosuj liczbę kulek w pierwszym rzędzie} for i:= 1 to ile1 do {pętla przebiega przez elementy od pierwszego do wylosowanego} Grzyb1[i].Visible:= True; {i ustawia, aby elementy były widoczne} ile2:= Random(10)+1; {to samo dla drugiego rzędu} for i:= 1 to ile2 do Grzyb2[i].Visible:= True; ile3:= Random(10)+1; {to samo dla trzeciego rzędu} for i:= 1 to ile3 do Grzyb3[i].Visible:= True; {Procedura obsługująca kliknięcie w element z pierwszego rzędu} procedure TOkno.Rzad1Click(Ser: TObject); {Ser jest ogólną reprezentacją obiektu, który został kliknięty. Przekształcamy go na konkretny obiekt TImage, pobieramy z niego wartość Tag i przekazujemy do procedury Rzad1Action} Rzad1Action((Ser as TImage).Tag); {sprawdź czy zmienna 'koniec' została ustawiona na Fałsz, jeśli tak, to zrealizuj ruch komputera} if koniec = False then PCMove(); procedure TOkno.Rzad2Click(Ser: TObject); {jak wyżej dla drugiego rzędu} Rzad2Action((Ser as TImage).Tag); if koniec = False then PCMove(); procedure TOkno.Rzad3Click(Ser: TObject); {jak wyżej dla trzeciego rzędu} Rzad3Action((Ser as TImage).Tag); if koniec = False then PCMove(); procedure TOkno.Rzad1Action(grzyb: Integer); {Procedura obsługująca zmiany stanów rzędu 1} tura:= tura+1; {zwiększ licznik tur} for i:= grzyb to ile1 do {wykonaj ruch od grzyba klikniętego do ostatniego} Grzyb1[i].Visible:= False; {ukryj grzyba} ile1:= grzyb-1; {ustaw nową wartość pozostałych grzybów} SprawdzKoniec; {sprawdź czy nastąpił koniec gry} 4

procedure TOkno.Rzad2Action(grzyb: Integer); tura:= tura+1; for i:= grzyb to ile2 do Grzyb2[i].Visible:= False; ile2:= grzyb-1; SprawdzKoniec; procedure TOkno.Rzad3Action(grzyb: Integer); tura:= tura+1; for i:= grzyb to ile3 do Grzyb3[i].Visible:= False; ile3:= grzyb-1; SprawdzKoniec; {to samo dla rzędu drugiego} {to samo dla rzędu trzeciego} procedure TOkno.SprawdzKoniec(); {Sprawdzaj, czy wszystkie grzyby zostały zabrane} if ile1+ile2+ile3 < 2 then {Sprawdź, czy grzybów jest mniej niż dwa} if (tura mod 2) = 1 then {Jeśli była tura gracza} Info.Caption:= 'Przegrana' {wpisz informację o przegranej} else if ile1+ile2+ile3 = 1 then {Jeśli pozostał ostatni grzyb} Info.Caption:= 'Wygrana' {wpisz informację o wygranej} else {a jeśli był ruch komputera} Info.Caption:= 'Przegrana'; {wpisz informację o przegranej} koniec:= True; {Ustaw zmienną oznaczającą koniec gry} Info.Visible:= True; {Pokaż napis z informacją o wyniku gry} Start.Visible:= True; {Pokaż przycisk START, dla uruchomienia nowej gry} {po wykonanym ruchu wyjdź z funkcji} procedure TOkno.PCMove(); {Procedura realizująca strategię komputera sztuczny intelekt} if (ile1=ile2) and (ile1<2) and (ile3>1) then {gdy w rzędach 1 i 2 jest 0 lub 1 grzyb,} {to pozostaw jednego grzyba w rzędzie 3.} Rzad3Action(2); {kliknij grzyba nr 2 w rzędzie 3.} Exit; else if (ile1=ile3) and (ile1<2) and (ile2>1) then {gdy w rzędach 1 i 3 są <2 grzyby,} {to pozostaw 1 grzyba w rzędzie 2.} Rzad2Action(2); {kliknij grzyba nr 2 w rzędzie 2.} Exit; else if (ile2=ile3) and (ile2<2) and (ile1>1) then {gdy w rzędach 2 i 3 są <2 grzyby,} {to pozostaw 1 grzyba w rzędzie 1.} Rzad1Action(2); {kliknij grzyba nr 2 w rzędzie 1.} If (ile1+ile2)=1 then {gdy w rzędach 1 i 2 pozostał łącznie jeden grzyb} Rzad3Action(1); {usuń wszystkie z rzędu 3} 5

else if (ile1+ile3)=1 then Rzad2Action(1); else if (ile2+ile3)=1 then {analogicznie jak powyżej} {analogicznie jak powyżej} Rzad1Action(1); {Sprawdzenie parzystości binarnej w środkowej fazie gry. Szukanie układu dającego parzystość grup. Jeśli dla danej wartości i poniższe wyrażenia logiczne z operatorem XOR się zerują, to jest to poszukiwany układ parzystości, dający szansę na wygraną.} if (ile1>=i) and (((ile1-i) xor ile2 xor ile3) = 0) then Rzad1Action(ile1 - i + 1); {doprowadź układ do parzystości} {po wykonanym ruchu wyjdź z funkcji} else if (ile2>=i) and ((ile1 xor (ile2-i) xor ile3) = 0) then Rzad2Action(ile2 - i + 1); {doprowadź układ do parzystości} else if (ile3>=i) and ((ile1 xor ile2 xor (ile3-i)) = 0) then Rzad3Action(ile3 - i + 1); {doprowadź układ do parzystości} {Losowy wybór posunięcia, jeśli strategię wykorzystał gracz i nie ma ruchu wygrywającego} if (ile1>=ile2) and (ile1>=ile3) and ((Random(10)/10)>0.5) then Rzad1Action(Random(ile1) + 1) else if (ile2>=ile1) and (ile2>=ile3) then Rzad2Action(Random(ile2) + 1) else Rzad3Action(ile3); initialization {$I gra.lrs}. UWAGA: Podczas zapisywania projektu nie wolno zapisywać plików ".pas" (plik z kodem) oraz ".lpi" (plik projektu) pod tymi samymi nazwami. 6