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

2020/2/5

game gives to much points

Milad Milad

2020/2/5

#
Hi, I created Curve Fever. It is a game with two players and and everyone created a line behind him self. If a player hits a line (doesnt matter which line) or the wall (end of the map) the other player wins and get a point. Who gets 5 points first wins. So far everything works except of one thing. Sometimes if one player hits the wall or a line the other player gets more than 1 point. Thats really weird and I could not figure it out why this happens. After a while I added an object which appears if player1 hits the line of himself or the line of player2. I wanted it to also appear if player 1 die because hitting the wall. But the weird thing is, that whitout even writing the command for appearing by hitting the wall, the object appears! I give you the complete code for my game and hope anyone can figure out what I did wrong. In the class text i have 9 subclasses but didnt wrote anything in them. only selected pictures to appear. The problem I have is in player1 if hitting the line and the object which appears is text 9 and 7. sorry for my bad english. If you have any questions just ask
        import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot und MouseInfo)
        
        /**
         * Ergänzen Sie hier eine Beschreibung für die Klasse MyWorld.
         * 
         * @author (Ihr Name) 
         * @version (eine Versionsnummer oder ein Datum)
         */
        public class MyWorld extends World
        {
            private boolean gameStarted = false;
            public boolean deleteAtEdge = false;
            
            
            
            
            public static int LocXPlayer1;
            public static int LocYPlayer1;
            public static int LocXPlayer2;
            public static int LocYPlayer2;
            //achtung static
            static GreenfootSound backgroundMusic = new GreenfootSound("CurveFeverSound.mp3");
            
            public static int ScoreCounterPlayer1 = 0;
            public static int ScoreCounterPlayer2 = 0;
            
            /**
             * Konstruktor für Objekte der Klasse MyWorld
             * 
             */
            public MyWorld()
            {    
                // Erstellt eine neue Welt mit 700x700 Zellen und einer Zell-Größe von 1x1 Pixeln.
                super(700, 700, 1); 
                GreenfootImage bg = new GreenfootImage("background.jpg");
                bg.scale(getWidth(), getHeight());
                setBackground(bg);
                generateLocations();
                generateObjects();
                Greenfoot.setSpeed(47);
                addObject(new logo(), 350, 200);
                addObject(new text1(), 350, 400);
                addObject(new text2(), 350, 450);
                addObject(new text3(), 350, 500);
                addObject(new text4(), 350, 550);
                addObject(new text5(), 350, 600);
                addObject(new text6(), 350, 650);
            }
            
    
            public void playSound()
            {
                //Hinergrundmusik wrd mit der Lautstärke () und in duerschleife abgespielt.
                backgroundMusic.playLoop();
                backgroundMusic.setVolume(40);
            }
            
            public void act()
            {
                playSound();
                
                    while (!gameStarted)
                    {
                    if (Greenfoot.isKeyDown("space"))
                    {
                        gameStarted = true;
                        removeObjects(getObjects(logo.class));
                        removeObjects(getObjects(text1.class));
                        removeObjects(getObjects(text2.class));
                        removeObjects(getObjects(text3.class));
                        removeObjects(getObjects(text4.class));
                        removeObjects(getObjects(text5.class));
                        removeObjects(getObjects(text6.class));
                    }
                }
                    ifPlayer2Wins();
                    ifPlayer1Wins();
                    if (Greenfoot.isKeyDown("r"))
                    {
                        Greenfoot.setWorld(new MyWorld());
                        
                    }
                
                
                
            }
            
            public void generateObjects()
            {
                //erstellt die Spieler und den Countdown
                addObject(new Player1(), LocXPlayer1, LocYPlayer1);
                addObject(new Player2(), LocXPlayer2, LocYPlayer2);
                addObject(new Countdown(), 350, 350);
                showText("Blue: "+ScoreCounterPlayer1, 40, 15);
                showText("Green: "+ScoreCounterPlayer2, 47, 35);
                
            }
            
             public void generateLocations()
            {
                //generiert zufällige Koordinaten für die Spieler im Berreich von 50 und 650 mit Voraussetzung, dass ein bestimmter Abstand zwischen den Spielern besteht.
                LocXPlayer1 = getRandomNumber(50, 650);
                LocYPlayer1 = getRandomNumber(50, 650);
                LocXPlayer2 = getRandomNumber(50, 650);
                LocYPlayer2 = getRandomNumber(50, 650);
                
                if(Math.abs(LocXPlayer1-LocXPlayer2)<75 || Math.abs(LocYPlayer1-LocYPlayer2)<75){
                    generateLocations();
                }
                
             }
            
            public int getRandomNumber(int start,int end)  
            {  
                //Funktion zum Generieren von zufälligen Zahlen.
                int normal = Greenfoot.getRandomNumber(end-start+1);  
                return normal+start;  
            }
            
            public void addScoreCounterPlayer1()
            {
                ScoreCounterPlayer1++;
            }
            
            public void addScoreCounterPlayer2()
            {
                ScoreCounterPlayer2++;
            }
            
            public void ifPlayer2Wins()
            {  
                
                if(ScoreCounterPlayer2 == 5){
                    removeObjects(getObjects(null));
                    showText("Press R to Restart", 350, 470);
                    addObject(new Player2Wins(), 350, 350);
                    ScoreCounterPlayer2 = 0;
                    ScoreCounterPlayer1 = 0;
                    
                    
               
                }
                
            }
            
              public void ifPlayer1Wins()
            {  
                
                if(ScoreCounterPlayer1 == 5){
                    removeObjects(getObjects(null));
                    showText("Press R to Restart", 350, 470);
                    addObject(new Player1Wins(), 350, 350);
                    ScoreCounterPlayer1 = 0;
                    ScoreCounterPlayer2 = 0;
                    
                    
               
                }
                
            }  
            
              public void ifTrue()
            {  
                
                if(deleteAtEdge == true){
                    
                    showText("Press Space to Restart", 350, 470);
                    
                    
                    
                    
               
                }
                
            }  
}
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot und MouseInfo)

