Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Czołgi C++ kilka błędów w programie

Ostatnio zmodyfikowano 2011-06-12 14:29
Autor Wiadomość
JerrMan
Temat założony przez niniejszego użytkownika
Czołgi C++ kilka błędów w programie
» 2011-06-12 13:47:07
Witam to mój programik i nie wiem jak naprawić kilka błędów może ktoś mi pomoże.
http://www.przeklej.pl/plik/czolgi-v3-8-cpp-002ap53ed6jo
C/C++
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <dos.h>
#include <graphics.h>

// Deklaracje

int ile_druzyn = 0, ile_w_druzynie = 0, sila_wiatr = 0, wiatr_mod = 3, martwi = 0, druzyny[ 8 ];

void inicjuj_ekran(), wybuch( int x, int y, int promien ),
po_wybuchu( int x, int y, int promien ), wiatr();

/* OBIEKT UZBROJENIE */

struct uzbrojenie {
    int g, wiatr, opoznienie, promien, amunicja;
    char * nazwa;
    void pokaz_uzbrojenie();
    uzbrojenie();
};


uzbrojenie::uzbrojenie() {
    g = wiatr = opoznienie = promien = amunicja = 0;
    nazwa = "";
}


void uzbrojenie::pokaz_uzbrojenie() {
    char buf[ 50 ];
    setfillstyle( 1, 0 ); bar( 275, 461, 550, 480 );
    if( amunicja > 0 ) sprintf( buf, "%-20s %3d amunicji", nazwa, amunicja );
    else sprintf( buf, "%-20s", nazwa );
   
    outtextxy( 275, 465, buf );
}

/* OBIEKT CZOLG */

struct czolg {
    int x, y, kolor, zywy, sila, kat, bron, zdrowie, druzyna, numer, paliwo;
    uzbrojenie bronie[ 5 ];
    void rysuj(), celowanie(), strzal(), osadz(), pokaz_zdrowie(), pokaz_ksp(),
    rusz_lewo(), rusz_prawo();
    int sprawdz();
    czolg();
} gracze[ 8 ][ 4 ];


czolg::czolg() {
    x = rand() % 600 + 20; y = 1; zywy = 1; paliwo = 100;
    sila = 500; kat = 0; zdrowie = 100; bron = 0;
   
    bronie[ 0 ].g = 10;
    bronie[ 0 ].promien = 25;
    bronie[ 0 ].wiatr = 1;
    bronie[ 0 ].opoznienie = 50;
    bronie[ 0 ].nazwa = "POCISK ARTYLERYJSKI";
    bronie[ 0 ].amunicja = - 1;
   
    bronie[ 1 ].g = 0;
    bronie[ 1 ].promien = 10;
    bronie[ 1 ].wiatr = 0;
    bronie[ 1 ].opoznienie = 10;
    bronie[ 1 ].nazwa = "LASER";
    bronie[ 1 ].amunicja = 100;
   
    bronie[ 2 ].g = - 10;
    bronie[ 2 ].promien = 25;
    bronie[ 2 ].wiatr = 1;
    bronie[ 2 ].opoznienie = 50;
    bronie[ 2 ].nazwa = "LUKOWKA";
    bronie[ 2 ].amunicja = 20;
   
    bronie[ 3 ].g = 70;
    bronie[ 3 ].promien = 50;
    bronie[ 3 ].wiatr = 0.5;
    bronie[ 3 ].opoznienie = 75;
    bronie[ 3 ].nazwa = "BOMBA BALISTYCZNA";
    bronie[ 3 ].amunicja = 1;
   
    bronie[ 4 ].g = rand() % 50;
    bronie[ 4 ].promien = rand() % 100;
    bronie[ 4 ].wiatr = rand() % 5;
    bronie[ 4 ].opoznienie = 50;
    bronie[ 4 ].nazwa = "SZALONA LUSKA";
    bronie[ 4 ].amunicja = 1;
}


