•
•
•
•
What is DaniWeb IT Discussion Community?
You're currently browsing the Java section within the Software Development category of DaniWeb, a massive community of 423,000 software developers, web developers, Internet marketers, and tech gurus who are all enthusiastic about making contacts, networking, and learning from each other. In fact, there are 3,853 IT professionals currently interacting right now! Registration is free, only takes a minute and lets you enjoy all of the interactive features of the site.
Please support our Java advertiser: Lunarpages Java Web Hosting
Views: 1440 | Replies: 6
![]() |
•
•
Join Date: Jun 2006
Posts: 4
Reputation:
Rep Power: 0
Solved Threads: 0
Hey there. I have working code that reads in a text file into a 2d array. The text file holds symbols that make up a map for a game. I'm trying to assign each of the symbols (like ^, for a mountain) to an object, and store those in the 2d array as well, so that my map is made up of mapspace objects (desert space, mountain space...all of which I have existing classes for). I'm thinking of using if(possibly?) statements to check each character that is stored in the array & instantiate a new mountain/desert object.
I'm not sure how to go about it, though.... Here's what I have so far:
I'm not sure how to go about it, though.... Here's what I have so far:
public class Map {
ArrayList array = new ArrayList();
char [][] linksWorld = null;
public Map(String mapFile) {
try{
BufferedReader in = new BufferedReader(new FileReader(mapFile));
String data;
//Read from file
while ((data = in.readLine()) != null)
{
//Convert data to char array and add into array
array.add(data.toCharArray());
}
in.close();
//Creating a 2D char array using the arraylist size
linksWorld = new char [array.size()][];
//Convert array from ArrayList to 2D array
for (int i=0; i<array.size(); i++){
linksWorld[i] = (char[])array.get(i);
}
//Test 2d array
for (int j=0; j<linksWorld.length; j++){
char [] temp = linksWorld[j];
for (int x=0; x<temp.length; x++)
{
System.out.print(temp[x]);
}
System.out.println("");
}
}
catch (Exception ex){
ex.printStackTrace();
}
}//constructor
//test
public static void main(String[] args){
Map map = new Map("samplemap.txt");
}
} Last edited by pineapple : Jun 30th, 2006 at 6:58 pm.
•
•
Join Date: Nov 2004
Location: Netherlands
Posts: 5,752
Reputation:
Rep Power: 18
Solved Threads: 197
Don't call the class Map, to avoid confusion with the standard library 
Make it an array of MapSpace objects and store just those, maybe having those have the original character in them somewhere (or better have an enum that maps the characters to symbolic constants).
Think something like
I'll leave it up to you to add methods to get the enum for a specific terraintype character.

