Balistyka w grze - problem

0
#include <windows.h>
#include <iostream>
#include <math.h>
#define PI 3.14159265
using namespace std;
WORD kolor=0x00f0;
HANDLE uchwyt;
bool wilka=true, wilkb=true, szczela=false, wyszczelil=false, tia;
int pociski=100, stala=100, startowa=5, xpoc, ypoc;
double kont=25, pred=45, czas, kontdwa, xpocdwa, ypocdwa; 
void kol(int k)
{
 HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
 SetConsoleTextAttribute(handle, k);   
}
void gotoxy(int x, int y)
{
  COORD c;
  c.X = x - 1;
  c.Y = y - 1;
  SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c);
}
void wybieraj()
{
 char dec, startodwa, kontdwa, preddwa; 
 cout<<"Wciśnij odpowiednio klawisz 1, 2, 3 lub 4 aby:\n";
 cout<<"1 - Zmienić kąt rzutu\n";
 cout<<"2 - Zmienić prędkość(siłę) rzutu\n";
 cout<<"3 - Zmienić swoją pozycję\n";
 cout<<"4 - Strzelić\n";
 cin>>dec;cout<<"\n";
 switch (dec)
 {
  case '1': cout<<"Wciśnij \42+\42 lub \42-\42 aby odpowiednio zwiekszyć lub zmniejszyć kąt.\n"; tia=false; 
            while(tia==false){cin>>kontdwa; 
                             if(kontdwa=='+'){kont=kont+1;tia=true;}; 
                             if(kontdwa=='-'){kont=kont-1;tia=true;};}break;  
  case '2': cout<<"Wciśnij \42+\42 lub \42-\42 aby odpowiednio zwiekszyć lub zmniejszyć prędkość.\n"; tia=false; 
            while(tia==false){cin>>preddwa; 
                             if(preddwa=='+'){pred=pred+1;tia=true;}; 
                             if(preddwa=='-'){pred=pred-1;tia=true;};} break;
  case '3': cout<<"Gdzie chcesz się przesunąć? Zakres ruchu to liczby całkowite od 0 do 9.\n"; startowa=-1;
            while(startowa<0){cin>>startodwa;
                                           if(startodwa=='0'){startowa=1;} if(startodwa=='1'){startowa=3;} if(startodwa=='2'){startowa=5;} if(startodwa=='3'){startowa=7;}
                                           if(startodwa=='4'){startowa=9;}if(startodwa=='5'){startowa=11;}
                                           if(startodwa=='6'){startowa=13;}
                                           if(startodwa=='7'){startowa=15;}
                                           if(startodwa=='8'){startowa=17;}
                                           if(startodwa=='9'){startowa=19;}
                                           } break;
  case '4': cout<<"OGNIA!\n"; czas=0; pociski--; szczela=true; Sleep(500); break; 
  default: gotoxy(1,41); cout<<"Źle podałeś użyszkodniku! Pozwól, że spytam ponownie:\n"; wybieraj(); break; 
 }       
}
void wyswietl()
{ 
 if(wilka==true){gotoxy(62,24);cout<<"|\\/|"; gotoxy(62,25);cout<<"|oo|"; gotoxy(62,26);cout<<";  ;"; gotoxy(63,27);cout<<"\42\42";}
 else{gotoxy(62,24);cout<<" _=_"; gotoxy(62,25);cout<<"'   '"; gotoxy(62,26);cout<<"|RIP|"; gotoxy(62,27);cout<<"|___|";}
 if(wilkb==true){gotoxy(74,24);cout<<"|\\/|"; gotoxy(74,25);cout<<"|oo|"; gotoxy(74,26);cout<<";  ;"; gotoxy(75,27);cout<<"\42\42";}
 else{gotoxy(74,24);cout<<" _=_"; gotoxy(74,25);cout<<"'   '"; gotoxy(74,26);cout<<"|RIP|"; gotoxy(74,27);cout<<"|___|";}
 if(szczela==true){gotoxy(startowa,25);cout<<" \2_\100";gotoxy(startowa,26);cout<<"/|'";gotoxy(startowa,27);cout<<"\256^\257";szczela=false;wyszczelil=true;}
 else{if(wyszczelil==true)
      {gotoxy(startowa,25);cout<<" \2/";gotoxy(startowa,26);cout<<"/|";gotoxy(startowa,27);cout<<"\256^\257";
       kontdwa=kont*PI/180;  czas=czas+0.1; 
       xpocdwa=stala*(pred*cos(kontdwa)*czas)+startowa+4; ypocdwa=-(stala*((sin(kontdwa)*pred*czas)-(5*czas*czas)))+20;
       xpoc=round(xpocdwa); ypoc=round(ypocdwa);  
       gotoxy(xpoc,ypoc); cout<<"\370";
       if(wilka==true&&xpoc>61&&xpoc<66&&ypoc>23&&ypoc<27){gotoxy(1,50);cout<<"T R A F I E N I E  ! ! !"; kol(4); gotoxy(xpoc-1,25); cout<<"\\\363/"; kol(15); wilka=false; wyszczelil=false;}
       else
        {if(wilkb==true&&xpoc<78&&xpoc>73&&ypoc<27&&ypoc>23){gotoxy(1,50);cout<<"T R A F I E N I E  ! ! !"; kol(4); gotoxy(xpoc-1,25); cout<<"\\\363/"; kol(15); wilkb=false;
            wyszczelil=false;}
         else{if(xpoc<1||ypoc<1||xpoc>80||ypoc>71||(ypoc==25&&(xpoc==57||xpoc==58||xpoc==59))||(ypoc==26&&(xpoc==56||xpoc==57||xpoc==58||xpoc==59))||(ypoc==27&&(xpoc<24||xpoc>53))||ypoc>27)
               {gotoxy(1,50);cout<<"P U D Ł O ! ! !"; wyszczelil=false; if(xpoc>25&&xpoc<53&&ypoc>26){kol(9); gotoxy(xpoc-2,27); cout<<">\\\363/<"; gotoxy(xpoc,28); cout<<"\364"; kol(15);}}
       }}}
      else{gotoxy(startowa,25);cout<<" \2";gotoxy(startowa,26);cout<<"/|!~o";gotoxy(startowa,27);cout<<"\256^\257";}}
}
void plansza()
{
 cout<<"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";kol(6);
 cout<<"                                                        ,^.\n";
 cout<<"                                                       /\260\261|\n";
 cout<<"_______________________                              ,'\260\261\262\260\\____________________";
 cout<<"\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\262\261\260`-";kol(9);cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~";kol(6);
 cout<<";\260\261\262\333\333\262\261\262\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333";
 cout<<"\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\262\261\260\260\\";kol(9);
 cout<<"\260\261\262\333\333\333\333\333\333\333\333\262\261\262\333\333\333\333\333\333\262\261\261\260\260";kol(6);
 cout<<"/\260\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333";
 cout<<"\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\262\261\261\260`.";kol(9);
 cout<<"\261\262\333\333\333\333\333\262\261\260";kol(6);cout<<"_";kol(9);cout<<"\260\261\262\333\262\261\261\260";kol(6);
 cout<<"_,^'\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333";
 cout<<"\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\262\262\261\260|";kol(9);
 cout<<"\260\261\262\262\262\262\261\260\260";kol(6);cout<<"/\260|";kol(9);cout<<"\260\261\262\260";kol(6);
 cout<<"_,'\260\260\261\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333";
 cout<<"\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\262\261\260\\____,'^|\260\261\260\\__/\260\260\262\262\333\333\333\333\333";
 cout<<"\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333";
 cout<<"\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\262\261\261\262\262\262\262\261\262\262\262\262\262\262\262\262\262\262";
 cout<<"\262\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\333\n";kol(15);
 cout<<"Zostało pocisków:  "<<pociski<<"\n";
 cout<<"Kąt rzutu:         "<<kont<<"\n";
 cout<<"Prędkość rzutu:    "<<pred<<"\n\n\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365";
 cout<<"\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365\365";    
 gotoxy(1,27); cout<<"g";
}
int main()
{
 HANDLE okno = GetStdHandle(STD_OUTPUT_HANDLE);
 COORD size;
 size.X = 80;
 size.Y = 71;
 SetConsoleScreenBufferSize(okno, size);
 HANDLE thisProgram;
 SMALL_RECT DisplayArea = {0,0,0,0};
 thisProgram = GetStdHandle(STD_OUTPUT_HANDLE);
 DisplayArea.Bottom = 70;  
 DisplayArea.Right = 79;      
 SetConsoleWindowInfo(thisProgram, TRUE, &DisplayArea);
 kol(15);
 uchwyt=GetStdHandle(STD_OUTPUT_HANDLE); 
 while(wilka==true||wilkb==true){system("cls"); plansza(); wyswietl(); if(wyszczelil==true){Sleep(500);}else{gotoxy(1,41); wybieraj();}}
 system("cls");
 cout<<"W I L K I  -  K A P U T T  !!!";
 system("pause");
 return 0;    
}
 

