Tjabba, håller på och försöker göra ett enkelt äventyrsspel likt zork i C# för att lära mig att använda klasser på ett smart sätt, men det måste vara något jag tänkt fel på. Notera att jag är något av en nybörjare på det här, så om ni ser något mer dumt utöver felet skriv gärna
I spelet använder man de sedvanliga go north, go west osv. för att navigera "kartan". I BuildMap() så försöker jag ge varje rum en fiende i form av en zombie för tillfället, men den verkar inte funka så bra.
Här är koden för hela spelet:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MUD
{
class Program
{
public static Program instance;
public Location[,] c_Room = new Location[200, 200];
public String[] RoomDescription = new String[3] {"a dimly lit room.", "a fancy looking living room.", "a spooky cavern."};
public Enemy[] c_Enemies = new Enemy[1];
string s_choice;
public int i_state;
Player player = new Player();
//public Location Room = new Location();
public Program()
{
player.PositionX = 100;
player.PositionY = 100;
}
void Start()
{
i_state = 1;
Console.WriteLine("Welcome!\nWhat is your name?");
player.s_Name = Console.ReadLine();
if (player.s_Name == "")
{
Console.WriteLine("\nNot a valid name! Please choose another one!\n");
player.s_Name = Console.ReadLine();
}
else
{
BuildMap();
Game();
}
}
void BuildMap()
{
int lastRoomDescription = 0;
Random RandomResult = new Random();
for (int i = 0; i < 200; i++)
{
for (int j = 0; j < 200; j++)
{
if (RandomResult.Next(100) > 50)
{
c_Room[i, j].enemy = new Enemy("Zombie", 13, 40);
}
c_Room[i, j].s_roomDescription = RoomDescription[++lastRoomDescription];
if (lastRoomDescription == RoomDescription.Length)
{
lastRoomDescription = 0;
}
}
}
}
void Game()
{
Console.WriteLine("Hi, " + player.s_Name + " you are on an adventure!");
AskForGenericAction();
}
void Action(string selectedAction)
{
switch (selectedAction)
{
case "go north":
++player.PositionY;
Console.WriteLine("You went north.");
enterNewRoom();
break;
case"go south":
--player.PositionY;
Console.WriteLine("You went south.");
enterNewRoom();
break;
case"go east":
++player.PositionX;
Console.WriteLine("You went east.");
enterNewRoom();
break;
case"go west":
--player.PositionX;
Console.WriteLine("You went west.");
enterNewRoom();
break;
case"attack":
Console.WriteLine("What do you want to attack?");
s_choice = Console.ReadLine();
if (s_choice == c_Room[player.PositionX, player.PositionY].enemy.s_Name)
{
c_Room[player.PositionX, player.PositionY].enemy.TakeDamage(player.i_AttackDamage);
}
else
{
Console.WriteLine("There is no " + s_choice + " in the room!");
Action("attack");
}
break;
default:
Console.WriteLine("Not a valid choice!\nWhat do you want to do?");
s_choice = Console.ReadLine();
Action(s_choice);
break;
}
}
void AskForGenericAction()
{
Console.WriteLine("\nWhat do you want to do?");
s_choice = Console.ReadLine();
Action(s_choice);
}
void enterNewRoom()
{
Console.WriteLine("You've entered " + c_Room[player.PositionX, player.PositionY].s_roomDescription);
if (c_Room[player.PositionX, player.PositionY].enemy != null)
{
Console.WriteLine("There is a " + c_Room[player.PositionX, player.PositionY].enemy.s_Name + " in the room!\nWhat do you do?");
s_choice = Console.ReadLine();
Action(s_choice);
}
}
static void Main()
{
instance = new Program();
instance.Start();
}
}
class Actor
{
public string s_Name;
public int i_AttackDamage;
public int i_Health;
public int PositionX, PositionY;
public void TakeDamage(int damageTaken)
{
i_Health -= damageTaken;
if (i_Health <= 0)
{
Death();
}
}
void Death()
{
Program.instance.c_Room[PositionX, PositionY].enemy = null;
}
}
class Player : Actor
{
public Player()
{
i_AttackDamage = 20;
i_Health = 100;
}
}
class Enemy : Actor
{
public Enemy(String name, int dmg, int hp)
{
s_Name = name;
i_AttackDamage = dmg;
i_Health = hp;
}
}
class Location
{
public Enemy enemy;
public string s_roomDescription;
}
}
I raden c_Room[i, j].enemy = new Enemy("Zombie", 13, 40); (line 55) så ger den mig en null reference exception, och jag är inte helt med på varför det är så, om någon har en idé