2009-05-03 2 views
0

私はこのコードを作成しました。矢印を画面から離れるまでエラーを表示しません(つまり、(* I) - > x> maxx)。その後Oがランダムにテレポートします。私はランダムではないと推測していますが、パターンを見つけることを試みています)。なぜこのプログラムでxの値が変わるのですか?

EDIT:上に移動するとランダムなテレポートは起こらないように見えますが、下に移動すると、Oはテレポートに直接テレポートされます。また、Oが '>'になるところで不具合が発生しました。 (どのように起こっているのか把握しようとしています)

EDIT:画面の右下にOがある場合、 '>'グリッチが発生します(player.x = 9; player.y = 9 )、シーケンス「wqs」が入力されます。

EDIT:私は、エラーが_move()内にあり、check()がかなり確実であるため、クラス宣言を削除しました。

EDIT:グリッチが「WQ」が入力されると、その後、他の文字が入力されて発生するように見える変換(すなわち「skiping」次の一手)

EDIT:player.x = 9 tranformグリッチが発生します; player.y = 8;そしてその後、Q '' が押され、プレイヤが '>'

にtranforms次の動きは、これはコードである:

#include<vector> 
#include<iostream> 
#include<string> 
using namespace std; 
const int maxx = 10, maxy = 10; //two constants that show the size of the sector 
char sector[maxx][maxy]; //array of characters used to display the sector 
prgm player(0, 0, 'O'); //player definition at x0,y0,and displayed with 'O' 
const int vsize = 1; //size of the enemy array (ie: how many enemies there will be 
X1 a(9, 5, 'X', 10); //enemy "a", has a move function that moves it back and forth 
virus * viral_data[vsize] = {&a}; //array of enemies used to set the sector 
vector<antivirus*> antiviral_data; //vector of pointers to "antivirus" the weapon used 
vector<antivirus*>::iterator I; //iterator for previous vector 

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

void p_move() //function to get players input, then move the player or create "antivirus" 
{ 
    char dir; 
    cin>>dir; 
    switch(dir) 
    { 
    case 'w': 
     player.y--; 
     break; 
    case 'a': 
     player.x--; 
     break; 
    case 's': 
     player.y++; 
     break; 
    case 'd': 
     player.x++; 
     break; 
    case 'q': 
     antiviral_data.push_back(new aX1(player.x, player.y, '>')); //creates a new aX1 at the players position 
     break; 
    } 
    return; 
} 

void v_move() //uses the enemies move 
{ 
    for(int i = 0; i < vsize; i++) 
    { 
     viral_data[i]->move(); 
    } 
    return; 
} 

void a_move() //uses the weapon (ie: moves the weapon forward) 
{ 
    for(I = antiviral_data.begin(); I < antiviral_data.end(); I++) 
    { 
     (*I)->move(); 
    } 
    return; 
} 

void set() //sets the sector array (char) 
{ 
    for(int i = 0; i < maxy; i++) 
    { 
     for(int j = 0; j < maxx; j++) 
     { 
      sector[j][i] = ' '; makes the entire sector blank 
     } 
    } 
    sector[player.x][player.y]=player.sym; //sets the sector at the player's position to 'O' 
    for(int i = 0; i < vsize; i++) 
    { 
     sector[viral_data[i]->x][viral_data[i]->y] = viral_data[i]->sym; //sets the sector at each enemy's position to be 'X' 
    } 
    for(I = antiviral_data.begin(); I < antiviral_data.end(); I++) 
    { 
     sector[(*I)->x][(*I)->y] = (*I)->sym; //sets the sector at each weapon's position to be '>' 
    } 
    return; 
} 

void check() //prevents the player from moving off the screen, erases bullet if it moves of the screen (to prevent access to non-allocated memory) 
{ 
    if(player.x < 0) 
    { 
     player.x = 0; 
    } 
    if(player.y < 0) 
    { 
     player.y = 0; 
    } 
    if(player.x > (maxx-1)) 
    { 
     player.x = (maxx-1); 
    } 
    if(player.y > (maxy-1)) 
    { 
     player.y = (maxy-1); 
    } 
    //PROBLEM APPEARS TO OCCUR HERE 
    for(I = antiviral_data.begin(); I! = antiviral_data.end();) 
    { 
     if((*I)->x > maxx) 
     { 
      I = antiviral_data.erase(I); 
     } 
     else 
     { 
      I++; 
     } 
    } 
    //*-*-*-*-*-*-*-*-*-*-*-*-*-*-* 

    return; 
} 
int main() 
{ 
    while(true) 
    { 
     set(); //set sector 
     display(); //display sector 
     p_move(); //player's move 
     v_move(); //enemy's move 
     a_move(); //bullet's move 
     check();//check moves 
    } 
    return 0; 
} 
+0

トークン間の空白がないと、コードを読みにくくなります。 – tpdi

+1

問題をプログラムの特定の部分に分離し、そのコードを投稿してください。また、なぜそれはコミュニティウィキですか? – Naveen

+1

そして、グローバルの使用は、変数の型を決定するためにあらゆる種類のスクロールアップとスクロールを意味します。あなたが解析した文字ごとにコンパイラに支払っているようなものではありません。 – tpdi

答えて

6

チェックにおいて()、テスト

((*I)->x > maxx) 

べきbe

((*I)->x >= maxx) 

です。これは、スクリーンから1つの四角形を取り除くことを可能にするオフ・バイ・ワンのエラーです。表示ルーチンがそれを表示しようとすると、Xの表示シンボルが壊れます。

+1

あなたはコードを耕して彼を助ける親切な魂です。 – DOK