/**
 * Ergänzen Sie hier eine Beschreibung für die Klasse Timer.
 * 
 * @author (Ihr Name) 
 * @version (eine Versionsnummer oder ein Datum)
 */
public class Countdown extends Actor
{
    public int dtime = 40;
    
    /**
     * Act - tut, was auch immer Timer tun will. Diese Methode wird aufgerufen, 
     * sobald der 'Act' oder 'Run' Button in der Umgebung angeklickt werden. 
     */
    public void act() 
    {
       countdown();
    }    
    public void countdown()
    {
        Greenfoot.playSound("Countdownsound.mp3");
        setImage("3.png");
        Greenfoot.delay(dtime);
        setImage("2.png");
        Greenfoot.delay(dtime);
        setImage("1.png");
        Greenfoot.delay(dtime);
        setImage("play.png");
        Greenfoot.delay(dtime);
        getWorld().removeObject(this);
    }
}
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot und MouseInfo)

/**
 * Ergänzen Sie hier eine Beschreibung für die Klasse Player1.
 * 
 * @author (Ihr Name) 
 * @version (eine Versionsnummer oder ein Datum)
 */
public class Player1 extends Player



{
    
        
    
    
    
    
    /**
     * Act - tut, was auch immer Player1 tun will. Diese Methode wird aufgerufen, 
     * sobald der 'Act' oder 'Run' Button in der Umgebung angeklickt werden. 
     */
    public void act() 
    {
        // Ergänzen Sie Ihren Quelltext hier...
        
        move(4);
        removeObjectByTouchingLine();
        if (getWorld() == null) return; // needed to avoid IllegalStateException on following codes
        createTrack();
        movement();
        delteAtEdge();
        
    }    
    
    
    
    public void movement()
    {
        if (Greenfoot.isKeyDown("right"))
        {
            turn(6);
        }
        
        if (Greenfoot.isKeyDown("left"))
        {
            turn(-6);
        }
        
    }
    
