Problem z przerobieniem gry w jezyku C++


(Sc00t3r) #1

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:47do 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;

}

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

(Ryan) #2

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.


(Sc00t3r) #3

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


(Ryan) #4

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.


(Monczkin) #5


(Sc00t3r) #6

Ryan a jak zrobic zeby obliczal wynik ?

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


(Ryan) #7

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ę.


(Sc00t3r) #8

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.


(Monczkin) #9

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


(Sc00t3r) #10

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.


(adpawl) #11

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.