Programowanie obiektowe. Ćwiczenie 11. 1
______________________________________________________________________
PROGRAMOWANIE OBIEKTOWE
ĆWICZENIE 11
•
Projektowanie prostej gry planszowej
•
Implementacja algorytmu minimax
•
Aplikacja GRA „Kółko i krzyzyk”
2
Programowanie obiektowe. Ćwiczenie 11.
______________________________________________________________________
______________________________________________________________________
I.
Wstęp
Zanim rozpoczniesz ćwiczenie, utwórz podkatalog KK w katalogu Projects oraz
utwórz następujące trzy pliki – użyj dowolnego edytora graficznego – możesz użyć
Tools
ImageEditor w środowisku Builder’a:
kolo.bmp
krzyz.bmp
puste.bmp
Parametry ww. plików:
Szerokość : 50 pikseli
Wysokość : 50 pikseli
Kolory: VGA(16)
Utwórz ikonę aplikacji i zapisz ją w pliku kk.ico
•
Uruchom Buildera
•
File
New
Application
•
File
Save All
•
W katalogu KK zapisz: kk.bpr, kk.cpp, kkUnit1.h, kkUnit1.cpp,
kkUnit1.dfm
II.
Tworzenie interfejsu gry
Teraz zaprojektuj interfejs graficzny gry:
Programowanie obiektowe. Ćwiczenie 11. 3
______________________________________________________________________
Utwórz panel główny o nazwie PG (klasa TPanel)
W panelu PG umieść następujące obiekty:
Obiekty
Klasa
Linia1, Linia2, Linia3, Linia4, Linia5,
Linia6, Linia7, Linia8 – czarne linie
rozdzielające pola
TShape
Image0, Image1, Image2, Image3,
Image4, Image5, Image6, Image7,
Image8 – obrazy ‘O’ i ‘X’
TImage
Utwórz panel sterujący o nazwie PS (klasa TPanel)
W panelu PS umieść następujące obiekty:
Obiekty
Klasa
ButtonStart, ButtonKoniec – przyciski
aplikacji
TButton
Label11
TLabel
StaticTextCzlowiek = ‘CZŁOWIEK’
StaticTextKomputer = ‘KOMPUTER’
StaticTextStatus;
TStaticText
ImageCzlowiek = ‘KOLO.BMP’
ImageKomputer = ‘KRZYZ.BMP’
TImage
UWAGA:
W obiekcie StaticTextStatus będziemy wyświetlać stan aktualny gry.
Utwórz obiekt nazwie GroupBox1 (klasa TGroupBox)
W obiekcie GroupBox1 umieść następujące obiekty:
Obiekty
Klasa
LabelLastStatus,
Label10=’Kto poprzednio wygrał:’
TLabel
UWAGA:
W obiekcie LabelLastStatus będziemy wyświetlać stan ostatniej gry w
formacie tekstowym – stan należy pobierać z pliku KK_CONFIG.DAT.
Tworzenie metod do zdarzeń
Każde kliknięcie obiektu: Image0, Image1, Image2, Image3, Image4, Image5,
Image6, Image7, Image8 spowoduje odpowiednią reakcję aplikacji:
Np. kliknięcie w obraz Image0, czyli wybranie pola nr 0, spowoduje uruchomienie
algorytmu zapisanego w funkcji kontrola().
void __fastcall TForm1::Image0Click(TObject *Sender)
{
nr_pola = 0;
kontrola();
}
4
Programowanie obiektowe. Ćwiczenie 11.
______________________________________________________________________
______________________________________________________________________
Utwórz metody dla pozostałych obrazów: ,Image1, Image2, Image3, Image4, Image5,
Image6, Image7, Image8.
III.
Implementowanie algorytmu
Wykonaj aplikację w Borland C++ realizującą poniższe założenia:
GRA PLANSZOWA – KÓŁKO I KRZYśYK
ZAŁOśENIA
•
Plansza
3 x 3
(Liczba pól na planszy: 9)
•
Pola numerowane są od 0 do 8.
•
Pierwszy ruch należy do człowieka
.
•
Cel algorytmu:
Algorytm (komputer) nie może przegrać z człowiekiem,
może wygrać bądź zremisować.
Przykład działania gotowej aplikacji
Start gry
Programowanie obiektowe. Ćwiczenie 11. 5
______________________________________________________________________
Przebieg gry
Biblioteki:
#include <fstream.h>
#include <iostream.h>
Stałe:
#define TITLE1 " Kółko i krzyżyk "
#define TITLE2 " PRZETWARZAM INFORMACJE ......... "
#define SIZE 9
#define CZLOWIEK 0 // POLE KÓŁKO - człowiek
#define KOMPUTER 1 // POLE KRZYśYK - komputer
#define PUSTE 2 // POLE PUSTE
#define WIN_CZLOWIEK "CZŁOWIEK" // wygrał człowiek
#define WIN_KOMPUTER "KOMPUTER" // wygrał komputer
#define WIN_REMIS "REMIS" // remis
#define KK_CONFIG "KK_CONFIG.DAT"
Zmienne globalne:
int plansza[SIZE] = {PUSTE,PUSTE,PUSTE,PUSTE,PUSTE,PUSTE,PUSTE,PUSTE,PUSTE};
int aktualny_gracz = CZLOWIEK; // rozpoczyna CZŁOWIEK
int nr_pola = -1; // nr klikniętego pola
6
Programowanie obiektowe. Ćwiczenie 11.
______________________________________________________________________
______________________________________________________________________
Funkcje obsługujące interfejs graficzny
AnsiString get_obraz(int stan)
{
AnsiString FileName;
switch (stan)
{
case PUSTE : { FileName="puste.bmp"; break; };
case CZLOWIEK : { FileName="kolo.bmp"; break; };
case KOMPUTER : { FileName="krzyz.bmp"; break; };
default : FileName="";
};
return FileName;
}
// Funkcja rysuje plansz
ę
gry w kółko i krzy
ż
yk.
// Plansza przechowywana jest w tablicy plansza[] o rozmiarze 9 x 9
// w elementach o nast
ę
puj
ą
cych indeksach:
// plansza[0] plansza[1] plansza[2]
// plansza[3] plansza[4] plansza[5]
// plansza[6] plansza[7] plansza[8]
void plansza_wyswietl(void)
{
if (plansza[0]==PUSTE)
{
Form1->Image0->Enabled = true;
Form1->Image0->Picture->LoadFromFile("puste.bmp");
}
else
{
Form1->Image0->Enabled = false;
Form1->Image0->Picture->LoadFromFile(get_obraz(plansza[0]));
};
if (plansza[1]==PUSTE)
{
Form1->Image1->Enabled = true;
Form1->Image1->Picture->LoadFromFile("puste.bmp");
}
else
{
Form1->Image1->Enabled = false;
Form1->Image1->Picture->LoadFromFile(get_obraz(plansza[1]));
};
if (plansza[2]==PUSTE)
{
Form1->Image2->Enabled = true;
Form1->Image2->Picture->LoadFromFile("puste.bmp");
}
else
{
Form1->Image2->Enabled = false;
Form1->Image2->Picture->LoadFromFile(get_obraz(plansza[2]));
};
if (plansza[3]==PUSTE)
{
Form1->Image3->Enabled = true;
Form1->Image3->Picture->LoadFromFile("puste.bmp");
}
Programowanie obiektowe. Ćwiczenie 11. 7
______________________________________________________________________
else
{
Form1->Image3->Enabled = false;
Form1->Image3->Picture->LoadFromFile(get_obraz(plansza[3]));
};
if (plansza[4]==PUSTE)
{
Form1->Image4->Enabled = true;
Form1->Image4->Picture->LoadFromFile("puste.bmp");
}
else
{
Form1->Image4->Enabled = false;
Form1->Image4->Picture->LoadFromFile(get_obraz(plansza[4]));
};
if (plansza[5]==PUSTE)
{
Form1->Image5->Enabled = true;
Form1->Image5->Picture->LoadFromFile("puste.bmp");
}
else
{
Form1->Image5->Enabled = false;
Form1->Image5->Picture->LoadFromFile(get_obraz(plansza[5]));
};
if (plansza[6]==PUSTE)
{
Form1->Image6->Enabled = true;
Form1->Image6->Picture->LoadFromFile("puste.bmp");
}
else
{
Form1->Image6->Enabled = false;
Form1->Image6->Picture->LoadFromFile(get_obraz(plansza[6]));
};
if (plansza[7]==PUSTE)
{
Form1->Image7->Enabled = true;
Form1->Image7->Picture->LoadFromFile("puste.bmp");
}
else
{
Form1->Image7->Enabled = false;
Form1->Image7->Picture->LoadFromFile(get_obraz(plansza[7]));
};
if (plansza[8]==PUSTE)
{
Form1->Image8->Enabled = true;
Form1->Image8->Picture->LoadFromFile("puste.bmp");
}
else
{
Form1->Image8->Enabled = false;
Form1->Image8->Picture->LoadFromFile(get_obraz(plansza[8]));
};
}
8
Programowanie obiektowe. Ćwiczenie 11.
______________________________________________________________________
______________________________________________________________________
// Funkcja resetuje plansz
ę
gry w kółko i krzy
ż
yk.
void plansza_reset(void)
{
for (int i=0; i<SIZE; i++)
plansza[i] = PUSTE;
plansza_wyswietl();
}