    public void createTrack()
    {
        
           
               //getWorld().addObject(new Line1(), getX(), getY());
            
               Actor line = new Line1();
               getWorld().addObject(line, getX(), getY());
               line.setRotation(getRotation());
               line.move(-getImage().getWidth()/2);
        
    }
    
    public void delteAtEdge()
    {
       
            if(getX() > 697)
            {
                
                ((MyWorld) getWorld()).addScoreCounterPlayer2();
                
                restartGame();
            }
            else if(getX() < 3)
            {
                
                ((MyWorld) getWorld()).addScoreCounterPlayer2();
                
                restartGame();
            }
            else if(getY() < 3)
            {
                
                ((MyWorld) getWorld()).addScoreCounterPlayer2();
                
                restartGame();
            }
            else if(getY() > 697)
            {
                
                ((MyWorld) getWorld()).addScoreCounterPlayer2();
                
                restartGame();
            }
            
        
    }
    
    public void removeObjectByTouchingLine(){
        
            if (isTouching(Line1.class) || isTouching(Line2.class)) {
                
                ((MyWorld) getWorld()).addScoreCounterPlayer2();
                ((MyWorld) getWorld()).addObject(new text9(), 350, 300);
                ((MyWorld) getWorld()).addObject(new text7(), 350, 400);
                Greenfoot.delay(10);
                
                restartGame();
                
                
                
            }
            
    }
    
    public void restartGame()
            {
            Greenfoot.setWorld(new MyWorld());
            
    }   
    
    
    
}
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot und MouseInfo)

/**
 * Ergänzen Sie hier eine Beschreibung für die Klasse Line1.
 * 
 * @author (Ihr Name) 
 * @version (eine Versionsnummer oder ein Datum)
 */
public class Line1 extends Player1
{
    
    /**
     * Act - tut, was auch immer Line1 tun will. Diese Methode wird aufgerufen, 
     * sobald der 'Act' oder 'Run' Button in der Umgebung angeklickt werden. 
     */
    public void act() 
    {
        // Ergänzen Sie Ihren Quelltext hier...
        
        
    }    
}       
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot und MouseInfo)

/**
 * Ergänzen Sie hier eine Beschreibung für die Klasse Player1Wins.
 * 
 * @author (Ihr Name) 
 * @version (eine Versionsnummer oder ein Datum)
 */
public class Player1Wins extends Player1
{
    /**
     * Act - tut, was auch immer Player1Wins tun will. Diese Methode wird aufgerufen, 
     * sobald der 'Act' oder 'Run' Button in der Umgebung angeklickt werden. 
     */
    public void act() 
    {
        // Ergänzen Sie Ihren Quelltext hier...
    }    
}
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot und MouseInfo)

/**
 * Ergänzen Sie hier eine Beschreibung für die Klasse Player2.
 * 
 * @author (Ihr Name) 
 * @version (eine Versionsnummer oder ein Datum)
 */
public class Player2 extends Player
{
    
    /**
     * Act - tut, was auch immer Player2 tun will. Diese Methode wird aufgerufen, 
     * sobald der 'Act' oder 'Run' Button in der Umgebung angeklickt werden. 
     */
    public void act() 
    {
        // Ergänzen Sie Ihren Quelltext hier...
        
        
        move(4);
        removeObjectByTouchingLine();
        if (getWorld() == null) return; // needed to avoid IllegalStateException on following codes
        createTrack();
        movement();
        delteAtEdge();
        
        
    }    
    public void movement()
    {
        if (Greenfoot.isKeyDown("d"))
        {
            turn(6);
        }
        
        if (Greenfoot.isKeyDown("a"))
        {
            turn(-6);
        }
        
    }
    
    public void createTrack()
    {
         
        //getWorld().addObject(new Line1(), getX(), getY());
            
               Actor line = new Line2();
               getWorld().addObject(line, getX(), getY());
               line.setRotation(getRotation());
               line.move(-getImage().getWidth()/2);
         
        
        
    }
    
