Dungeon Crawler Adventure is a project I made for my Game Programming course at NSCC and was made entirely in C# and with a map that is read from an external file. We have iterated upon this project multiple times over the first and second years leading to an Object-Oriented & Data Driven Text-Based RPG that uses polymorphism and encapsulation. I used c# with Visual Studio for this project.
Code Snippets
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
namespace OOPTextBasedRPG
{
internal class GameManager
{
private readonly Map map;
private readonly HUD hud;
private readonly Player player;
private readonly EnemyManager enemyManager;
private readonly ItemManager itemManager;
private readonly GameSettings settings;
private readonly string settingsFilePath = "game_settings.json";
public GameManager()
{
settings = SettingsLoader.LoadSettings(settingsFilePath);
map = new Map(settings.Map, settings.Player);
hud = new HUD(map, settings);
player = new Player(map, settings.Player.SpawnPoint, settings.Player);
enemyManager = new EnemyManager(map, settings.Enemies);
itemManager = new ItemManager(map, settings.Items);
}
public void Init()
{
//Console.SetWindowSize(Console.LargestWindowWidth, Console.LargestWindowHeight);
//Console.SetBufferSize(Console.LargestWindowWidth, Console.LargestWindowHeight);
//Console.SetWindowPosition(0, 0);
enemyManager.InitEnemies();
itemManager.InitItems();
map.AddEntity(player, player.position);
enemyManager.AddEnemies();
itemManager.AddItems();
map.GetEntities();
map.GetItems();
Console.CursorVisible = false;
map.RenderMap();
hud.ShowHUD(player, enemyManager.enemies.ToArray());
}
public void Update()
{
player.PlayerUpdate();
enemyManager.UpdateEnemies();
player.gaveDamage = false;
CheckGameOver();
}
public void Draw()
{
map.RenderMap();
hud.ShowHUD(player, enemyManager.enemies.ToArray());
itemManager.DrawItems();
enemyManager.DrawEnemies();
player.PlayerDraw();
}
public void RunGameLoop()
{
Init();
Draw();
while (!player.gameOver)
{
Update();
Draw();
}
RenderTextScreen(player.healthSystem.isDead ? settings.HUD.GameOverText : settings.HUD.VictoryText);
Console.WriteLine(settings.HUD.ContinueText);
Console.ReadKey(true);
}
private void CheckGameOver()
{
if (player.healthSystem.isDead || enemyManager.AllEnemiesDefeated())
{
player.gameOver = true;
}
}
private void RenderTextScreen(string displayText)
{
Console.Clear();
Console.WriteLine(displayText);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OOPTextBasedRPG
{
internal class ItemManager
{
public readonly List<Item> items;
public readonly Map map;
public readonly ItemSettings itemSettings;
public ItemManager(Map map, ItemSettings itemSettings)
{
items = new List<Item>();
this.map = map;
this.itemSettings = itemSettings;
}
public void InitItems()
{
items.Add(new HealthItem(new Point2D(20, 4), map, itemSettings.HealthItem));
items.Add(new HealthItem(new Point2D(43, 13), map, itemSettings.HealthItem));
items.Add(new HealthItem(new Point2D(63, 30), map, itemSettings.HealthItem));
items.Add(new HealthItem(new Point2D(41, 27), map, itemSettings.HealthItem));
items.Add(new HealthItem(new Point2D(28, 18), map, itemSettings.HealthItem));
items.Add(new HealthItem(new Point2D(8, 6), map, itemSettings.HealthItem));
items.Add(new HealthItem(new Point2D(15, 7), map, itemSettings.HealthItem));
items.Add(new HealthItem(new Point2D(51, 21), map, itemSettings.HealthItem));
items.Add(new HealthItem(new Point2D(17, 27), map, itemSettings.HealthItem));
items.Add(new HealthItem(new Point2D(14, 21), map, itemSettings.HealthItem));
items.Add(new HealthItem(new Point2D(58, 25), map, itemSettings.HealthItem));
items.Add(new HealthItem(new Point2D(79, 9), map, itemSettings.HealthItem));
items.Add(new HealthItem(new Point2D(92, 18), map, itemSettings.HealthItem));
items.Add(new HealthItem(new Point2D(50, 4), map, itemSettings.HealthItem));
items.Add(new HealthItem(new Point2D(45, 17), map, itemSettings.HealthItem));
items.Add(new HealthItem(new Point2D(68, 10), map, itemSettings.HealthItem));
items.Add(new HealthItem(new Point2D(84, 28), map, itemSettings.HealthItem));
items.Add(new HealthItem(new Point2D(6, 17), map, itemSettings.HealthItem));
items.Add(new HealthItem(new Point2D(93, 11), map, itemSettings.HealthItem));
items.Add(new HealthItem(new Point2D(28, 31), map, itemSettings.HealthItem));
items.Add(new HealthItem(new Point2D(23, 15), map, itemSettings.HealthItem));
items.Add(new HealthItem(new Point2D(71, 17), map, itemSettings.HealthItem));
items.Add(new HealthItem(new Point2D(22, 22), map, itemSettings.HealthItem));
items.Add(new HealthItem(new Point2D(35, 6), map, itemSettings.HealthItem));
items.Add(new HealthItem(new Point2D(60, 15), map, itemSettings.HealthItem));
items.Add(new ShieldItem(new Point2D(10, 15), map, itemSettings.ShieldItem));
items.Add(new ShieldItem(new Point2D(8, 31), map, itemSettings.ShieldItem));
items.Add(new ShieldItem(new Point2D(60, 17), map, itemSettings.ShieldItem));
items.Add(new ShieldItem(new Point2D(66, 5), map, itemSettings.ShieldItem));
items.Add(new KeyItem(new Point2D(8, 19), map, itemSettings.KeyItem));
items.Add(new KeyItem(new Point2D(7, 13), map, itemSettings.KeyItem));
items.Add(new KeyItem(new Point2D(50, 18), map, itemSettings.KeyItem));
items.Add(new KeyItem(new Point2D(75, 14), map, itemSettings.KeyItem));
}
public void AddItems()
{
foreach (var item in items)
{
map.AddItem(item, item.position);
}
}
public void DrawItems()
{
foreach (var item in items)
{
item.ItemDraw();
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OOPTextBasedRPG
{
internal abstract class Item : GameObject
{
public bool isPickedUp = false;
public readonly Map map;
public Item(Point2D position, Map map)
{
this.map = map;
this.position = new Point2D(position.x, position.y);
}
public void ItemDraw()
{
if (!isPickedUp)
{
Console.SetCursorPosition(this.position.x, this.position.y);
Console.ForegroundColor = color;
Console.WriteLine(icon);
Console.ForegroundColor = ConsoleColor.White;
}
}
public virtual void PickupItem()
{
isPickedUp = true;
}
}
}