|
Is this what you mean Griff
public class Room()
{
public String [] RoomName;
public int [] RoomLocation;
public String RoomDescription;
public int [,] Direction;
}
The other way would be to use a structure but classes might have been solutions.
Brian
|
|
|
|
|
No. Why would you have an array of names? Does a room have multiple names? None of the ones in my house do ...
Think about your house or flat, or whatever: what would you need to map that out as a collection of rooms?
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Hi Griff.
Each room does have an array of directions that you can go in to enter other rooms (N,S,E,W).
Originally I used a double array suych as Direction[room number, direction] = 6
Directions were 1 - 6 for North, South,....Up, Down.
Direction[1,1] = 6. If I'm in room 1 and move North then I go to room 6.
Brian
|
|
|
|
|
Hi,
if a room (or many rooms) is a relevant item in your application domain, then by all means define a class named Room , and give it all the public properties you are going to need, such as Description , Location , Name , etc. Now start creating Room instances and use them any way you see fit.
Once you have
public class Room {
public static List<Room> AllRooms=new List<Room>();
private string name;
private Point location;
private bool isLightOn;
...
public Room(string name, Point location, ...) {
this.name=name;
AllRooms.Add(this);
}
public string Name { get {return name;}}
public Point Location { get {return location;}}
public void SwitchOnLight() {
isLightOn=true;
}
public static Room FindByName(string name) {
foreach(Room r in AllRooms) {
if (r.Name==name) return r;
}
return null;
}
}
you can operate on rooms in many ways:
Room myRoom1=new Room("kitchen", ...);
Room myRoom2=new Room("study", ...);
Room someRoom=Room.FindByName("kitchen");
someRoom.SwitchOnLight();
and you can pass an entire room, with all its properties automatically also available, to whatever method you choose to create:
Room myRoom1=new Room("kitchen", ...);
inventory(myRoom1);
If it has a name, it most certainly deserves to be described by a class!
|
|
|
|
|
Hi Luc.
Thanks for the example code.
Will this work for arrays? As I have many rooms I'm using RoomName[1] = "Hallway", RoomName[2] = "Lounge", etc.
Brian
|
|
|
|
|
Yes, you can create arrays of anything you like, as long as the items have the same type (all integers, or all rooms, or...). Most often you are better of using a List, which basically is an array that grows automatically when you add items (see AllRooms in my example).
Now is the time to stop fiddling around; do not just try and convert some existing code into C# code as long as you are unfamiliar with C# and OOP; so start reading:
1. a decent book on C#, at least the chapters that pertain to object-oriented programming;
2. a couple of CodeProject articles (including source code!) that deal with something that appeals to you.
|
|
|
|
|
Yes I admit that I have always had problems in understanding classes and now and then I come across some code that makes it a bit easier to understand.
I had considered using Lists but I think there was no direct access to the data in a list except using the foreach command.
Brian
|
|
|
|
|
You need to study the materials that are made for studying purposes; they will teach you:
1. thinking in an object-oriented way, i.e. with classes and objects
2. getting an overall grasp of a language, so you know, rather than think you know, what capabilities have been provided.
Reading a book will, in an orderly fashion, provide you with most all of the answers to the hundreds of questions you otherwise will come up with in random order; you better invest a few days learning all the concepts and possibilities, rather than wasting the same or more time in stumbling around and learning not much.
|
|
|
|
|
Hi Luc.
I seem to learn the best from code examples.
There use to be the complete code of programs on the internet but it seems more difficult to find these days...maybe people don't want their programs copied and like to keep their code to themselves.
Cope examples are good but there are times when you like to view the complete picture.
Brian
|
|
|
|
|
|
|
Member 14154627 wrote: I had considered using Lists but I think there was no direct access to the data in a list except using the foreach command.
No, a List<T> is a "self expanding array" and can be accessed in the same way as an array:
List<string> items = new List<string>();
items.Add("Hello");
items.Add("World");
Console.Writeline(items[0] + " " + items[1]);
For reference there is this: List<T> - Is it really as efficient as you probably think?[^] - don't look at it too hard now, it may be a little more advanced than you need at the moment.
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
modified 28-Mar-19 11:12am.
|
|
|
|
|
Thanks Griff.
I haven't used List<t> before so I hope to try it out by typing some example code.
Brian
|
|
|
|
|
Stop doing that. Stop "trying it out" and "study it first" - then learn to use it effectively.
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
I did manage to come across a very good site that has a step by step guide of putting together a C# program. This should show me the whole picture of how things work together.
[DELETED]
Brian
-- modified 2-Apr-19 1:56am.
|
|
|
|
|
Your other message with the same site came up in moderation - rightly - and has been closed as spam.
I edited this one to remove the very similar link.
PLease don't post links to "tutorial sites" again, as you will get flagged as a spammer and thrown off the site. I haven't started the process this time as I think it's innocent, or at least probably innocent, but if you post more then someone will.
We don't like spammers, or people who look like spammers - understandable as this site it entirely paid for by advertising and letting people advertise for free would kill that revenue stream and the siet would close.
So when you post a message like "I found this wonderful site ... url ..." you are going to be closed down pretty rapidly. Be told!
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Looks like I should have read the rules to this site before posting.
I'm used to seeing links in other sites.
Thanks for pointing this out to me.
Brian
|
|
|
|
|
One thing I don't understand Griff, I was given a link on this site to download a free book on C# (DotNetBookZero), how is that different from what I did by providing a link to a free pdf file that can be downloaded. Also some on this site have given me direct links to books I can buy on C#.
Brian
|
|
|
|
|
Well, a lot of guys that come from the C/C++ world into C# really struggle with the memory management aspects of .Net. Like me.
I have a static Globals class in pretty much every project I develop. Most of the stuff in my Globals classes are methods that don't really make sense to put into any other non-static class. Along with those methods, I have properties that only need to be set once in the program (many times, it's a complex object or list of objects), or that simplify access to system methods/vars (to ease typing elsewhere in the app).
".45 ACP - because shooting twice is just silly" - JSOP, 2010 ----- You can never have too much ammo - unless you're swimming, or on fire. - JSOP, 2010 ----- When you pry the gun from my cold dead hands, be careful - the barrel will be very hot. - JSOP, 2013
|
|
|
|
|
I've just looked at the Java forum - thanks Richard - and seen what you are trying to do, and I was right: your design is poor.
Why do you need a global variable for "current room", or "inventory"?
Think about it: your player is in a current room, your player has an inventory - and that's true for each player in the game, regardless of whether you have a dozen players or one.
So you make the Location part of each object (including player, swords, bullets, bad guys, whatever - they have a "Location" in the game) and Inventory a part of the player (and probably the bad guy). When you pick something up, it gets added to the objects collection of the inventory of the player. Drop it, and you remove it from the player inventory and added to the room inventory, or the level, or world inventory. Use it, and you remove it from the inventory and discard it.
You pass a Player and possibly a room or level to your methods and they access the items from that.
Global variables aren't needed, and it becomes a whole load easier to add a party of adventurers or whatever to your game instead of a single player.
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Hi Griff.
In answer to your question.
The program is designed to not just play a certain adventure but to be able to load many compiled adventures. The person writes his adventure as a script file. The script file is compiled using the adventure compiler then the adventure driver loads the compiled adventure to play the came.
You need to know what room the player is in (current room) so yu can list the objects in that room and if the player tried to pick up an object then the condition is that the object has to be in the same room as the player (current room and Object Location is used to check for this.
Brian
|
|
|
|
|
That's why you have a Room class, and a Player class. Part of the Player Location is the Room he is in ...
You are thinking in a "C" language way, not an OOPs way - and that won't help you at all with C# apps. Start considering your game as composed of objects which "know" how to do things to themselves instead of trying to think of the "program" as being in charge and deciding what to do.
For example, a Player might have a WalkForward method, which internally finds the Room he is in, finds his location in the room, finds which way he is facing, and asks the Room to move one step in that direction. The Room checks if there is a wall in the way, or a pit full of Grues, or a heavy weight about to drop on that square and returns a result to the Player method which updates its location or takes damage. The Room doesn't care which player it is, the Player doesn't care which Room it is - they just use the data they have to work with any Room / Player combination.
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Hi Griff.
I have come from a background of programming in Basic then Visual Basic, so I tend to slip into this type of programming.
I understand that the class method is a more modern way to program. It's just getting my head around classes even when reading about them.
Brian
|
|
|
|
|
And it shows!
Instead of trying to get your head round how C# and OOPs design works, you're trying to force the code into your older methodology - and that doesn't produce good code!
Modern software thinks in terms of objects and instances, just the same as you do in the "real world". You wouldn't create an array of all Cars and try to move them all relative to each other in the real world, you would create a CarPark with a collection of Levels, each of which would have a collection of ParkingSpaces - your Car instances would then park in a free ParkingSpace without any reference to where the other cars are parked because it's irrelevant - all you want to know is "is this space free", you don't care if it's Car[0], or Car[1], or Car[n] that is in the space, do you?
And that is exactly what you do in the real world: you enter the car park then drive through it looking for the first empty space. When you leave, you go to the level you parked on, then to the space (and hope your car is still there). You drive out of the car park, and you are in a different area: the high street, which connects to Millers Lane at one end and the Bypass at the other. So why would you care about Sesame Street, which is half way across town? The High St "knows" what it's connected to: CarPark, Millers Lane, Bypass. And so on. So the the whole topology of the town is arranged as a series of connected places: Sesame St, Bypass, Millers Lane, High Street, etc. - they only need to know what they are connected to because that "lays out" how the town is arranged.
Think about it, read the books - and this time don't skip stuff because "I know this from Basic" but try and get your head around how Object Oriented Programming helps you to reflect the real world more easily!
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
I have some registry values:
[HKEY_CLASSES_ROOT\WinZip\Shell\Unzip_Model]@="Unzip Model"
[HKEY_CLASSES_ROOT\WinZip\Shell\Unzip_Model\command]@="\"D:\TeklaZipping\TeklaZipping.exe\" \"%1\" "
I am trying to read the value prior to correcting it if wrong:
RegistryKey UnZipping = Registry.ClassesRoot.OpenSubKey(@"WinZip\Shell\Unzip_Model");
if (UnZipping != null)
{
whattodo = UnZipping.GetValue("command").ToString();
UnZipping.Close();
}
the line
whattodo = UnZipping.GetValue("command").ToString();
always gives an error System.NullReferenceException. "Object reference not set to an instance of an object."
I've tried with "(Default)" instead of "command" and various other possibilities but get the same error. Clearly there is something here I don;t understand, can anyone help?
|
|
|
|
|