275 lines
6.0 KiB
C++
275 lines
6.0 KiB
C++
|
|
#include "../../include/ship/Map.h"
|
||
|
|
|
||
|
|
#include <iostream>
|
||
|
|
|
||
|
|
Map::Map()
|
||
|
|
{
|
||
|
|
resetMap();
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
* Algorithm: Resets positions of player, NPCs, and rooms and clears map_data_
|
||
|
|
* Set Player position coordinates to 0
|
||
|
|
* Set npc_count_ to false
|
||
|
|
* Set room_count_ to 0
|
||
|
|
* loop i from 0 to max_npcs_
|
||
|
|
* Set row and col of location to -1
|
||
|
|
* loop i from 0 to max_rooms
|
||
|
|
* Set row and col of room location to -1
|
||
|
|
* loop i from 0 to num_rows_
|
||
|
|
* loop j from 0 to num_cols_
|
||
|
|
* Set (i,j) location on map_data_ to '-'
|
||
|
|
* Parameters: none
|
||
|
|
* Return: nothing (void)
|
||
|
|
*/
|
||
|
|
void Map::resetMap()
|
||
|
|
{
|
||
|
|
// resets player position, count values, and initializes values in position arrays to -1
|
||
|
|
player_position_[0] = 0; //Puts Player in top row
|
||
|
|
player_position_[1] = num_cols_/2; // Centers Players
|
||
|
|
|
||
|
|
// set ship exit
|
||
|
|
ship_exit_[0] = num_rows_ - 2; // Set Exit to second last row
|
||
|
|
ship_exit_[1] = num_cols_ / 2; // Set exit in middle
|
||
|
|
|
||
|
|
// set bed position on map
|
||
|
|
ship_bed_[0] = 5;
|
||
|
|
ship_bed_[1] = 0;
|
||
|
|
|
||
|
|
for (int i = 0; i < max_rooms_; i++)
|
||
|
|
{
|
||
|
|
room_positions_[i][0] = -1;
|
||
|
|
room_positions_[i][1] = -1;
|
||
|
|
}
|
||
|
|
|
||
|
|
for (int i = 0; i < num_rows_; i++)
|
||
|
|
{
|
||
|
|
for (int j = 0; j < num_cols_; j++)
|
||
|
|
{
|
||
|
|
map_data_[i][j] = SHIP;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
map_data_[ship_exit_[0]][ship_exit_[1]] = EXIT;
|
||
|
|
map_data_[ship_bed_[0]][ship_bed_[1]] = BED;
|
||
|
|
}
|
||
|
|
|
||
|
|
// return player's row position
|
||
|
|
int Map::getPlayerRow()
|
||
|
|
{
|
||
|
|
return player_position_[0];
|
||
|
|
}
|
||
|
|
|
||
|
|
// return player's column position
|
||
|
|
int Map::getPlayerCol()
|
||
|
|
{
|
||
|
|
return player_position_[1];
|
||
|
|
}
|
||
|
|
|
||
|
|
// return ship exit row
|
||
|
|
int Map::getShipExitRow()
|
||
|
|
{
|
||
|
|
return ship_exit_[0];
|
||
|
|
}
|
||
|
|
|
||
|
|
// return ship exit col
|
||
|
|
int Map::getShipExitCol()
|
||
|
|
{
|
||
|
|
return ship_exit_[1];
|
||
|
|
}
|
||
|
|
|
||
|
|
// set player position, if in range
|
||
|
|
void Map::setPlayerPosition(int row, int col)
|
||
|
|
{
|
||
|
|
if (isOnMap(row, col))
|
||
|
|
{
|
||
|
|
player_position_[0] = row;
|
||
|
|
player_position_[1] = col;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// set ship exit position, if in range
|
||
|
|
void Map::setShipExit(int row, int col)
|
||
|
|
{
|
||
|
|
if (isOnMap(row, col))
|
||
|
|
{
|
||
|
|
ship_exit_[0] = row;
|
||
|
|
ship_exit_[1] = col;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// set location of players bed
|
||
|
|
void Map::setShipBed(int row, int col)
|
||
|
|
{
|
||
|
|
if (isOnMap(row, col))
|
||
|
|
{
|
||
|
|
ship_bed_[0] = row;
|
||
|
|
ship_bed_[1] = col;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// returns member variable num_rows_
|
||
|
|
int Map::getNumRows()
|
||
|
|
{
|
||
|
|
return num_rows_;
|
||
|
|
}
|
||
|
|
|
||
|
|
// returns member variable num_cols_
|
||
|
|
int Map::getNumCols()
|
||
|
|
{
|
||
|
|
return num_cols_;
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
* @brief Checks if the given (row, col) position is on the map
|
||
|
|
*
|
||
|
|
* Algorithm:
|
||
|
|
* if 0 <= row < num_rows_ and 0 <= col < num_cols_:
|
||
|
|
* return true
|
||
|
|
* else:
|
||
|
|
* return false
|
||
|
|
*
|
||
|
|
* Parameters: row (int), col (int)
|
||
|
|
* Returns: bool
|
||
|
|
*/
|
||
|
|
bool Map::isOnMap(int row, int col)
|
||
|
|
{
|
||
|
|
if (0 <= row && row < num_rows_ && 0 <= col && col < num_cols_)
|
||
|
|
{
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
* Algorithm: checks if (row, col) is ship_exit_
|
||
|
|
*
|
||
|
|
*/
|
||
|
|
bool Map::isShipExit(int row, int col)
|
||
|
|
{
|
||
|
|
if (row == ship_exit_[0] && col == ship_exit_[1])
|
||
|
|
{
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
* Algorithm: checks if (row, col) is ship_exit_
|
||
|
|
*
|
||
|
|
*/
|
||
|
|
bool Map::isShipBed(int row, int col)
|
||
|
|
{
|
||
|
|
if (row == ship_bed_[0] && col == ship_bed_[1])
|
||
|
|
{
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
* Algorithm: Make the player move based on the given command
|
||
|
|
* if user inputs w and if its not the top row of the map
|
||
|
|
* Move the player up by one row
|
||
|
|
* if user inputs s and if its not the bottom row of the map
|
||
|
|
* Move the player down by one row
|
||
|
|
* if user inputs a and if its not the leftmost column
|
||
|
|
* Move the player left by one column
|
||
|
|
* if user inputs d and if its not the rightmost column
|
||
|
|
* Move the player right by one column
|
||
|
|
* if player moved
|
||
|
|
* if new location is an NPC location
|
||
|
|
* mark new location as explored
|
||
|
|
* return true
|
||
|
|
* else
|
||
|
|
* return false
|
||
|
|
*
|
||
|
|
* Parameters: direction (char)
|
||
|
|
* Return: boolean (bool)
|
||
|
|
*/
|
||
|
|
bool Map::move(char direction)
|
||
|
|
{
|
||
|
|
// check input char and move accordingly
|
||
|
|
switch (tolower(direction))
|
||
|
|
{
|
||
|
|
case 'w': // if user inputs w, move up if it is an allowed move
|
||
|
|
if (player_position_[0] > 0)
|
||
|
|
{
|
||
|
|
player_position_[0] -= 1;
|
||
|
|
}
|
||
|
|
else // Keep user in bounds
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 's': // if user inputs s, move down if it is an allowed move
|
||
|
|
if (player_position_[0] < num_rows_ - 1)
|
||
|
|
{
|
||
|
|
player_position_[0] += 1;
|
||
|
|
}
|
||
|
|
else // Keep user in bounds
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 'a': // if user inputs a, move left if it is an allowed move
|
||
|
|
if (player_position_[1] > 0)
|
||
|
|
{
|
||
|
|
player_position_[1] -= 1;
|
||
|
|
}
|
||
|
|
else // Keep user in bounds
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 'd': // if user inputs d, move right if it is an allowed move
|
||
|
|
if (player_position_[1] < num_cols_ - 1)
|
||
|
|
{
|
||
|
|
player_position_[1] += 1;
|
||
|
|
}
|
||
|
|
else // Keep user in bounds
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
default:
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
* Algorithm: This function prints a 2D map in the terminal.
|
||
|
|
* Loop i from 0 to number of rows
|
||
|
|
* Loop j from 0 to number of columns
|
||
|
|
* if player position is at (i,j)
|
||
|
|
* print 'X'
|
||
|
|
* else if npc is at (i,j)
|
||
|
|
* if npc has been found:
|
||
|
|
* print 'N'
|
||
|
|
* else
|
||
|
|
* print '-'
|
||
|
|
* else
|
||
|
|
* print the value of (i,j) in map_data_
|
||
|
|
*
|
||
|
|
* Parameters: none
|
||
|
|
* Return: nothing (void)
|
||
|
|
*/
|
||
|
|
void Map::displayMap()
|
||
|
|
{
|
||
|
|
for (int i = 0; i < num_rows_; i++)
|
||
|
|
{
|
||
|
|
for (int j = 0; j < num_cols_; j++)
|
||
|
|
{
|
||
|
|
if (player_position_[0] == i && player_position_[1] == j)
|
||
|
|
{
|
||
|
|
cout << FIGHTER;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
cout << map_data_[i][j];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
cout << endl;
|
||
|
|
}
|
||
|
|
}
|