This site requires JavaScript, please enable it in your browser!
Greenfoot back
Jemy
Jemy wrote ...

2021/3/17

How to find the smallest value from objects created

1
2
3
Jemy Jemy

2021/3/17

#
I have created at least 5 objects on the world. I need to generate random numbers on each object to determine the object with the smallest value. Please how can i do this in Greenfoot? This is my code used to create my object: public void serverPopulation() { for(int i=0; i<NUMBER_OF_SERVER; i++){ int x= Greenfoot.getRandomNumber(getWidth()); int y= Greenfoot.getRandomNumber(getHeight()); addObject(new Server(), x, y); } } i have improve this code by adding other details: public void serverPopulation() { int server = new int; for(int i=0; i<server.length; i++){ int x= Greenfoot.getRandomNumber(getWidth()); int y= Greenfoot.getRandomNumber(getHeight()); addObject(new Server(), x, y); server= Greenfoot.getRandomNumber(151)+150; showText("ElectionTimeOut: " + server, x, y); } int minValue = server; for(int i=1;i<server.length;i++){ if(server < minValue){ minValue = server; } if(server == minValue){ new Server().Candidate(); showText("ElectionTimeOut: " + server, 300, 20); } } } i wanted the program to change the color of the server object, if the random number is the smallest. my challenge is that all of the objects are changing color at the same time. My candidate class is below: public void Candidate(){ setImage("Candidate.png"); }
danpost danpost

2021/3/17

#
If you just want a random server, then get a random server. Assigning a random value to each and finding the smallest one is just complicating things.
int rand = Greenfoot.getRandomNumber(NUMBER_OF_SERVER);
Server randomServer = (Server)getObjects(Server.class).get(rand);
Jemy Jemy

2021/3/17

#
Hi @danpost, I already have a random server using this snippit:
        for(int i=0; i<server.length; i++){
        int x= Greenfoot.getRandomNumber(getWidth());
        int y= Greenfoot.getRandomNumber(getHeight());
        addObject(new Server(), x, y);
        server= Greenfoot.getRandomNumber(151)+150;
        showText("ElectionTimeOut: " + server, x, y);
        }
danpost danpost

2021/3/17

#
Jemy wrote...
Hi @danpost, I already have a random server using this snippit: << Code Omitted >>
Those random values are not being saved anywhere.
Jemy Jemy

2021/3/18

#
How do i use the code you suggested in my code. i tried to use it, its giving me error.
int rand = Greenfoot.getRandomNumber(NUMBER_OF_SERVER);
Server randomServer = (Server)getObjects(Server.class).get(rand);
danpost danpost

2021/3/18

#
Now, I think what you actually want is a Server class containing:
public int number;

public Server(int num)
{
    number = num;
    setImage(new GreenfootImage(""+num, 24, Color.BLACK, new Color(0, 0, 0, 0)));
}
where the for loop in your world is:
for(int i=0; i<server.length; i++){
    int x= Greenfoot.getRandomNumber(getWidth());
    int y= Greenfoot.getRandomNumber(getHeight());
    server= Greenfoot.getRandomNumber(151)+150;
    addObject(new Server(server), x, y);
}
Then, to find smallest valued server, you would use:
Server lowServer = null;
int lowNumber = 301;
for (Object obj : getObjects(Server.class))
{
    Server server = (Server) obj;
    if (server.number < lowNumber)
    {
        lowNumber = server.number;
        lowServer = server;
    }
}
At the end of this last snippet, lowServer will reference the Server object with the lowest number and that number will be stored in lowNumber.
Jemy Jemy

2021/3/18

#
Thanks @danPost
Jemy Jemy

2021/3/18

#
where the for loop in your world is: ? for(int i=0; i<server.length; i++){ int x= Greenfoot.getRandomNumber(getWidth()); int y= Greenfoot.getRandomNumber(getHeight()); server= Greenfoot.getRandomNumber(151)+150; addObject(new Server(server), x, y); }
@danPost, This for loop is in my World class, using your suggestion will make me to drop the array server that i defined. so i think the variable server here should be an int variable to match the parameter of the Server constructor in the server class for the code below:
Server lowServer = null; int lowNumber = 301; for (Object obj : getObjects(Server.class)) { Server server = (Server) obj; if (server.number < lowNumber) { lowNumber = server.number; lowServer = server; } }
where exactly will be placed? My World Class or Server Class. will it be okay to create a method for it. My overall aim is to get the server will the lowest value and set its image to another image of another color. so how do i reference the lowserver such that the constructor will be called to reflect what i want to effect the image change.
Jemy Jemy

2021/3/18

#
public void serverPopulation()
    {      
       for(int i=0; i<NUMBER_OF_SERVER; i++)
       {
        int x= Greenfoot.getRandomNumber(getWidth());
        int y= Greenfoot.getRandomNumber(getHeight());
        int server= Greenfoot.getRandomNumber(151)+150;
        addObject(new Server(server), x, y);
       }
       
       Server lowServer = null;
       int lowNumber = 301;
         for (Object obj : getObjects(Server.class))
         {
          Server server = (Server) obj;
          if (server.number < lowNumber)
          {
            lowNumber = server.number;
            lowServer = server;
          }
         }
    }
This is what i have done and it is generating the random number on MyWorld space. The program should start with all the server starting with the same image then the server with the lowest number changes it's image to reflect a status. I am actually wanting to Emulate Raft Leader Election algorithm in this program
danpost danpost

2021/3/18

#
You can add a method to Server class;
public void setLowState(boolean isLow)
{
    if (isLow) setImage("LOW_IMAGE_NAME");
    else setImage("NORMAL_IMAGE_NAME");
}
Then, in world, use:
lowServer.setLowState(true);
OR: you could just set the image from world:
lowServer.setImage("LOW_IMAGE_NAME");
Jemy Jemy

2021/3/18

#
I am really grateful for your timely feedback. it is working now
Jemy Jemy

2021/3/18

#
public int number;
 
public Server(int num)
{
    number = num;
    setImage(new GreenfootImage(""+num, 24, Color.BLACK, new Color(0, 0, 0, 0)));
}
The code above shows the number as the image. Is there any way i can have another image with the number on top of it?
danpost danpost

2021/3/18

#
Jemy wrote...
<< Code Omitted >> The code above shows the number as the image. Is there any way i can have another image with the number on top of it?
Remove line 6. At end of setLowState method, add the following:
GreenfootImage numImg = new GreenfootImage(""+number, 24, Color.BLACK, new Color(0, 0, 0, 0));
int x = (getImage().getWidth()-numImg.getWidth())/2;
int y = (getImage().getHeight()-numImg.getHeight())/2;
getImage().drawImage(numImg, x, y);
Jemy Jemy

2021/3/19

#
Thanks for your help so far...
lowNumber = server.number;
@danPost, Please is there anyway I can reference lowNumber value in the Server class so that i can use it to make further decision.
danpost danpost

2021/3/19

#
Jemy wrote...
is there anyway I can reference lowNumber value in the Server class so that i can use it to make further decision.
Add class field to Server:
public static int lowNumber;
Change setLowState method to:
public void setLowState(boolean isLow)
{
    if (isLow)
    {
        setImage("LOW_IMAGE_NAME");
        lowNumber = number;
    }
    else setImage("NORMAL_IMAGE_NAME");
}
There are more replies on the next page.
1
2
3