|
The idea is that you don't need global variables in C#, and by and large it's true.
You can simulate them using static :
public static class Globals
{
public static int GlobalInteger = 666;
}
...
Console.WriteLine(Globals.GlobalInteger); but I've only done it with a handful of variables in all the C# code I've ever written.
If you need lots of globals, it's normally a BIG sign that your whole design is wildly wrong.
I'd seriously think about the whole structure of your app if I were you - it's sounding very much like you didn't read any of the books after all.
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 been reading books and took a look at some tutorials on line Griff. I used the knowledge I gained to start work in writing my programs. My first attempt was to use procedures when the code was repeating in places. I managed to get the adventure compiler to work without any problems. I'm now working on the adventure driver.
Due to the type of game it has at least 32 variables for things such as Romm Names, Room Locations, Room Descriptions etc Some procedures require many variables to produce a result and some variables are used many times in procedures. The use of arrays also helped to simplify the code.
I'm now looking at using classes as a way to wrote the adventure driver code as I can't use global variables.
Brian
|
|
|
|
|
Member 14154627 wrote: Due to the type of game it has at least 32 variables for things such as Romm Names, Room Locations, Room Descriptions etc Some procedures require many variables to produce a result and some variables are used many times in procedures. The use of arrays also helped to simplify the code.
So you have a Room class: it has a name, a location, a description, etc. Pass the room and the player and you have all the info you need!
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!
|
|
|
|
|
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
|
|
|
|