Make it an array of MapSpace objects and store just those, maybe having those have the original character in them somewhere (or better have an enum that maps the characters to symbolic constants).
Think something like
public enum TerrainType {
MOUNTAIN('^', mypackage.terrain.Mountain.class),
SEA('~', mypackage.terrain.Sea.class);
private char type;
private Class terrainClass;
TerrainType(char type, Class terrainClass) {
this.type = type;
this.terrainClass = terrainClass;
}
public String getType() {
return type;
}
public Class getTerrainClass() {
return terrainClass;
}
}I'll leave it up to you to add methods to get the enum for a specific terraintype character.
As people are clearly allowed to attack me but I'm not allowed to defend myself, I no longer post to this site.
•
•
Join Date: May 2006
Posts: 25
Reputation:
Rep Power: 3
Solved Threads: 2
It seems you'll need to do alot of work to do this with an array. I would suggest using a Map class from java.util. Maps allow you to store a key-value pair.
Map<k,v>
Above is the signature of a Map. It allows you to define the type of parameters that your Map will hold. It's alot more flexible than an array. Map<String,Object>
It also has methods that allow you store, retrieve and delete. Well, that's all that I am able to offer. Please be sure to check out the java api by sun for guidance on using collections.
Map<k,v>
Above is the signature of a Map. It allows you to define the type of parameters that your Map will hold. It's alot more flexible than an array. Map<String,Object>
It also has methods that allow you store, retrieve and delete. Well, that's all that I am able to offer. Please be sure to check out the java api by sun for guidance on using collections.
•
•
Join Date: Jun 2006
Posts: 4
Reputation:
Rep Power: 0
Solved Threads: 0
I unfortunately cannot use Map class, I'm supposed to use a 2d array. :mad: I'm gearing towards this to instantiate my 2d array, hyrule, with MapSpace objects.
I also want to be able to get a MapSpace object in the 2d array using a method, but I'm not sure what would go in the body of the method to retrieve the specific element (I know how to retrieve an element in a 1d array, but not a 2d array). The java api wasn't too helpful when trying to get 2d array elements.
Any ideas?
//reads in from a text file line by line.
while((s = in.readLine())!= null){
for(int cols = 0; cols<arr.length; cols++){
arr1 = s.toCharArray();
if(arr1[rows] == '^'){
//Make a new Mountain object.
hyrule[rows][cols] = new Mountain();
}//if
else if(arr1[rows] == '#'){
//Make a new Desert object.
hyrule[rows][cols] = new Desert();
}//else if
for(rows=0;rows<arr1.length;rows++){
System.out.println(hyrule[rows][cols]);
}
rows++;
cols = arr1.length;
}//for
}//whileI also want to be able to get a MapSpace object in the 2d array using a method, but I'm not sure what would go in the body of the method to retrieve the specific element (I know how to retrieve an element in a 1d array, but not a 2d array). The java api wasn't too helpful when trying to get 2d array elements.
public MapSpace getMapSpace(int row, int column){
//code to retrieve specific element
return MapSpaceObject;
}Any ideas?
Last edited by pineapple : Jul 3rd, 2006 at 2:37 pm.
•
•
Join Date: May 2006
Posts: 25
Reputation:
Rep Power: 3
Solved Threads: 2
I'm a little confused about your code. It seems to me that you are doing way to much. Then again it could be just me!!! Please help me understand it. I may be just missing the point. It's been awhile since I actually coded and some of the objects and methods in your program, I have never used before.
I'm guessing that each character symbol that represents an object is on its own line in the text file. If this is the case, why to you read only 1 character (string i'm guessing) and convert it to a char array which will have the size of 1 and then store it in an array list or an array. I'm really confused since you changed your variables and the way you are now assigning each char array to what appears to be an array reference variable. Have you ran this code yet or tested it. If so, what error messages are you getting. I'm much better at debugging messages than analyzing code from a web page.
I'm guessing that each character symbol that represents an object is on its own line in the text file. If this is the case, why to you read only 1 character (string i'm guessing) and convert it to a char array which will have the size of 1 and then store it in an array list or an array. I'm really confused since you changed your variables and the way you are now assigning each char array to what appears to be an array reference variable. Have you ran this code yet or tested it. If so, what error messages are you getting. I'm much better at debugging messages than analyzing code from a web page.
//reads in from a text file line by line.
while((s = in.readLine())!= null){
for(int cols = 0; cols<arr.length; cols++){
arr1 = s.toCharArray();
if(arr1[rows] == '^'){
//Make a new Mountain object.
hyrule[rows][cols] = new Mountain();
}//if Last edited by DaSogo : Jul 3rd, 2006 at 5:03 pm.
•
•
Join Date: Jun 2006
Posts: 4
Reputation:
Rep Power: 0
Solved Threads: 0
Yes, you're right, I have a text file that is about 6x8 and is full of # and ^ characters that are supposed to represent objects (each with their respective classes, Desert and Mountain). Here's a bit more of my code, including the way I input each line of from the text file. I want to fill my 2d array with the correct Mountain or Desert object, and then be able to call a method that will return the right mapspace (mountain or desert) when given coordinates. However, when I fill the body of the getMapSpace() method and call it on my Map object, it gives me a NullPointerException. If I remember correctly, this means that my array hasn't been instantiated, right?
then, as stated in my last post, call the getMapSpace() method on the Map object.
public class NewMap{
private int height;
private int cols;
private int rows;
private MapSpace[][] hyrule;
private int width;
private String s;
private char [] arr1;
//Constructor
public Map(){
try{
BufferedReader in = new BufferedReader(new FileReader("sampleMap.txt"));
Random rdm = new Random();
while((s = in.readLine())!= null){
arr1 = s.toCharArray();
for(int cols = 0; cols<arr1.length; cols++){
for(int rows=0; rows<arr1.length; rows++){
if(arr1[rows] == '^'){
//Make a new Mountain object.
hyrule[rows][cols] = new Mountain();
}//if
else if(arr1[rows] == '#'){
//Make a new Desert object.
hyrule[rows][cols] = new Desert();
}//else if
rows++;
cols = arr1.length;
}//for
}//for
}//while
in.close();
}//try
catch(IOException io){
System.out.println(io);
io.printStackTrace();
}//catch
}//constructorthen, as stated in my last post, call the getMapSpace() method on the Map object.
Last edited by pineapple : Jul 3rd, 2006 at 5:14 pm.
•
•
Join Date: May 2006
Posts: 25
Reputation:
Rep Power: 3
Solved Threads: 2
•
•
•
•
Originally Posted by pineapple
Yes, you're right, I have a text file that is about 6x8 and is full of # and ^ characters that are supposed to represent objects (each with their respective classes, Desert and Mountain).
paste the contents of your text file here so that I may view it. It looks like you are doing alot of work which is not neccessary. 6x8 is too general of a description. I need to know how many symbols per line and does one line represent the contents of 1 object.
However, when I fill the body of the getMapSpace() method and call it on my Map object, it gives me a NullPointerException. If I remember correctly, this means that my array hasn't been instantiated, right?
No, instantiated in a way means to bring an object too life by using the new keyword. You received a nullpointer exception because the element that you were trying to access at hyrule[row][col] was not present. In other words, a value was not assigned to it. I believe you performed that operation in your for loop during the read. That's why I need to see the structure of sampleMap.txt. I see you have gotten rid of the arraylist...good!!!!
public class NewMap{ private int height; private int cols; private int rows; private MapSpace[][] hyrule; private int width; private String s; private char [] arr1; //Constructor public Map(){ try{ BufferedReader in = new BufferedReader(new FileReader("sampleMap.txt")); Random rdm = new Random(); while((s = in.readLine())!= null){ arr1 = s.toCharArray();//don't think this is working right because arr1 is a variable that holds the bit pattern to where the char array is actually stored in memory. Also arr1 was never initialized, meaning it wasn't given a size and an index to store the the input from the text file. if 1 character equals 1 object, then in the textfile, only have 1 column of data. This will allow 1 character to be read at a time into a string variable. while the symbol is stored in the the variable, you can go straight to the if statements and compare. You wouldn't need the for loop since the file will repeat until end of file. If it turns out that you will need the char array because of its scope, you can assign the character after it passes through the if statements. for(int cols = 0; cols<arr1.length; cols++){ for(int rows=0; rows<arr1.length; rows++){ if(arr1[rows] == '^'){ //Make a new Mountain object. hyrule[rows][cols] = new Mountain(); }//if else if(arr1[rows] == '#'){ //Make a new Desert object. hyrule[rows][cols] = new Desert(); }//else if rows++; cols = arr1.length; }//for }//for }//while in.close(); }//try catch(IOException io){ System.out.println(io); io.printStackTrace(); }//catch }//constructor
then, as stated in my last post, call the getMapSpace() method on the Map object.
Once I have the the contents of the textfile as they are positioned, It will be alot clearer.
![]() |
•
•
•
•
•
•
•
•
DaniWeb Java Marketplace
•
•
•
•
Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
- Forms in Random access files (Visual Basic 4 / 5 / 6)
- Writing to an Access Database (Visual Basic 4 / 5 / 6)
- Looking for some Guidance. (Python)
- New to C and needing some guidance (C)
- Problems IE 6 Win98 redirected from google to other site (Web Browsers)
- Querying database records (Visual Basic 4 / 5 / 6)
- unknown harddrive error (Windows NT / 2000 / XP / 2003)
- Connection Problems (Networking Hardware Configuration)
Other Threads in the Java Forum
- Previous Thread: 5 digit palindromes Array
- Next Thread: UrGEntReplY



Linear Mode