void czolg::celowanie() {
    char a = 0;
    void far * ekran[ 961 ];
    setcolor( kolor );
   
    if( bronie[ bron ].amunicja == 0 ) bron = 0;
   
    setfillstyle( 1, kolor ); fillellipse( 30 + druzyna * 50, numer * 9 + 3, 2, 2 );
    wiatr();
    getimage( x - 13, y - 13, x + 17, y + 17, ekran );
    while( kbhit() ) getch();
   
    while( a != 27 ) {
        putimage( x - 13, y - 13, ekran, 0 );
        setfillstyle( 1, 0 ); setcolor( kolor );
       
        bronie[ bron ].pokaz_uzbrojenie(); pokaz_ksp();
        line( x + 2, y + 2, x + 2 + cos( kat / 57.3 ) * 9, y + 2 - sin( kat / 57.3 ) * 9 );
        circle( x + 2, y + 2, 15 );
       
        a = getch();
        switch( a ) {
        case 120: if( --kat < 0 ) kat = 359; break;
        case 122: if( ++kat > 360 ) kat = 0; break;
        case 97: if( --sila < 100 ) sila = 999; break;
        case 115: if( ++sila > 999 ) sila = 100; break;
        case 88: kat -= 10; if( kat < 0 ) kat = 360; break;
        case 90: kat += 10; if( kat > 359 ) kat = 0; break;
        case 65: sila -= 10; if( sila < 100 ) sila = 999; break;
        case 83: sila += 10; if( sila > 999 ) sila = 100; break;
        case 113: if( --bron < 0 ) bron = 4; if( bronie[ bron ].amunicja == 0 ) ungetch( a ); break;
        case 119: if( ++bron > 4 ) bron = 0; if( bronie[ bron ].amunicja == 0 ) ungetch( a ); break;
        case 101: putimage( x - 13, y - 13, ekran, 0 ); return;
        case 75: putimage( x - 13, y - 13, ekran, 0 ); rusz_lewo();
            getimage( x - 13, y - 13, x + 17, y + 17, ekran ); break;
        case 77: putimage( x - 13, y - 13, ekran, 0 ); rusz_prawo();
            getimage( x - 13, y - 13, x + 17, y + 17, ekran ); break;
        case 68: zdrowie = 0; return;
        case 13: putimage( x - 13, y - 13, ekran, 0 ); bronie[ bron ].amunicja--; strzal(); return;
           
        case 80: wiatr_mod = 50; break;
        }
    }
    closegraph(); exit( 0 );
}


void czolg::strzal() {
    float poc_x, poc_y, sila_pion, sila_poziom;
    bar( 0, 0, 639, 50 );
    sila_poziom = cos( kat / 57.3 ) * sila;
    sila_pion = sin( kat / 57.3 ) * sila;
    poc_x = x + 2; poc_y = y - 3;
   
    while( poc_y < 460 ) {
        sound( floor( poc_y * 20 ) );
        setcolor( 0 ); setfillstyle( 1, 0 ); fillellipse( floor( poc_x ), floor( poc_y ), 2, 2 );
        poc_x +=( sila_poziom + bronie[ bron ].wiatr * sila_wiatr ) / 100; poc_y -= sila_pion / 100;
        if( poc_x <= 1 || poc_x >= 638 ||( bronie[ bron ].g <= 0 && poc_y < 0 ) )
        { nosound(); return; }
        if( poc_y > 460 ) { poc_y = 460; }
        if(( getpixel( floor( poc_x ), floor( poc_y ) ) == 0
        && getpixel( floor( poc_x + 1 ), floor( poc_y + 1 ) ) == 0
        && getpixel( floor( poc_x + 1 ), floor( poc_y - 1 ) ) == 0
        && getpixel( floor( poc_x - 1 ), floor( poc_y + 1 ) ) == 0
        && getpixel( floor( poc_x - 1 ), floor( poc_y - 1 ) ) == 0 )
        ||( getpixel( floor( poc_x ), floor( poc_y ) ) == kolor
        || getpixel( floor( poc_x + 1 ), floor( poc_y + 1 ) ) == kolor
        || getpixel( floor( poc_x + 1 ), floor( poc_y - 1 ) ) == kolor
        || getpixel( floor( poc_x - 1 ), floor( poc_y + 1 ) ) == kolor
        || getpixel( floor( poc_x - 1 ), floor( poc_y - 1 ) ) == kolor ) ) {
            setfillstyle( 1, kolor ); fillellipse( floor( poc_x ), floor( poc_y ), 2, 2 );
        }
        else { break; }
        sila_pion -= bronie[ bron ].g;
        delay( bronie[ bron ].opoznienie );
        wiatr();
    }
    setcolor( 0 ); setfillstyle( 1, 0 );
    wybuch( floor( poc_x ), floor( poc_y ), bronie[ bron ].promien );
    po_wybuchu( floor( poc_x ), floor( poc_y ), bronie[ bron ].promien );
   
    return;
}


void czolg::pokaz_zdrowie() {
    char buf[ 10 ];
    setfillstyle( 1, 0 ); bar( druzyna * 50, numer * 9, druzyna * 50 + 39, numer * 9 + 8 );
    if( zdrowie > 0 ) setcolor( kolor ); else setcolor( 0 );
    sprintf( buf, "%3d", zdrowie );
    outtextxy( druzyna * 50, numer * 9, buf );
}


