Initialize files from GitLab repository
This commit is contained in:
274
lib/ship/Map.cpp
Normal file
274
lib/ship/Map.cpp
Normal file
@@ -0,0 +1,274 @@
|
||||
#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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user