    public void delteAtEdge()
    {
        
            if(getX() > 697)
            {
                ((MyWorld) getWorld()).addScoreCounterPlayer1();
                
                restartGame();
            }
            else if(getX() < 3)
            {
                ((MyWorld) getWorld()).addScoreCounterPlayer1();
                
                restartGame();
            }
            else if(getY() < 3)
            {
                ((MyWorld) getWorld()).addScoreCounterPlayer1();
                
                restartGame();
            }
            else if(getY() > 697)
            {
                ((MyWorld) getWorld()).addScoreCounterPlayer1();
                
                restartGame();
            }
            
        
    }
    
    public void removeObjectByTouchingLine(){
         
            if (isTouching(Line1.class) || isTouching(Line2.class)) {
            
                ((MyWorld) getWorld()).addScoreCounterPlayer1();
                
                restartGame();
            
            }
             
    }
    
    public void restartGame()
            {
            Greenfoot.setWorld(new MyWorld());
    }  
    
            
}
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot und MouseInfo)

/**
 * Ergänzen Sie hier eine Beschreibung für die Klasse Line2.
 * 
 * @author (Ihr Name) 
 * @version (eine Versionsnummer oder ein Datum)
 */
public class Line2 extends Player2
{
    
    /**
     * Act - tut, was auch immer Line2 tun will. Diese Methode wird aufgerufen, 
     * sobald der 'Act' oder 'Run' Button in der Umgebung angeklickt werden. 
     */
    public void act() 
    {
        // Ergänzen Sie Ihren Quelltext hier...
        
           
        
    }    
}
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot und MouseInfo)

/**
 * Ergänzen Sie hier eine Beschreibung für die Klasse Player2Wins.
 * 
 * @author (Ihr Name) 
 * @version (eine Versionsnummer oder ein Datum)
 */
public class Player2Wins extends Player2
{
    /**
     * Act - tut, was auch immer Player2Wins tun will. Diese Methode wird aufgerufen, 
     * sobald der 'Act' oder 'Run' Button in der Umgebung angeklickt werden. 
     */
    public void act() 
    {
        // Ergänzen Sie Ihren Quelltext hier...
    }    
}
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot und MouseInfo)

/**
 * Ergänzen Sie hier eine Beschreibung für die Klasse text.
 * 
 * @author (Ihr Name) 
 * @version (eine Versionsnummer oder ein Datum)
 */
public class text extends Actor
{
    /**
     * Act - tut, was auch immer text tun will. Diese Methode wird aufgerufen, 
     * sobald der 'Act' oder 'Run' Button in der Umgebung angeklickt werden. 
     */
    public void act() 
    {
        // Ergänzen Sie Ihren Quelltext hier...
    }    
}
Super_Hippo Super_Hippo

2020/2/6

#
Class Player is probably interesting.
Milad Milad

2020/2/6

#
nothing written in class Player
Super_Hippo Super_Hippo

2020/2/6

#
Yeah, I didn’t look close enough apparently. But having empty classes doesn’t make a lot of sense either. Same goes to subclassing things which aren’t subclasses. But anyway. For me when using your code, these text7/9 objects only appear when player 1 hits a line. I didn’t encounter any double scores yet. Did you spot any pattern about the appearance of double scores?
danpost danpost

2020/2/7

#
Line1 and Line2 are not players and should not extend the Player class. Player1Wins and Player2Wins are not Player1 and Player2 type objects and should not extend those classes. Create a generic Line class extending Actor and have both Line1 and Line2 extend it and create a generic Win class extending Actor and have both Player1Wins and Player2Wins extend it. If you want to associate a particular player with the different lines and win objects, then put each of those specific classes inside the class of the player it associates with. You will then need to add constructors to set their appropriate images. For example;
public class Player1 extends Player
{
    // Player1 class codes
    
    public class Line1 extends Line
    {
        public Line1()
        {
            setImage("blue_line.png");
        }
    }
}
Then, you can change line 103 in Player1 class and line 91 in Player2 class to:
if (isTouching(Line.class))
Try changing line 62 in Player1 class and line 52 in Player2 class to:
line.move(-(getImage().getWidth()+line.getImage().getWidth())/2);
(for hopefully fixing multiple point problem).
You need to login to post a reply.