void czolg::pokaz_ksp() {
    char buf[ 50 ];
    bar( 0, 461, 274, 480 );
    sprintf( buf, "Sila: %3d  Kat: %3d  Paliwo: %3d", sila, kat, paliwo );
    outtextxy( 1, 465, buf );
}


int czolg::sprawdz() {
    if( zywy == 1 )
    if( zdrowie <= 0 ) {
        zywy = 0;
        osadz();
        wybuch( x, y, 50 );
        po_wybuchu( x, y, 50 );
        setfillstyle( 1, 0 );
        bar( x, y, x + 4, y + 4 );
        if( --druzyny[ druzyna ] <= 0 ) martwi++;
       
        return 1;
    }
    else {
        rysuj();
        return 0;
    }
}


void czolg::rusz_lewo() {
    if( getpixel( x - 1, y + 2 ) != 6 &&( getpixel( x - 1, y + 20 ) == 6 || y > 435 ) && paliwo > 0 )
    { bar( x, y, x + 4, y + 4 ); x--; paliwo--; osadz(); rysuj(); }
}


void czolg::rusz_prawo() {
    if( getpixel( x + 5, y + 2 ) != 6 &&( getpixel( x + 5, y + 20 ) == 6 || y > 435 ) && paliwo > 0 )
    { bar( x, y, x + 4, y + 4 ); x++; paliwo--; osadz(); rysuj(); }
}


void czolg::rysuj() {
    setfillstyle( 1, 0 );
    bar( x, y, x + 4, y + 4 );
    osadz(); setfillstyle( 1, kolor );
    bar( x, y, x + 4, y + 4 );
}


void czolg::osadz() {
    int k = y - 5;
    while( getpixel( x, k + 5 ) == 0 && getpixel( x + 4, k + 5 ) == 0 && k < 455 ) { k++; }
    y = k;
}


/* GLOWNY PROGRAM */


int main() {
    srand(( unsigned ) time( 0 ) );
    int graphdriver = 9, graphmode = 2, i, j, k, l;
   
    // ekran tytulowy i zczytanie liczby graczy
   
    system( "cls" );
    printf( "  Czolgi v3.8 rel 1.4.2002\n"
    "  Copyright (c) Juliusz \"JuLLaSS\" Sompolski `2002\n"
    "  Magic Mushroom Laboratories 1998-2002 (r) All Rights Reserved\n\n"
    "  Sterowanie: \'z\' i \'x\' - zmiana kata\n"
    "              \'a\' i \'s\' - zmiana sily\n"
    "              \'q\' i \'w\' - zmiana broni\n"
    "              lewo i prawo - poruszanie sie\n"
    "              \'e\' - opuszczenie kolejki\n"
    "              \'D\' - samobojstwo\n"
    "              ENTER - strzal\n"
    "              ESCAPE - wyjscie\n\n"
    "  Podaj liczbe druzyn (od 2 do 7): " );
    scanf( " %d", & ile_druzyn );
    if( ile_druzyn < 2 ) ile_druzyn = 2; if( ile_druzyn > 7 ) ile_druzyn = 7;
    printf( "  Podaj liczbe czolgow w druzynie (od 1 do 4): " );
    scanf( " %d", & ile_w_druzynie );
    if( ile_w_druzynie < 1 ) ile_w_druzynie = 1; if( ile_w_druzynie > 4 ) ile_w_druzynie = 4;
   
    // inicjacja trybu graficznego
   
    initgraph( & graphdriver, & graphmode, "" );
   
    // inicjacja terenu rozgrywki
   
    inicjuj_ekran();
   
    // inicjacja niektorych wlasciwosci czolgu
   
    for( i = 0; i <= ile_druzyn - 1; i++ ) {
        druzyny[ i ] = ile_w_druzynie;
        for( j = 0; j <= ile_w_druzynie - 1; j++ ) {
            gracze[ i ][ j ].kolor = i + 9; gracze[ i ][ j ].druzyna = i; gracze[ i ][ j ].rysuj();
            gracze[ i ][ j ].numer = j;
        }
    }
   
    // glowna rozgrywka
    while( martwi < ile_druzyn - 1 )
    for( i = 0; i < ile_w_druzynie; i++ )
    for( j = 0; j < ile_druzyn; j++ ) {
        for( k = 0; k < ile_druzyn; k++ )
             for( l = 0; l < ile_w_druzynie; l++ ) {
            gracze[ k ][ l ].pokaz_zdrowie(); if( gracze[ k ][ l ].sprawdz() == 1 ) { k = - 1; l = - 1; }
        }
        if( gracze[ j ][ i ].zywy == 1 && martwi < ile_druzyn - 1 ) gracze[ j ][ i ].celowanie();
       
    }
   
   
    // oblesny wybuch i koniec
   
    wybuch( 320, 240, 320 );
    while( !kbhit() ); closegraph(); return( 0 );
}



