Problem z przerobieniem gry w jezyku C++

Witam.

Potrzebuje pomocy przy przerobieniu gry z jednego na dwoch graczy.

  • pileczka powinna przechodzic na dole i u gory co bedzie oznaczalo zdobycie punktu.

Program wyglada nastepujaco:

//---------------------------------------------------------------------------


#include 

#pragma hdrstop


#include "PPong.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

int x, y; //wspolrzedne pilki

int dx, dy; //przyrost wspolrzednych

int r; //promin pilki

TColor cBall; //color pilki

TColor cBack; //color tla

int wp, hp; //rozmir pola dla ping-pongu


// zmienne dla sterowania gra

int rd; // 0 - stop / 1 - wlewo 2 - wprawo

int rx1, rx2; // wspolrzedne X paska dla odbicia

int ry; // wpolrzedna Y paska

int rdx; // krok przesowania paska

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

        : TForm(Owner)

{

r = 5; // polka

x = 10; y = 10; // polozenie startowe pilki

dx = 1;

dy = 1;

cBall = (TColor)RGB(217, 217, 25); // color pilki

cBack = (TColor)RGB(33, 94, 33); // color tla

Form1->Color = cBack;

wp = Form1->ClientWidth;

hp = Form1->ClientHeight;

// sterowanie paskiem

rd = 0; // pasek stoi na miejscy

rx1=100;

rx2=155;

ry = Form1->ClientHeight - 20; // polozenie pionowe pasku

rdx = 2; // krok ruchu paska


// ustawenia zegara

Timer1->Interval = 10;

Timer1->Enabled = true;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,

      TShiftState Shift)

{

if (rd != 0 )

// trzymamy klawisz

 return ;

switch (Key)

 {

 case VK_LEFT : // wlewo

   rd = 2; break;

 case VK_RIGHT: // wprawo

   rd = 1; break;

 }


}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key,

      TShiftState Shift)

