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"); } }