background image

 Programowanie obiektowe. Ćwiczenie 11.                                              1 

______________________________________________________________________ 
 

 

 

 
 
 
 
 
 
 
 
 
 

PROGRAMOWANIE OBIEKTOWE 

 

 

 

ĆWICZENIE 11 

 
 
 
 

 

 

 
 

 

Projektowanie prostej gry planszowej 

 

Implementacja algorytmu minimax 

 

Aplikacja GRA „Kółko i krzyzyk” 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

background image

 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: 
 

 

 

background image

 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(); 

 
 
 

background image

 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 

 

 

 

 

 

 

background image

 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 
 
 
 
 
 
 
 
 
 
 

background image

 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"); 
    } 

background image

 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])); 
    }; 

 
 
 
 
 

background image

 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();