C++ problem z grą ping pong

0

Witam, jestem osobą początkująca jeśli chodzi o programowanie w języku c++. Nauczyciel zadał nam zadanie aby zrobić grę typu ping pong. Utknęłam i nie wiem co robić dalej. Czytałam wiele różnych postów lecz kompletnie nie rozumiem większości użytych funkcji, dlatego proszę bardzo o pomoc, gdyż nie wiem co robię źle. Tutaj jest cały mój program:
'

 #include <cstdlib>
#include <iostream>
#include<winbgim.h>
int x=100;   
int y=100;
int dx=7;
int dy=6;
int szer=800;
int wys=600;
int r=20;
int x1=770;
int y1=280;
int x2=800;
int y2=380;
char a;

using namespace std;

int main(int argc, char *argv[])
{    initwindow(szer,wys);
    setfillstyle(SOLID_FILL,BLACK);
    bar(0,0,szer,wys);
   
    while(1)
 {               
 setcolor(WHITE);
 setlinestyle(SOLID_LINE,0,4);
 
    circle(x,y,r);
    delay(25);
    setcolor(BLACK);
    circle(x,y,r);
    x+=dx;
    y+=dy;

    if(y>wys-r||y<r)
    dy=-dy;
    
   if(x>szer-r||x<r)
   dx=-dx;
     
   setcolor(WHITE);
   rectangle(x1,y1,x2,y2);
 
 a=getch();
      if(a=='a'||a=='A')
  {      
      setcolor(BLACK);
      rectangle(x1,y1,x2,y2);
      
   y1=y1+5;
   y2=y2+5;
}
    if(a=='z'||a=='Z')
{ setcolor(BLACK);
  rectangle(x1,y1,x2,y2);
  
  y1=y1-5;
  y2=y2-5;}            
        
 
              }
    closegraph();
    return EXIT_SUCCESS;
}
0

jaki jest ten problem?

0

piłka jest widoczna tylko w momencie gdy trzymam klawisz gdy nic nie robię nie widac piłki.

0

bo getch zatrzymuje program. Najprościej jest użyć np. GetAsyncKeyState bodajże jak to się nazywało. Więcej info na MSDN

0

hmm.. no dobra a jak mogę wpisać żeby piłka odbijała się od paletki :) bo tego kompletnie nie wiem. no i jak zatrzymać paletkę żeby nie "wychodziła" poza ekran?

0

żeby paletka nie wychodziła poza ekran wystarczy wrzucić poruszanie sie paletką w if'a->
if(y1<ogranicznikGórny && y2>ogranicznikDolny) ruszaj paletką

albo to samo w instrukcji while -> while(warunekOgranicznikówSpełniony) ruszaj paletką

0

odbijanie sie wymaga już odrobiny fizyki -> i zakładam że powiem źle ale mam nadzieje że wyłapiesz błąd bądź ktoś mnie poprawi

generalnie musisz wrzucić warunek na zetknięcie piłka-paletka - we flashu jest funkcja hitTest(obj1,obj2) ale wydaje mi się że w C musisz to zrobić współrzędnymi ->

if(xpiłki==xpaletki && ypiłki<y1&&ypiłki>y2) zmiana kierunku

zmiana kierunku..... ja bym w ogóle zrobil że
xpiłki +=cos(a);
ypiłki +=sin(a);

pamiętaj że musisz dodać biblioteke cmath do sin/cos o ile pamiętam

i przy odbiciu a=-1/a -> prostopadłe odbicie z teorii funcji liniowej :P
żeby odbicie było realistyczne musisz obliczac kąt odbicia (czyli nowe a = PI(90stopni)-a ,bo kąt odbicia nie jest liczony od płaszczyzny paletki ale od prostej prostopadłej do paletki

jak będzie działać wrzuć koniecznie kod :D

0

ciężkie to wszystko ale co do paletki rozumiem :D dzięki. tylko naprawdę nie da się kierowania nią zrobić przy użyciu getch? pytam bo nauczyciel powiedział żebyśmy tego użyli.

0

jak tylko coś wyjdzie to wrzucę :) ale jak zaczęłam zmieniać to paletka nawet nie chce się ruszyć ;o o zgrozo!!

0

wystarczy razem z detekcją klawisza
if(a=='z'||a=='Z')
dodać możliwość ruchu
if(a=='z'||a=='Z' && y1<ogranicznikMinimum)

ograniczniki minimum/maksimum to wiadomo (0,0)-(szer,wys)

analogicznie tam gdzie miałaś if'a tyczącego się ruchu w góre :)

co do ruchu
zamiast: a=jakiś kąt!=(0||PI) bo jeśli 0 lub PI będzie się w kółko pionowo posuszać
x+=dx; x+=cos(a);
y+=dy; y+=sin(a)

if(y>wys-r||y<r)        if(piłka walnie w sufit) a=3/2PI-a (boże nie wiem czy + czy minus a ;/)
dy=-dy;                   if(walnie w podłogę) a=1/2PI-a
                              if(walnie w paletke lewą)a=0-a

if(x>szer-r||x<r) if(walnie w paletke prawą)a=PI-a
dx=-dx;

mam nadzieje że moja trygonometria jest lepsza niż mi sie wydaje :D

0

ok :D pobawię się jeszcze z tym sama i później dam znać jak to wyszło :D z góry dziękuję za pomoc :) przydało się!!

0

zrobie wszystko żeby sie nie uczyć do egzaminów więc łap http://phpp.prv.pl/
opisanej "mechaniki" nie zaimplementowałem - więc mój pong jest bardzo marny i sie bug'uje co chwila
robione na szybko ale "działa" i mniej więcej opisuje co chciałem przekazać -> jak będzie działająca wersja to wrzuce od razu ;d

1
mirtilloo napisał(a):

ciężkie to wszystko ale co do paletki rozumiem :D dzięki. tylko naprawdę nie da się kierowania nią zrobić przy użyciu getch? pytam bo nauczyciel powiedział żebyśmy tego użyli.

da się i to bez problemu trzeba tylko wcześniej sprawdzić czy mamy coś w buforze :

int hit = kbhit();  // sprawdź czy mamy coś w buforze 

if (hit)    // jezeli tak
{
  int ch = getch(); // odczytaj

  if (ch == key_code) // sprawdź czy ch to znak "key_code"
  {
        //tutaj obsługa przycisku "key_code"
   }
   // tutaj inne kody znaków 

}  // tutaj koniec if (hit)


1 użytkowników online, w tym zalogowanych: 0, gości: 1