2015-05-16 3 views
0

Я пытаюсь создать игру с графикой, представленной в виде символов. Я работаю над классом, который предоставит карту. Я нахожусь в том месте, где программа успешно делает случайное количество комнат со случайным размещением, и теперь мне нужно сделать коридоры, которые соединят эти комнаты вместе.игра C++ rogue, создающая карту, нужна идея

Пожалуйста, имейте в виду, что я новичок в этом, и если мой код выглядит глупо, помните, что это все, что я мог сделать с теми знаниями, которые у меня есть :).

В принципе на данный момент, я не уверен, как подойти к проблеме создания комнат вместе с коридорами, и я мог бы действительно использовать идею.

Вот код, который я написал.

Примечание: randInt (int argument) - это просто функция, которую я использую где-то еще, и возвращает число от 0 до аргумента-1.

Dungeon.h файл --------------------

#ifndef DUNGEON_H 
#define DUNGEON_H 

#include <string> 
#include <iostream> 
#include <vector> 
#include "utilities.h" 
using namespace std; 



struct Room 
{ 
    int leftUpPosition_row; 
    int leftUpPosition_col; 
    int length; 
    int heigth; 
}; 



class Dungeon 
{ 

public: 
    Dungeon(); 
    ~Dungeon(); 
    void display(string msg) const; 
    void testDisplay(int whichOne) const; 

private: 
    vector<Room> m_rooms; 
    int m_numOfRooms; 
}; 

#endif 

Dungeon.cpp файл ----------- ---------

#include "Dungeon.h" 



    Dungeon::Dungeon() 
    { 

     m_numOfRooms=4+randInt(3); 
//Note that randInt(3) is just a function I use somewhere else and it returns 
//a number between 0 and argument-1. 


     cout<<"Max rooms is: "<<m_numOfRooms<<endl; 

     bool stop=false; 

     int roomsCreated=0; 

     for(int i=0;i<m_numOfRooms && stop==false ;i++) 
     { 

      m_rooms.push_back(Room()); 
      m_rooms[i].heigth=3+randInt(6); 
      m_rooms[i].length=6+randInt(13); 

      //Creating the first room 
      if(i==0) 
      { 
       m_rooms[i].leftUpPosition_row=1+randInt(16-m_rooms[i].heigth); 
       m_rooms[i].leftUpPosition_col=1+randInt(68-m_rooms[i].length); 

       roomsCreated++; 
      } 
      else //Creating the rooms that are not the first. 
      { 

       int attemptingToCreateRoom=0; 
       bool goodPos=false; 
       bool goon=true; 

       //////////////////////////////////////////////////////////////////////////////////////////////////////// 

       while(goodPos==false) 
       { 
        goon=true; 

        m_rooms[i].leftUpPosition_row=1+randInt(16-m_rooms[i].heigth); 
        m_rooms[i].leftUpPosition_col=1+randInt(68-m_rooms[i].length); 


        for(int k=0;k<roomsCreated && goon==true;) //Compares with created rooms to make sure that they do not overlap 

        { 

         if( (m_rooms[i].leftUpPosition_row + m_rooms[i].heigth) < (m_rooms[k].leftUpPosition_row) || (m_rooms[i].leftUpPosition_row) > (m_rooms[k].leftUpPosition_row+ m_rooms[k].heigth) || (m_rooms[i].leftUpPosition_col + m_rooms[i].length) < (m_rooms[k].leftUpPosition_col) || (m_rooms[i].leftUpPosition_col) > (m_rooms[k].leftUpPosition_col+ m_rooms[k].length)) 
         { 
          k++; 

         } 
         else 
         { 
          goon=false; 
         } 

        } 

        if(goon ==true) 
        { 
         roomsCreated++; 
         goodPos=true; 

        } 
        else 
        { 
         attemptingToCreateRoom++; 

         if(attemptingToCreateRoom ==100000) 
         { 
          m_rooms.pop_back(); 
          roomsCreated--; 
          i--; 
          stop=true; 
          break; 


         } 
        } 
       } 

       //////////////////////////////////////////////////////////////////////////////////////////////////////// 

      } 

      cout<<"Rooms Created So Far: "<<roomsCreated<<endl; 

     } 

     m_numOfRooms=roomsCreated; 

    } 



    void Dungeon::display(string msg) const 
    { 


     char grid[17][69]; 
     int r,c; 

     for (r = 0; r < 17; r++) 
      for (c = 0; c < 69; c++) 
      { 
       grid[r][c]='#'; 
      } 

      for(int i=0;i<m_numOfRooms;i++) 
      { 


       for (r =m_rooms[i].leftUpPosition_row ; r < m_rooms[i].leftUpPosition_row+m_rooms[i].heigth; r++) 
        for (c = m_rooms[i].leftUpPosition_col; c < m_rooms[i].leftUpPosition_col+m_rooms[i].length; c++) 
        { 
         grid[r][c]=' '; 
        } 



      } 

      ////////////////////////////////////////////////// 
      for(int i=0;i<m_numOfRooms;i++) 
      { 
       r =m_rooms[i].leftUpPosition_row; 
       c = m_rooms[i].leftUpPosition_col; 

       grid[r][c]=(char) i+49; 



      } 


      ///////////////////////////////////////////////// 


      for (r = 0; r < 17; r++) 
      { 
       for (c = 0; c < 69; c++) 
        cout << grid[r][c]; 
       cout << endl; 
      } 
      cout << endl; 

    } 

Вот как мой результат выглядит прямо сейчас

Here is how my output looks like right now Вот как завершена игра с коридорами будет выглядеть

Here is how completed program with corridors will look like

ответ

0

Что касается общей мошеннической разработки, вы должны действительно проверить RogueBasin, если вы еще этого не сделали. Там есть много ресурсов, чтобы вы указали в правильном направлении. Попробуйте это FAQ для начинающих - он затрагивает несколько вопросов о номерах, а также множество других тем.

Доступны библиотеки, которые делают рисунок экрана для вас, если вы хотите потратить свое время, сосредоточив внимание на других аспектах игры. Они немного абстрагируют экран, так что вы можете просто сказать, где вы хотите напечатать персонажа, и позволить им заботиться о вещах, таких как режимы консоли, управляющие символы и т. Д. Таким образом, вы можете сосредоточиться на том, что вы хотите распечатать, иметь дело с деталями низкого уровня.

На стороне Unix/Linux у меня было что-то вроде ncurses. В Windows не так много опций, но выглядит как PDCurses.

Смежные вопросы