{

 rd = 0;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormPaint(TObject *Sender)

{

 // rysujeme pasek

  Form1->Canvas->Pen->Color = clRed;

  Form1->Canvas->Rectangle(rx1, ry, rx2, ry+1);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)

{

 // scieranie pilki

 Form1->Canvas->Pen->Color = cBack;

 Form1->Canvas->Ellipse(x,y,x+r,y+r);

 // nowe wspolrzedne pilki

if ( dx > 0 )

{

// pilka leci wprawo

if ((x + dx + r) >wp) dx = -dx;

}

// ....wlewo

if ((x + dx - r) < 0 ) dx = -dx;


if ( dy > 0 )

{

 // .... wdol

 if ((x >= rx1) && (x <= rx2 -r) && (y == ry - r - 1))

 // trafienie w pasek

  dy = - dy;

 else

 if (y + dy + r > Form1->ClientHeight ) dy = -dy;

}

 else

{

// .... dogory

if ((x >= rx1) && (x <= rx2) && (y >= ry - r) && (y <= ry + r))

{

// Pilka odbila sie od dolnej sciany i trafila w pasek z tylu

// Rysujemy ponownie pasek

 Form1->Canvas->Pen->Color = clRed;

 Form1->Canvas->Rectangle(rx1, ry, rx2, ry+1);

}

if (y + dy - r < 0) dy = -dy;

}

x+= dx;

y+= dy;

// rysowanie pilki w nowym punkcie

Form1->Canvas->Pen->Color = cBall;

Form1->Canvas->Ellipse(x,y,x+r,y+r);


// ruch paska

if (rd != 0)

{

// ncisniety i utrymywany klawisz "wlewo" lub "wprawo"


if (rd == 1)

{

// wprawo

if (rx2 < wp)

{

// rysujem ponownie pasek

Form1->Canvas->Pen->Color = cBack;

Form1->Canvas->Rectangle(rx1,ry,rx1+rdx,ry + 1);

Form1->Canvas->Pen->Color = clRed;

Form1->Canvas->Rectangle(rx2,ry,rx2+rdx,ry+1);

 rx1+= rdx;

 rx2+= rdx;

}

}

else

// wlewo

if (rx1 > 1 )

{

Form1->Canvas->Pen->Color = cBack;

Form1->Canvas->Rectangle(rx2,ry,rx2-rdx,ry+1);

Form1->Canvas->Pen->Color = clRed;

Form1->Canvas->Rectangle(rx1 - rdx, ry, rx1 +rdx, ry+1);

rx1-=rdx;

rx2-=rdx;

}

}


}

//--------------------------------------------------------------------------- Złączono Posta _: 02.06.2007 (Sob) 9:47_do tego sa jeszcze 2 pliczki:

//---------------------------------------------------------------------------


#ifndef PPongH

#define PPongH

//---------------------------------------------------------------------------

#include 

#include 

#include 

#include 

#include 

//---------------------------------------------------------------------------

class TForm1 : public TForm

{

__published:	// IDE-managed Components

        TTimer *Timer1;

        void __fastcall FormKeyDown(TObject *Sender, WORD &Key,

          TShiftState Shift);

        void __fastcall FormKeyUp(TObject *Sender, WORD &Key,

          TShiftState Shift);

        void __fastcall FormPaint(TObject *Sender);

        void __fastcall Timer1Timer(TObject *Sender);

private:	// User declarations

public: // User declarations

        __fastcall TForm1(TComponent* Owner);

};

//---------------------------------------------------------------------------

extern PACKAGE TForm1 *Form1;

//---------------------------------------------------------------------------

#endif

i

//---------------------------------------------------------------------------


#include 

#pragma hdrstop

//---------------------------------------------------------------------------

USEFORM("PPong.cpp", Form1);

//---------------------------------------------------------------------------

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{

        try

        {

                 Application->Initialize();

                 Application->CreateForm(__classid(TForm1), &Form1);

                 Application->Run();

        }

        catch (Exception &exception)

        {

                 Application->ShowException(&exception);

        }

        catch (...)

        {

                 try

                 {

                         throw Exception("");

                 }

                 catch (Exception &exception)

                 {

                         Application->ShowException(&exception);

                 }

        }

        return 0;

}

//---------------------------------------------------------------------------

Zauważyłeś przyklejony temat w tym dziale?

http://forum.dobreprogramy.pl/viewtopic.php?t=152275

Nie umieściłeś kodu w tagach [code] przez co skrochmaliło się formatowanie. Nie napisałeś, że to kod w BCB. Oczekujesz odpowiedzi przy takim niedbalstwie? Zależy Ci na czasie to szanuj czas innych.

Przepraszam , ale byl to moj pierwszy post na forum i nie zauwazylem infromacji jak powinno sie umieszczac kod, zeby wszystko bylo przejrzyste.

Jeśli kod pierwszego pliku faktycznie jest wyrównany do pierwszego znaku to współczuję, bo tego się czytać nie da.

Rzeczy które musisz dodać:

Odpowiedniki zmiennych dla drugiego gracza

int rd; // 0 - stop / 1 - wlewo 2 - wprawo 

int rx1, rx2; // wspolrzedne X paska dla odbicia 

int ry; // wpolrzedna Y paska

np. rd_2, rx1_2, rx2_2, ry_2. Zainicjalizuj zmienne w konstruktorze

rd_2 = 0; // pasek 2 stoi na miejscu

rx1_2=100;

rx2_2=155;

ry_2 = 20; // polozenie pionowe paska 2

rdx = 2; // krok ruchu paska

Zmień sposób reagowania na klawisze:

switch (Key) 

 { 

 case VK_LEFT : // w lewo gracz 1

   rd = 2; break;

 case VK_RIGHT: // w prawo gracz 1

   rd = 1; break;


 case VK_F1 : // w lewo gracz 2

   rd_2 = 2; break;

 case VK_F2: // w prawo gracz 2

   rd_2 = 1; break;

 }

FormKeyUp powinien zerować odpowiednią zmienną – rd=0 jest błędne.

switch (Key) 

{ 

case VK_LEFT:

case VK_RIGHT:

rd = 0; break;


case VK_F1:

case VK_F2:

rd_2 = 0; break;

}

FormPaint powinno rysować też drugiego gracza

Form1->Canvas->Rectangle(rx1_2, ry_2, rx2_2, ry_2+1);

Timer1 powinien także reagować na klawisze drugiego gracza.

if ( dy > 0 ) 

{ 

  // .... wdol 

  if ((x >= rx1) && (x <= rx2 -r) && (y == ry - r - 1)) 

    dy = - dy; // trafienie w pasek 1

  else

  if (y + dy + r > Form1->ClientHeight ) // bzdura

    dy = -dy;

} 

else 

{ 

// .... dogory 

 if ((x >= rx1_2) && (x <= rx2_2 -r) && (y == ry_2 + r + 1))

    dy = -dy; // trafienie w pasek 2

else

if ((x >= rx1) && (x <= rx2) && (y >= ry - r) && (y <= ry + r)) 

{ 

// Pilka odbila sie od dolnej sciany i trafila w pasek z tylu 

// Rysujemy ponownie pasek 

 Form1->Canvas->Pen->Color = clRed; 

 Form1->Canvas->Rectangle(rx1, ry, rx2, ry+1); 

} 

if (y + dy - r < 0) dy = -dy; 

} 


.

.

.


// ruch paska 2

if (rd_2 != 0) 

{ 

// ncisniety i utrymywany klawisz "wlewo" lub "wprawo" 


if (rd_2 == 1) 

{ 

// wprawo 

if (rx2_2 < wp) 

{ 

// rysujem ponownie pasek 

Form1->Canvas->Pen->Color = cBack; 

Form1->Canvas->Rectangle(rx1_2,ry_2,rx1_2+rdx,ry_2 + 1); 

Form1->Canvas->Pen->Color = clRed; 

Form1->Canvas->Rectangle(rx2_2,ry_2,rx2_2+rdx,ry_2 + 1); 

 rx1_2+= rdx; 

 rx2_2+= rdx; 

} 

} 

else 

// wlewo 

if (rx1_2 > 1 ) 

{ 

Form1->Canvas->Pen->Color = cBack; 

Form1->Canvas->Rectangle(rx2_2,ry_2,rx2_2 - rdx,ry_2+1); 

Form1->Canvas->Pen->Color = clRed; 

Form1->Canvas->Rectangle(rx1_2 - rdx, ry_2, rx1_2 +rdx, ry_2+1); 

rx1_2-=rdx; 

rx2_2-=rdx; 

} 

}

Prawdopodobnie nie są to wszystkie zmiany, ale powinny pozwolić Ci zacząć. Kod jest napisany niestarannie i jest zupełnie nieprzemyślany. Logika ruchu piłki i paletek jest przekombinowana i błędna. Jeśli to na zaliczenie, to pojechałbym po ocenie. Jestem leniem i nie chciało mi się pisać całości od zera, co jest chyba jedyną metodą na poprawienie tego kodu. Do sterowania użyłem F1/F2.

Ryan a jak zrobic zeby obliczal wynik ?

tzn. teraz pileczka odbija sie od gornej sciany, a ma wpadac.

Co to znaczy “a ma wpadac”?

Potrzebujesz dwie zmienne, które odpowiadają punktom postaci + zmiany w logice odbijania piłeczki. W momencie kiedy piłka przekroczy poziom na którym znajduje się paletka, inkrementowany powinien być wynik a piłka centrowana.

Wybacz, że nie napiszę za Ciebie kodu, ale nie dajesz ku temu powodu. Nic nie wskazuje na to, że sam napisałeś ten (i tak fatalny) kod i wygląda na to, że chcesz zmodyfikować kod albo na zaliczenie albo dla szpanu. W obu wypadkach motyw wzbudza moją odrazę.

Nie ukrywam, ze jest to program na zaliczenie. Musze go zmodyfikowac na dwoch graczy, a nie mam pojecia jak to zrobic… Dlatego szukam pomocy na forum.

I to było chyba na tyle w tym temacie…

Studiuje Organizacje i Zarzadzenie i w tym roku dolożyli nam niby “zapychacza programowego” - programowanie. I teraz mam z tym problem, nigdy nie programowalem w c++ a musze zaliczyc ten przedmiot.

Mam noz na gardle bo jesli nie zalicze do 5.06 dwoch z czterech zaleglych przedmiotow cofna mnie o semestr nizej.

Panowie pomozcie.

A to nie nasz problem! Trzeba było chodzić na zajęcia i przykładać się do nauki - olałeś, to się teraz nie dziw że masz teraz problem.