dzieki wielkie, gra i buczy ))
-- 5 stycznia 2010, 23:29 --
Chcę jeszcze dodać możliwość gry z komputerem, oto moj kod:
plik .cpp
Kod: Zaznacz cały
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "modyfikacja1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RuchKomp()
// ruch komputera
{
int num; // numer obrazka - wstawienie kółka
if (Oblicz(20, num)) // dwie dziesiatki
graWToku = 0; // zatrzymanie gry
else if (Oblicz(2, num)) ; // dwie dwójki
else if (Oblicz(10, num)) ; // jedna dziesiatka
else
num = Dowolne(); // dowolny ruch
// wpisanie kółka do obrazka na pozycji num
if (num > 0)
obrazki[num-1]->Picture->LoadFromFile("o.bmp");
}
bool __fastcall TForm1::Oblicz(int s, int & num)
// sprawdzenie, czy istnieje wiersz, kolumna, czy tez
// przekatna o sumie równej s
// jezeli tak, to podawana jest pozycja num, na której bedzie
// wstawione kółko
{
int i,j,suma;
// przekatna lewo w skos
suma = 0;
for (i=0; i<3; i++)
suma += kod[2-i][i];
// jesli suma wartosci jest równa s
if (suma == s) {
num = WstawDoLewo();
return 1;
}
// wiersz o indeksie 1
suma = 0;
for (j=0; j<3; j++)
suma += kod[1][j];
// jesli suma wartosci jest równa s
if (suma == s) {
num = WstawDoWiersza(1);
return 1;
}
// kolumna o indeksie 1
suma = 0;
for (i=0; i<3; i++)
suma += kod[i][1];
// jesli suma wartosci jest równa s
if (suma == s) {
num = WstawDoKolumny(1);
return 1;
}
// wiersz o indeksie 2
suma = 0;
for (j=0; j<3; j++)
suma += kod[2][j];
// jesli suma wartosci jest równa s
if (suma == s) {
num = WstawDoWiersza(2);
return 1;
}
// przekatna prawo w skos
suma = 0;
for (i=0; i<3; i++)
suma += kod[i][i];
// jesli suma wartosci jest równa s
if (suma == s) {
num = WstawDoPrawo();
return 1;
}
// kolumna o indeksie 0
suma = 0;
for (i=0; i<3; i++)
suma += kod[i][0];
// jesli suma wartosci jest równa s
if (suma == s) {
num = WstawDoKolumny(0);
return 1;
}
// wiersz o indeksie 0
suma = 0;
for (j=0; j<3; j++)
suma += kod[0][j];
// jesli suma wartosci jest równa s
if (suma == s) {
num = WstawDoWiersza(0);
return 1;
}
// kolumna o indeksie 2
suma = 0;
for (i=0; i<3; i++)
suma += kod[i][2];
// jesli suma wartosci jest równa s
if (suma == s) {
num = WstawDoKolumny(2);
return 1;
}
return 0; // nic nie wstawiono
}
int __fastcall TForm1::WstawDoWiersza(int i)
// wstawienie wartosci 10 do i-tego wiersza
{
int j,k, liczbaZer, wybor;
// wyznaczenie liczby zer
liczbaZer = 0;
for (j=0; j<3; j++)
if (kod[i][j] == 0)
liczbaZer++;
// losowanie - tylko gdy sa dwa zera
if (liczbaZer == 2)
wybor = random(199)/100;
else
wybor = 0;
// wpisanie wartosci 10 na miejsce wylosowanego zera
k = 0;
for (j=0; j<3; j++)
if (kod[i][j] == 0) {
if (k == wybor) {
kod[i][j] = 10;
return cyfry[i][j];
}
k++;
}
return -1;
}
int __fastcall TForm1::WstawDoKolumny(int j)
// wstawienie wartosci 10 do j-tej kolumny
{
int i, k, liczbaZer, wybor;
// wyznaczenie liczby zer
liczbaZer = 0;
for (i=0; i<3; i++)
if (kod[i][j] == 0)
liczbaZer++;
// losowanie - tylko gdy sa dwa zera
if (liczbaZer == 2)
wybor = random(199)/100;
else
wybor = 0;
// wpisanie wartosci 10 na miejsce wylosowanego zera
k = 0;
for (i=0; i<3; i++)
if (kod[i][j] == 0) {
if (k == wybor) {
kod[i][j] = 10;
return cyfry[i][j];
}
k++;
}
return -1;
}
int __fastcall TForm1::WstawDoPrawo()
// wstawienie wartosci 10 do przekatnej prawo w skos
{
int i, k, liczbaZer, wybor;
// wyznaczenie liczby zer
liczbaZer = 0;
for (i=0; i<3; i++)
if (kod[i][i] == 0)
liczbaZer++;
// losowanie - tylko gdy sa dwa zera
if (liczbaZer == 2)
wybor = random(199)/100;
else
wybor = 0;
// wpisanie wartosci 10 na miejsce wylosowanego zera
k = 0;
for (i=0; i<3; i++)
if (kod[i][i] == 0) {
if (k == wybor) {
kod[i][i] = 10;
return cyfry[i][i];
}
k++;
}
return -1;
}
int __fastcall TForm1::WstawDoLewo()
// wstawienie wartosci 10 do przekatnej lewo w skos
{
int i, k, liczbaZer, wybor;
// wyznaczenie liczby zer
liczbaZer = 0;
for (i=0; i<3; i++)
if (kod[2-i][i] == 0)
liczbaZer++;
// wpisanie wartosci 10 na miejsce wylosowanego zera
if (liczbaZer == 2)
wybor = random(199)/100;
else
wybor = 0;
// wpisanie wartosci 10 na miejsce wylosowanego zera
k = 0;
for (i=0; i<3; i++)
if (kod[2-i][i] == 0) {
if (k == wybor) {
kod[2-i][i] = 10;
return cyfry[2-i][i];
}
k++;
}
return -1;
}
int __fastcall TForm1::Dowolne()
// wstawienie wartosci 10 na miejsce wylosowanego
// zera w całej tablicy
{
int i,j,k,liczbaZer,wybor;
// wyznaczenie liczby zer
liczbaZer = 0;
for (i=0; i<3; i++)
for (j=0; j<3; j++)
if (kod[i][j] == 0)
liczbaZer++;
// wylosowanie zera (które z kolei)
wybor = random(liczbaZer);
// wpisanie wartosci 10 na miejsce wylosowanego zera
k=0;
for (i=0; i<3; i++)
for (j=0; j<3; j++)
if (kod[i][j] == 0) {
if (k == wybor) {
kod[i][j] = 10;
return cyfry[i][j];
}
k++;
}
return -1;
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
int i,j,k;
// inicjalizacja generatora liczb losowych
randomize();
graWToku = 1; // gra w toku
liczbaRuchow = 0;
Komunikat->Visible = false;
// w tablicy same zera
for (i=0; i<3; i++)
for (j=0; j<3; j++)
kod[i][j] = 0;
// wypełnienie tablicy cyfry
cyfry[0][0] = 4;
cyfry[0][1] = 9;
cyfry[0][2] = 2;
cyfry[1][0] = 3;
cyfry[1][1] = 5;
cyfry[1][2] = 7;
cyfry[2][0] = 8;
cyfry[2][1] = 1;
cyfry[2][2] = 6;
// utworzenie 9 obrazków
for (k=0; k<9; k++) {
obrazki[k] = new SpecObraz(this);
obrazki[k]->Parent = this;
obrazki[k]->Left = 50 + k*60;
obrazki[k]->Top = 200;
obrazki[k]->Width = 30;
obrazki[k]->Height = 30;
obrazki[k]->Visible = true;
obrazki[k]->Stretch = true;
// załadowanie obrazka
obrazki[k]->Picture->LoadFromFile("puste.bmp");
// podanie nazwy metody wykonywanej po zajsciu
// zdarzenia OnClick
obrazki[k]->OnClick = Gracz;
// nadanie wartosci własnosciom i,j
for (i=0; i<3; i++)
for (j=0; j<3; j++)
if (cyfry[i][j] == k+1) {
obrazki[k]->i = i;
obrazki[k]->j = j;
}
}
// wyswietlenie cyfr w odpowiednim miejscu na formularzu
Label1->Left = 60;
Label1->Top = 165;
Label2->Left = 120;
Label2->Top = 165;
Label3->Left = 180;
Label3->Top = 165;
Label4->Left = 240;
Label4->Top = 165;
Label5->Left = 295;
Label5->Top = 165;
Label6->Left = 355;
Label6->Top = 165;
Label7->Left = 415;
Label7->Top = 165;
Label8->Left = 475;
Label8->Top = 165;
Label9->Left = 535;
Label9->Top = 165;
}
void __fastcall TForm1::Gracz(TObject *Sender)
// metoda wykonywana po nacisnieciu przycisku myszki na
// obiektach klasy SpecObraz
{
int i,j, nr, pom;
nr = 0;
// jesli koniec gry
if (!graWToku) return;
// wyznaczenie numeru obiektu, na którym nacisnieto
// przycisk myszki
for (i=0; i<9; i++)
if (obrazki[i] == Sender)
nr = i;
// jesli w danym obiekcie jest juz kółko lub krzyzyk
if (kod[obrazki[nr]->i][obrazki[nr]->j] == 10 ||
kod[obrazki[nr]->i][obrazki[nr]->j] ==1)
return;
// obliczenie liczby wykonanych ruchów przez gracza
liczbaRuchow++;
// wpisanie krzyzyka
obrazki[nr]->Picture->LoadFromFile("krzyz.bmp");
// do tablicy kodów wpisujemy 1
kod[obrazki[nr]->i][obrazki[nr]->j] = 1;
if (Oblicz(3,pom)) {
// sa trzy jedynki
Komunikat->Visible = true;
// Komunikat->Caption = "GRATULACJE WYGRALES";
Komunikat->Text= "GRATULACJE WYGRALES";
graWToku = 0; // koniec gry
} else {
if (liczbaRuchow == 5) {
// wykonano wszystkie ruchy bez rozstrzygniecia
Komunikat->Visible = true;
Komunikat->Text = "REMIS";
}
RuchKomp();
if (!graWToku) {
// komputer zatrzymał gre
Komunikat->Visible = true;
Komunikat->Text = "NIESTETY PRZEGRALES";
}
}
}
void __fastcall TForm1::NowaClick(TObject *Sender)
// obsługa rozpoczecia nowej gry
{
int i,j,k;
graWToku = 1;
liczbaRuchow = 0;
Komunikat->Visible = false;
// wyzerowanie tablicy kodów
for (i=0; i<3; i++)
for (j=0; j<3; j++)
kod[i][j] = 0;
// załadowanie pustych obrazków
for (k=0; k<9; k++)
obrazki[k]->Picture->LoadFromFile("krzyz.bmp");
}
nagłówek .h
Kod: Zaznacz cały
//---------------------------------------------------------------------------
#ifndef modyfikacja1H
#define modyfikacja1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Graphics.hpp>
//---------------------------------------------------------------------------
class SpecObraz: public TImage
{
public:
int i,j;
__fastcall SpecObraz(TComponent *AOwner):
TImage(AOwner) {};
};
class TForm1 : public TForm
{
__published: // IDE-managed Components
TImage *obrazki1;
TImage *obrazki2;
TImage *obrazki3;
TImage *obrazki4;
TImage *obrazki5;
TImage *obrazki6;
TImage *obrazki7;
TImage *obrazki8;
TImage *obrazki0;
TEdit *Komunikat;
TLabel *Label1;
TLabel *Label2;
TLabel *Label3;
TLabel *Label4;
TLabel *Label5;
TLabel *Label6;
TLabel *Label7;
TLabel *Label8;
TLabel *Label9;
void __fastcall Gracz(TObject *Sender);
private: // User declarations
int kod[3][3], cyfry[3][3];
int graWToku, liczbaRuchow;
SpecObraz *obrazki[9];
void __fastcall RuchKomp();
bool __fastcall Oblicz(int, int &);
int __fastcall WstawDoWiersza(int);
int __fastcall WstawDoKolumny(int);
int __fastcall WstawDoPrawo();
int __fastcall WstawDoLewo();
int __fastcall Dowolne();
public: // User declarations
__fastcall TForm1(TComponent* Owner);
void __fastcall FormCreate(TObject *Sender);
void __fastcall NowaClick(TObject *Sender);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Nie wiem dlaczego ale kompiluje się lecz nie dziala:/ Będę wdzięczny jeśli ktoś to skompiluje i rzuci okiem.-- 5 stycznia 2010, 23:32 --odświeżam