public Server()
{
if (baseImage == null) baseImage = getImage();
timer = 150+Greenfoot.getRandomNumber(151);
}
/**
* Act - do whatever the Server wants to do. This method is called whenever
* the 'Act' or 'Run' button gets pressed in the environment.
*/
public void act()
{
move();
Candidate();
if(isCandidate){
Candidate_RequestVote();
}
if(IsGrantedVote){
grantVote();
}
if(isCandidate){
leader();
}
}
public void Candidate(){
if (done) return;
if (lowServer != null)
{
setImage("Follow.png");
done = true;
return;
}
if (--timer == 0)
{
lowServer = this;
setImage("Candidate.png");
done = true;
isCandidate=true;
voteSelf=1;
return;
}
GreenfootImage numImg = new GreenfootImage(""+timer, 24, Color.BLACK, new Color(0, 0, 0, 0));
GreenfootImage img = new GreenfootImage(baseImage);
int x = (img.getWidth()-numImg.getWidth())/2;
int y = (img.getHeight()-numImg.getHeight())/2;
img.drawImage(numImg, x, y);
setImage(img);
}
public void move()
{
move(3);
if(isAtEdge()){
turn(87);
}
if(Greenfoot.getRandomNumber(100)<20){
turn(Greenfoot.getRandomNumber(61)-30);
}
}
/**
* candidate request vote from others by intersecting other servers
*/
public void RequestVote()
{
if(!IsGrantedVote){
Request_Rate= REQUEST_TIME;
setImage("RequestVote.png");
IsGrantedVote=true;
}
}
public void Candidate_RequestVote(){
Server request = (Server)getOneIntersectingObject(Server.class);
if(request!= null){
request.RequestVote();
}
}
private boolean Received_Request()
{
return Request_Rate > 0;
}
private void grantVote()
{
if(Received_Request())
{
Request_Rate--;
if(Request_Rate == 0)
{
totalVoteReceived = voteSelf + grant_voteCount++;
setImage("GrantedVote.png");
IsGrantedVote=true;
}
}
}
private void leader()
{
if(totalVoteReceived >= 21 && lowServer!=null){
lowServer=this;
setImage("Leader.png");
}
}