Oto program który napisałem. W założeniu miał być cześcią większej gry tekstowej. Pisałem go osobno, żeby łatwiej było go debuggować przed połączeniem z pozostałą cześcią gry.
I tu pojawia się mój problem: po wystrzeleniu pocisku, pojawia sie on u stóp "awatara" i wyskakuje napis "pudło" niezależnie od podanych przeze mnie parametrów lotu takich jak predkosc, kąt, stała itp.
Niestety nie potrafię znaleźć gdzie popełniłem błąd.
Ciągle jeszcze uczę się c++ i stąd moja prośba do forumowiczów: pomóżcie mi naprawić mój mały program:)

0
  1. Usuń wszystkie magiczne liczby (!)
  2. Sformatuj kod
  3. Dodaj komentarze
  4. Że już o nazwach zmiennych w stylu "szczela, wyszczelil, tia" nawet nie wspominam. Skończ może przedszkole a potem zajmij się programowaniem...
0

twoje problemy wynikają z tragicznego stylu kodowania! Bardziej to przypomina spaghetti niż kod programu.
Zasady podstawowe ułatwiające czytanie i debugowanie:

  1. tylko jedna instrukcja w linijce (ty masz ich czasami 6).
  2. logiczne formatowanie kodu, które umożliwia szybkie zorientowanie się gdzie jest początek i koniec bloku - bardzo ważne jeśli w jednym obszarze maż dużo instrukcji warunkowych!
  3. nigdy nie używać goto! (przypadki kiedy użycie goto jest wymagane są bardzo rzadkie - mnie się chyba nigdy nie zdarzyło).

Zasady powszechnie stosowane:

  1. używanie stałych, zamiast magicznych liczb
  2. jedna funkcja metoda nie powinna zawierać więcej niż 3 instrukcje warunkowe (zasada nieścisła i niektórzy stosują inne kryteria), jeśli ma ich więcej to cześć logiki należy umieścić w dodatkowej metodzie/funkcji o dobrze dobranej nazwie.
  3. spójne formatowanie (wszędzie taki sam styl formatowania kodu).

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