/* Procedura wybuch() - Graficzny efekt wybuchu */

void wybuch( int x, int y, int promien ) {
    int i, freq = 500;
    setcolor( 12 ); setfillstyle( 1, 12 );
    for( i = 0; i < promien; i++ ) { fillellipse( x, y, i, i );
        sound( 1000 + freq ); freq =- freq;
        delay( 5 ); }
    setcolor( 0 ); setfillstyle( 0, 12 );
    for( i = 0; i < promien; i++ ) { fillellipse( x, y, i, i );
        sound( 500 + freq ); freq =- freq;
        delay( 5 ); }
    nosound();
}


/* Procedura po_wybuchu() - Obliczanie obrazen zadanych wybuchem */

void po_wybuchu( int x, int y, int promien ) {
    int i, j;
    long double a;
    for( i = 0; i < ile_druzyn; i++ ) {
        for( j = 0; j < ile_w_druzynie; j++ ) {
            a = sqrt( pow( x + 2 - gracze[ i ][ j ].x, 2 ) + pow( y + 2 - gracze[ i ][ j ].y, 2 ) );
            if( a <= promien ) gracze[ i ][ j ].zdrowie -= promien - floor( a );
           
        }
    }
}


/* Procedura wiatr() - generowanie wiatru */

void wiatr() {
    char buf[ 20 ];
    sila_wiatr += rand() % wiatr_mod - wiatr_mod / 2;
    sprintf( buf, "Wiatr: %3d", sila_wiatr );
    setfillstyle( 1, 0 ); bar( 550, 461, 640, 480 );
    setcolor( 15 ); outtextxy( 550, 465, buf );
}


/* Procedura inicjuj_ekran() - losowa generacja terenu rozgrywek */

void inicjuj_ekran() {
   
    int x, y, zostalo = 0, dy;
    setcolor( 6 );
    y = 350;
   
    for( x = 0; x <= 640; x++ ) {
        if( zostalo <= 0 ) { dy = rand() % 8 - 3; zostalo = rand() % 20 + 5; }
        y += dy; if( y <= 70 ) { y = 70; } if( y >= 400 ) { y = 400; }
        line( x, y, x, 460 );
       
        zostalo--;
    }
}
moje błędy to:
79 C:\Users\Jerry\Desktop\czolgi_v3.8\czolgi_v3.8.cpp [Warning] converting to `int' from `double'

kilkanaście razy w różnych linijkach 110,149,154-164,172,173:
110 C:\Users\Jerry\Desktop\czolgi_v3.8\czolgi_v3.8.cpp [Warning] passing `double' for converting 3 of `void line(int, int, int, int)'

2 razy powtarzający się 148,152 oraz 314,320:
148 C:\Users\Jerry\Desktop\czolgi_v3.8\czolgi_v3.8.cpp `sound' undeclared (first use this function)
152 C:\Users\Jerry\Desktop\czolgi_v3.8\czolgi_v3.8.cpp `nosound' undeclared (first use this function)

332 C:\Users\Jerry\Desktop\czolgi_v3.8\czolgi_v3.8.cpp [Warning] converting to `int' from `double'
Proszę o szybką odpowiedz. Z góry dziękuje.
P-34060
DejaVu
» 2011-06-12 14:16:16
148 C:\Users\Jerry\Desktop\czolgi_v3.8\czolgi_v3.8.cpp `sound' undeclared (first use this function)
152 C:\Users\Jerry\Desktop\czolgi_v3.8\czolgi_v3.8.cpp `nosound' undeclared (first use this function)
Jak rozumiesz ten błąd?
P-34063
JerrMan
Temat założony przez niniejszego użytkownika
» 2011-06-12 14:19:03
ten tak raczej, ale poprzednich nie. Zapomniałem uwzględnić funkcji sound już go naprawiłem.
P-34064
DejaVu
» 2011-06-12 14:29:24
Poprzednie to są warningi - np. że rzutujesz z typu double do typu float, więc grozi utratą danych. Takie rzeczy w C++ rzutuje się jawnie by w kodzie rzucało się w oczy i informując kompilator tym samym, że robisz taką operację świadomie. Innymi słowy:
C/C++
static_cast < float >( zmienna_typu_double )
/edit:
W Twoim przypadku rzutowanie odbywa się z typu double do typu int więc zostaną utracone dane w najlepszym wypadku tylko po przecinku.
P-34067
« 1 »
  Strona 1 z 1