Domanda

Ho creato un codice in C ++ che dovrebbe mostrare una O e una X, e puoi spostare la O con w / a / s / d e la X si sposta casualmente. Si compila bene, ma quando lo eseguo, c'è una O, ma nessuna X. Metto qui il codice sorgente:

#include <iostream>
using namespace std;

//program class: defines player, enemies and powerups
#include<stdlib.h>
#include<time.h>
class prgm
{
    friend void set_pos(prgm*const nprgm,int px,int py){nprgm->x=px;nprgm->y=py;}
    friend void set_pos(prgm*const nprgm,int px,int py,int php){nprgm->x=px;nprgm->y=py;nprgm->hp=php;}
    friend void set_pos(prgm*const nprgm,int px,int py,int php,char psym){nprgm->x=px;nprgm->y=py;nprgm->hp=php;nprgm->sym=psym;}
protected:
    int x; //x-position
    int y; //y-position
    int hp; //health
    char sym; //single-character representation
public:
    prgm(){sym=' ';}
    prgm(int px,int py,int php,char psym):x(px),y(py),hp(php),sym(psym){};
    const int xpos(){return x;}
    const int ypos(){return y;}
    const char rsym(){return sym;}
    void up(int n){y-=n;} //move program up
    void left(int n){x-=n;} //move program left
    void down(int n){y+=n;} //move program down
    void right(int n){x+=n;} //move program right
    void mutate(char nsym){sym=nsym;} //change program's symbol
    void harm(int dam){hp-=dam;}
    void heal(int dam){hp+=dam;}
    prgm &prgm::operator=(const prgm&nprgm){x=nprgm.x;y=nprgm.y;hp=nprgm.hp;sym=nprgm.sym;}
};

//null program
prgm null();

//abstract enemy class for individual ai of each enemy
class enemy:public prgm
{
public:
    void move(){}; //what enemy will do during its move
};

prgm player(0,0,0,'O');

void pmove()
{
    char move;
    cin>>move;
    switch(move)
    {
    case 'w':
        player.up(1);
        break;
    case 'a':
        player.left(1);
        break;
    case 's':
        player.down(1);
        break;
    case 'd':
        player.right(1);
        break;
    case 'q':
        exit(0);
        break;
    }
    return;
}

//the X1 Virus Component, the simplest version of Virus X: moves in random directions, harms on contact.
class X1:public enemy
{
    static const char sym='X';
public:
    X1(){}
    X1(int px,int py){x=px;y=py;}
    void move();
};
void X1::move()
{
    srand(time(0));
    int dir=(rand()%2);
    int dis=(rand()%3)-1;
    while(dis=0)
    {
        dis=(rand()%3)-1;
    }
    if(dir=0)
    {
        y+=dis;
    }
    if(dir=1)
    {
        x+=dis;
    }
    return;
}

//sector 1
const int maxx=10; //length of sector
const int maxy=10; //height of sector
char sector[maxx][maxy];  //sector declaration
const int rsize=4;
prgm reactive_items[rsize];//array of powerups
X1 a(4,4);  //enemy(ies)
const int vsize=1;
X1 viruses[vsize]={a}; //array of enemies
int px=0,py=0,php=1;  //players position and hp

//function zeros-out the sector
void clear_sect()
{
    for(int i=0;i<maxy;i++)
    {
        for(int j=0;j<maxx;j++)
        {
            sector[j][i]=' ';
        }
    }
}

//function sets all the enemies/powerups/player in the sector
void set_sect()
{
    for(int i=0;i<rsize;i++)
    {
        int*tx=new int(reactive_items[i].xpos());
        int*ty=new int(reactive_items[i].ypos());
        char*ts=new char(reactive_items[i].rsym());
        sector[*tx][*ty]=*ts;
        delete tx;
        delete ty;
        delete ts;
    }
    for(int j=0;j<vsize;j++)
    {
        int*tx=new int(viruses[j].xpos());
        int*ty=new int(viruses[j].ypos());
        char*ts=new char(viruses[j].rsym());
        sector[*tx][*ty]=*ts;
        delete tx;
        delete ty;
        delete ts;
    }
    int*tx=new int(player.xpos());
    int*ty=new int(player.ypos());
    char*ts=new char(player.rsym());
    sector[*tx][*ty]=*ts;
    delete tx;
    delete ty;
    delete ts;
}

//function displays sector
void display_sect()
{
    for(int i=0;i<maxy;i++)
    {
        for(int j=0;j<maxx;j++)
        {
            cout<<sector[j][i];
        }
        cout<<endl;
    }
    return;
}

void vmove()
{
    for(int i=0;i<vsize;i++)
    {
        viruses[i].move();
    }
    return;
}


int main()
{
    //load the sector # from the .txt, load the sector
    set_pos(&player,px,py,php); //set the players x and y values
    while(true){//while the player is on this sector
    clear_sect();//clear the sector map
    set_sect();//use the set function
    display_sect();//use the display function
    pmove();//players move
    vmove();//enemy-ai move
    //check board; relocate whats needed, initiate powerups, etc.
    }//end of while
    //when player wins sector
    //write current sector to a .txt
    //load program: restart this/story program/APHQ
    return 0;
}

So che è lungo e piuttosto contorto, (erano in origine file .h separati, ma li ho messi insieme in modo da poter vedere tutto il codice in una volta) ma ho davvero bisogno di una risposta. Grazie

È stato utile?

Soluzione

Il costruttore predefinito su prgm () imposta il membro sym su ''. Il campo char const statico non sovrascrive il membro sym di base, quindi il carattere utilizzato è probabilmente ''.

Il costruttore nemico dovrebbe effettivamente chiamare il costruttore di base (int, int, int, char) per impostare il membro sym.

Altri suggerimenti

Controlla la tua classe X1 . Dichiara un carattere const statico costante mentre eredita una variabile membro carattere protetto protetto dalla classe pgrm . La funzione display_sect utilizza il metodo prgm rsym () , che restituisce la variabile membro, non il membro statico .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top