2016-11-30 9 views
0

私は、ncursesライブラリを使って、C++用のゲームを作成しようとしていました。多くの異なるチュートリアルに続いて、Playerキャラクター、マップ、プレイヤーが壁を通過するのを防ぐコード、モンスターキャラクターのランダムな動きを作成することができます。ncursesライブラリを使ってMonsterと対話する方法

私が遭遇する次の問題は、ブーリアンを実装することです。プレイヤーキャラクターがモンスターキャラクターとやりとりするたびに、ゲームは終了します(ロゲカのゲームによく似ています)。しかし、私はそれが私が望むように機能するように見えることはできません。私はそれがプレイヤーとモンスターのために設定した座標と関係があると思いますが、私はまだ分かりません。誰でも私を助けてくれますか?ここで

は、コードは次のとおりです。

#include <iostream> 
#include <ncurses.h> 

#define MAP_WIDTH 22 
#define MAP_HEIGHT 15 

#define TILE_FLOOR 0 
#define TILE_WALL 1 

int PlayerX, PlayerY; 

void erase (int y, int x) { 
    mvaddch(y, x, '.'); 
} 

int nMapArray[MAP_HEIGHT][MAP_WIDTH] = { 
    { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 
    { 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 }, 
    { 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 }, 
    { 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 }, 
    { 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 }, 
    { 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1 }, 
    { 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, 
    { 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, 
    { 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, 
    { 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, 
    { 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, 
    { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1 }, 
    { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1 }, 
    { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1 }, 
    { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } 
}; 

bool IsPassable (int nMapX, int nMapY) {   //prevents from walking into walls 

    if (nMapX < 0 || nMapX >= MAP_WIDTH || nMapY < 0 || nMapY >= MAP_HEIGHT) 
     return false; 

    int nTileValue = nMapArray[nMapY][nMapX]; 

    if(nTileValue == TILE_FLOOR) { 
     return true; 
    } 

    return false; 
} 

class Monster { 
public: 
    void Appearance(char monster) { 
     this->Monster = monster; 
    } 

    void SetPos(int x, int y) { 
     this->PosX = x; 
     this->PosY = y; 
    } 

    void Movement(int &MonsX, int &MonsY) { 
     int x = (rand() % 3 - 1); 
     int y = (rand() % 3 - 1); 

     if (IsPassable(this->PosX+x, this->PosY+y)) { 
      erase(PosY, PosX); 
      MonsX = this->PosX += x; 
      mvaddch(this->PosY, MonsX, this->Monster); 
      refresh(); 

      erase(PosY, PosX); 
      MonsY = this->PosY += y; 
      mvaddch(MonsY, this->PosX, this->Monster); 
      refresh(); 
     } 
    } 


protected: 
    int PosX; 
    int PosY; 
    char Monster; 
}; 

bool MonsterContact (int nMapY, int nMapX, int x, int y) { 


    if (nMapArray[nMapY][nMapX] == nMapArray[y][x]) { 
     return true; 
    } 

    return false; 
} 

void map() { 
    for (int y = 0; y < MAP_HEIGHT; y++) {   //loops to print the map 

     move(y,0); 

     for (int x = 0; x < MAP_WIDTH; x++) { 
      switch (nMapArray[y][x]) { 
       case TILE_FLOOR: 
        printw("."); 
        break; 

       case TILE_WALL: 
        printw("#"); 
        break; 
      } 
     } 
    } 
}; 

void init() {    //starts the ncurses screen. 
    initscr(); 
    clear(); 
    noecho(); 
    raw(); 
    keypad(stdscr, TRUE); 
    curs_set(0); 
} 

void game_loop (char Player, int row, int col, int ch) { 

    Monster npc; 
    npc.SetPos(7, 8); 
    npc.Appearance('g'); 
    int MonsX,MonsY; 

    mvaddch(row,col, Player);     //player movement 
    refresh(); 

    while(true) { 

     npc.Movement(MonsX, MonsY); 

     ch = getch(); 

     switch (ch) { 

      case 'w': 
       if (IsPassable(col, row-1)) { 
       erase(row,col); 
       row = row - 1; 
       mvaddch(row, col, Player); 
        refresh(); 
       } 

       if (MonsterContact(col, row, MonsX, MonsY)) { 
        return(); 
       } 
       break; 

      case 's': 
       if (IsPassable(col, row+1)) { 
       erase(row, col); 
       row = row + 1; 
       mvaddch(row, col, Player); 
        refresh(); 
       } 

       if (MonsterContact(col, row, MonsX, MonsY)) { 
        return(); 
       } 

       break; 

      case 'a': 
       if (IsPassable(col-1, row)) { 
       erase(row,col); 
       col = col - 1; 
       mvaddch(row, col, Player); 
        refresh(); 
       } 

       if (MonsterContact(col, row, MonsX, MonsY)) { 
        return(); 
       } 

       break; 

      case 'd': 
       if (IsPassable(col+1, row)) { 
       erase(row,col); 
       col = col + 1; 
       mvaddch(row,col, Player); 
        refresh(); 
       } 

       if (MonsterContact(col, row, MonsX, MonsY)) { 
        return(); 
       } 

       break; 

      case 'q': 
       return; 

      default: 
       break; 
     } 

    } 
} 

int main(int argc, const char * argv[]) { 

    PlayerX = 2, PlayerY = 1;  //Player initial position. 
    char Player = '@'; 

    init();      //starts the ncurses screen. 

    printw("Press any key to start the game"); 
    int ch = getch(); 
    clear(); 

    map(); 
    game_loop(Player, PlayerY, PlayerX, ch); 

    endwin(); 

    return 0; 
} 
+0

'MonsterContact'は' mapx'の前に 'mapy'を取ってパラメータを定義していましたが、' IsPassable'は 'mapy'の前に' mapx'をとりますが、 'col'と' row'を同じ順序で渡します。これが原因の可能性があります。このような混乱を回避できるように、すべての関数を同じ順序で(おそらくncursesが受け取る順序に合わせて)取るように、実際には注意しなければなりません。 – jonhopkins

答えて

1

私がコメントしジョン・ホプキンズ何まとめるます。

これは本質的に不一致の結果です。あなたのコードは、さまざまな関数で異なる順序で引数を渡します(isPassableではy、次にyはMonsterContact)。同じものには異なる名前が使用されます(行とxは同じです)。

問題は次のとおりです。あなたがrow, colを渡すべきときに、あなたがMonsterContactにcol, rowを渡したという事実によって引き起こされます。おそらく、引数の順序が逆順になっていることを忘れて、少し前にisPassableと書かれたときから、引数の順序を無意識にコピーしたでしょう。または、あなたは間違って、colがyを意味し、rowがxを意味すると誤って考えました。

可能な限りコードを一貫性のあるものにしておくことを忘れないでください。将来的には、この種の間違いを避けることができます。

関連する問題