Ślęczę nad tym kodem już wiele dni odkąd go napisałem. Serio. (dowód: to post który oznacza początek moich prac nad tą funkcją http://4programmers.net/Forum/Newbie/210417-stworzenie_w_outpucie_konsoli_tablicy_z_kolumnami_i_wierszami. Dla jeszcze szerszych wyjaśnień czytajcie moją aktualną sygnaturkę)
Problemów jest wiele i nie do końca potrafię z nimi skutecznie walczyć, choć już kilka załatałem.
- Zagmatwanie w pętlach.
- Po nieudanym strzale nie ma stosownego komunikatu.
- Pomimo celnego strzału nie ma stosownego komunikatu.
- Znak oznaczający miejsce spudłowania (uwzględniwszy grawitację i wiatr) nie jest nigdzie wstawiany
i wiele więcej
Pomimo błędów JEST DO ODPALENIA, o ile dacie mu otoczkę z globalnych zmiennych.
Mam nadzieję, że nie zrzucam na was zbyt wielkiego kodu, ale proszę tylko o przejrzenie najbardziej problemowych kawałków, które powyżej wymieniłem. Proszę o pomoc, bo ja już sobie nie radzę.
(obym doczekał się chociaż jednego postu :P)
returned aim(unsigned uWiatr, quarter qKierunek, unsigned uOdleglosc) {
unsigned X, Y, XS, YS, XC, YC, uProby = 0;
bool bCelowanie = false, bStrzal = false, bSpotter = false;
do { X = random(uWiersze - 1, 0); } while (X < 13 || X > 16);
do { Y = random(uKolumny - 1, 0); } while (Y < 15 || Y > 25);
unsigned uYWektor = 0, uXWektor = 0;
unsigned Xreal = X, Yreal = Y; // współrzędne miejsca gdzie należy przycelować by trafić;
// grawitacja
Xreal -= uOdleglosc / 109 + 1;
ceil(Xreal);
uXWektor += Xreal;
// wiatr
unsigned uWiatrSlaby = random(1, 0), uWiatrUmiarkowany = random(1, 0), uWiatrSilny = random(2, 0);
switch (qKierunek) {
// wiatry ingerujÄ…ce w poziom
case west:
switch (uWiatr) {
case 1: Yreal += uWiatrSlaby; uYWektor += uWiatrSlaby;
case 2: Yreal += uWiatrUmiarkowany; uYWektor += uWiatrUmiarkowany;
case 3: Yreal += uWiatrSilny; uYWektor += uWiatrSilny;
}
break;
case east:
switch (uWiatr) {
case 1: Yreal -= uWiatrSlaby; uYWektor -= uWiatrSlaby;
case 2: Yreal -= uWiatrUmiarkowany; uYWektor -= uWiatrUmiarkowany;
case 3: Yreal -= uWiatrSilny; uYWektor -= uWiatrSilny;
}
break;
}
// zabezpieczenie na przekroczenie indeksĂłw tablic
if (Xreal < 0) Xreal = 0;
else if (Xreal >= uWiersze) Xreal = uWiersze - 1;
if (Yreal < 0) Yreal = 0;
else if (Yreal >= uKolumny) Yreal = uKolumny - 1;
// spotter?
if (uBronPalna >= 70) bSpotter = true;
char tMiejsca[uWiersze][uKolumny];
clear();
// wypełnianie tablicy
do {
for (int a = 0; a < uWiersze - 1; a++) {
for (int b = 0; b < uKolumny - 1; b++) {
tMiejsca[a][b] = '-';
if (a == X) {
nLogic = random(100, 0);
if (nLogic > 62) tMiejsca[a][b] = '1'; // bodyguard odrozniony
else if (nLogic > 79) tMiejsca[a][b] = 'X'; // sobowtĂłr
}
if (a == X && b == Y) tMiejsca[a][b] = 'X'; // target ofiara
// celowanie wskaĹşnikiem
if (bSpotter && Xreal == a && Yreal == b) {
tMiejsca[a][b] = '?'; // linia graw.
nLogic = random(2, 0);
switch (nLogic) {
case 1: tMiejsca[a-1][b] = '?';
case 2: tMiejsca[a+1][b] = '?';
}
nLogic = random(2, 0);
switch (nLogic) {
case 1: tMiejsca[a][b+1] = '?';
case 2: tMiejsca[a][b-1] = '?';
}
}
if (a == XC && b == YC && bCelowanie) tMiejsca[a][b] = '*'; // celownik
if (a == XC + uXWektor && b == YC + uYWektor && bStrzal) tMiejsca[a][b] = 'S'; // strzał spudłowany
}
}
// rysowanie tablicy
for (int i = 0; i < uWiersze - 1; i++) {
for (int j = 0; j < uKolumny - 1; j++) { cout << tMiejsca[i][j] << " "; }
cout << "\n";
}
if (!bStrzal) {
cout << "Target oznaczony. Bodyguardowie odseparowani.\nNamiary na target: w: " << X + 1 << " | k: " << Y + 1 << " ";
cout << "[wiatr!] [dystans!]\n";
cout << "[betatest] celuj w: " << Xreal + 1 << " | k: " << Yreal + 1 << "\n";
}
if (bStrzal) cout << "[S] - spudlowany strzal. So close!\n\n";
pause();
cin.sync();
// celowanie
if (bStrzal) bCelowanie = false;
if (uProby == 0 && !bStrzal) {
cout << "\nIndeks wiersza --> ";
cin >> XC;
--XC;
cout << "\nIndeks kolumny --> ";
cin >> YC;
--YC;
bCelowanie = true;
++uProby;
}
else if (uProby >= 1 && !bStrzal) {
cout << "Celowac ponownie czy strzelac? [cel/pal] --> ";
cin >> strKomenda;
if (strKomenda == "cel") {
cout << "\nIndeks wiersza --> ";
cin >> --XC;
cout << "\nIndeks kolumny --> ";
cin >> --YC;
bCelowanie = true;
}
else if (strKomenda == "pal") {
cout << "\nNie bedzie juz odwrotu. Rozumiesz? [tak/nie] --> ";
cin >> strKomenda;
if (strKomenda == "tak") {
YS = YC;
XS = XC;
bStrzal = true;
bCelowanie = true;
++uProby;
}
else if (strKomenda == "nie") bStrzal = false;
}
}
clear();
} while (bCelowanie);
// headshot czy pudło
if (XS == Xreal && YS == Yreal) {
cout << "\a\a\n\n\n\n\n---------------------\nHEAD SHOT!\n---------------------\n";
pause();
clear();
return success;
}
else if (bStrzal && XS != Xreal && YS != Yreal) {
cout << "\a\a\n\n\n\n\n---------------------\nPUDLO!\nStrzal niecelny. Target probuje uciekac.";
cout << " Wtapia sie w tlum bodyguardow.\n---------------------\n";
pause();
clear();
return crashed;
}
}
returned shooting(string strCel, string strWprowadzenie, unsigned uMinimalnaOdleglosc, unsigned uProbyDozwolone) {
unsigned uWiatr, uOdleglosc, uProby = 0;
string strWiatr, strKierunek;
quarter qKierunek;
returned rZabil = crashed;
cout << "STRZELANIE Z ODLEGLOSCI\n--------------\n\n";
cout << "Celem tego przedsiewziecia jest wyeliminowanie persony znanej jako...\n";
wait(2);
cout << strCel << ".\n\n";
wait(1);
pause();
clear();
cout << "Wprowadzenie do zadania:\n--------------\n\n" << strWprowadzenie << "\n\n";
pause();
cout << "- " << strImie << " sprawdza magazynek...\n";
wait(2);
cout << "- Zajmuje pozycje...\n";
wait(5);
cout << "- Pobieznie sprawdza wiatr i jego kierunek palcem...\n";
wait(3);
cout << "\n[WIATR: ";
// LOSOWANIE SIĹY WIATRU
uWiatr = random(3, 0);
switch (uWiatr) {
case 1: strWiatr = "Slaby"; break;
case 2: strWiatr = "Umiarkowany"; break;
case 3: strWiatr = "Silny"; break;
default: strWiatr = "Umiarkowany";
}
cout << strWiatr << "]\n";
wait(5);
cout << "\n[KIERUNEK: ";
// LOSOWANIE SIĹY WIATRU
nLogic = random(2, 0);
switch (nLogic) {
case 1: qKierunek = east; strKierunek = "Wschodni"; break;
case 2: qKierunek = west; strKierunek = "Zachodni"; break;
default: qKierunek = south; strKierunek = "Zachodni";
}
cout << strKierunek << "]\n";
wait(5);
cout << "\n- Ocenia odleglosc do celu.\n";
wait(3);
cout << "\n[DYSTANS: ";
// LOSOWANIE DYSTANSU
do {
uOdleglosc = random(500, 0);
} while (uOdleglosc < uMinimalnaOdleglosc);
cout << uOdleglosc << " m.]\n";
wait(5);
cout << "\n- " << strImie << " celuje...\n";
pause();
clear();
//--------celowanie--------------------------------
cout << "Target: " << strCel << "\n";
cout << "Odleglosc od celu: " << uOdleglosc << " m.\n";
cout << "Sila wiatru: " << strWiatr << " m/sek\n";
cout << "Kierunek wiatru: " << strKierunek << "\n\n";
cout << "[X] target [S] oddany strzal [I] inni ludzie [*] celownik [?] porada spottera\nPamietaj! Po oddaniu niecelnego strzalu ofiara";
cout << " wtopi sie w tlum!\n\n";
// pętla strzelania -------------------------------
switch (dTrudnosc) {
case master: uProbyDozwolone = 1; break;
case hard: uProbyDozwolone = 2; break;
case normal: uProbyDozwolone = 4; break;
case easy: uProbyDozwolone = 6; break;
default: uProbyDozwolone = 3;
}
pause();
rZabil = aim(uWiatr, qKierunek, uOdleglosc);
if (rZabil == success) return success;
else return crashed;
}
Adnotacje, o ile tego nie wywnioskowaliście z kodu:
- enum returned ma dwie wartości: success i crashed.
- quarter: west, north, south, east
- uWiatr: 1 - słaby, 2 - umiarkowany, 3 - silny
- random(int skala, int odejmij) zwraca losową liczbę po odjęciu od niej "odejmij".
- więcej info w zalinkowanym temacie na początku postu.