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

2014/12/8

I am having trouble with a snake game

1
2
Starrqwas Starrqwas

2014/12/8

#
I found a snake game on a random website and decided to fix it up, I have it running a lot smother, but still run into the problem that when I hit a wall the snake dies. Is there a way to have the snake go through say the left wall and come out the right on the same (X) axis it went in the right? I will share code if need be (some of it is not English though)
danpost danpost

2014/12/8

#
It makes a difference if the snake was just one actor or if each segment was a separate actor. Also, if it dies at the edges, then there is already some code that will need dealt with (removing and replacing). So, to start, I believe the class for the snake will need to be taken a look at.
Starrqwas Starrqwas

2014/12/10

#
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.awt.Point;
import java.awt.Color;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.Arrays;

/**
 * Write a description of class Ular here.
 * 
 * @author   
 * @version 1.0
 */
public abstract class Ular extends Actor implements BisaDiikuti
{
    /**
     * Membuat enumerasi arah.
     */
    enum Arah {
        ATAS, BAWAH, KIRI, KANAN;
        
        private static final List<Arah> VALUES = Collections.unmodifiableList(Arrays.asList(values()));
        private static final int SIZE = VALUES.size();
        private static final Random RANDOM = new Random();

        public static Arah arahAcak()  {
            return VALUES.get(RANDOM.nextInt(SIZE));
        }
    }
    
    /**
     * posisiAkhir, menunjukan posisi terakhir dari ular ini.
     * arah, menunjukan arah ular ini.
     * bagianBadan, bagian bagian badan yang akan bertambah bila ular ini makan.
     * 
     * kita buat semua variabel disini private (privat) karena
     * variabel ini tidak digunakan oleh kelas lainnya (hanya digunakan oleh kelas ini).
     * hal ini bisa mengurangi penggunaan memori.
     */
    protected Point posisiAkhir;
    protected boolean bisaDiikuti;
    
    public Point posisiAkhir() {
        return posisiAkhir;
    }
    
    public boolean bisaDiikuti() {
        return bisaDiikuti;
    }
    
    protected void move(Arah arah) {
        switch(arah) {
            case ATAS: setLocation(getX(), getY()-1); break;
            case BAWAH: setLocation(getX(), getY()+1); break;
            case KIRI: setLocation(getX()-1, getY()); break;
            case KANAN: setLocation(getX()+1, getY()); break;
            default: arah=Arah.KANAN;
        }
    }
    
    public abstract BisaDiikuti yangDiikuti();
    
}
Starrqwas Starrqwas

2014/12/10

#
that is for the normal class these next two posts will be the body then the head
Starrqwas Starrqwas

2014/12/10

#
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.awt.Point;
import java.awt.Color;

/**
 * Write a description of class aaa here.
 * 
 * @author   
 * @version 1.0
 */
public class BadanUlar extends Ular {
        
    private BisaDiikuti bagianUlar;
    private Point posisiAkhir;
    private boolean bisaDiikuti;
    private Arah arahPeledakan;
        
    public BadanUlar(BisaDiikuti bagianLainnya) {
        this.bagianUlar = bagianLainnya;
        GreenfootImage gambar = new GreenfootImage(20,20);
        gambar.setColor(Color.BLACK);
        gambar.fill();
        setImage(gambar);
            
        bisaDiikuti = true;
    }
        
    public void act() {
        posisiAkhir = new Point(getX(), getY());
        if(bagianUlar.bisaDiikuti()){setLocation((int)bagianUlar.posisiAkhir().getX(), (int)bagianUlar.posisiAkhir().getY());}
        if(((Actor)yangDiikuti()).getWorld() == null || !((BisaDiikuti)yangDiikuti()).bisaDiikuti()) {
            meledak();
        }
    }
        
    public BisaDiikuti yangDiikuti() {
        return bagianUlar;
    }

    public Point posisiAkhir() {
        return posisiAkhir;
    }
        
    public boolean bisaDiikuti() {
        return bisaDiikuti;
    }
    
    private void meledak() {
        if(bisaDiikuti) {
            arahPeledakan = Arah.arahAcak();
            bisaDiikuti = false;
        }
        move(arahPeledakan);
    }   
 }
Starrqwas Starrqwas

2014/12/10

#
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.awt.Point;
import java.awt.Color;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Arrays;
import java.util.Collections;

/**
 * Kepala ular, yang mengontrol seluruh gerakan ular.
 * Berwarna merah.
 * 
 * @author 
 * @version 1.3
 */
public class KepalaUlar extends Ular
{

    private Arah arah = Arah.KANAN;
    private ArrayList<BadanUlar> bagianBadan;

    /**
     * Membuat Kepala Ular baru.
     * 
     * Membuat gambar ular.
     * Mempersiapkan variabel bagianBadan.
     * Mengawali bagianBadan dengan 6 bagian badan.
     */
    public KepalaUlar() {
        /**
         * Membuat gambar untuk KepalaUlar ini.
         */
        GreenfootImage gambar = new GreenfootImage(20,20);
        gambar.setColor(Color.GREEN);
        gambar.fill();
        setImage(gambar);
        
        /**
         * Membuat list array untuk menunjukan jumlah badan kita.
         */
        bagianBadan = new ArrayList<BadanUlar>();
        for(int i=0; i<=6; i++) {
            bagianBadan.add((bagianBadan.size() > 0)?new BadanUlar(bagianBadan.get(bagianBadan.size()-1)):new BadanUlar(this));
        }
        
        bisaDiikuti = true;
    }
    
    /**
     * Fungsi ini dipanggil oleh Greenfoot ketika objek KepalaUlar masuk ke World w.
     * Setelah masuk ke World, kita hanya ingin memperbaharui badannya, tergantung dari 
     * ArrayList bagianBadan tadi.
     * 
     * Fungsi ini hanya dipanggil sekali, yaitu ketika objek ini masuk ke Dunia (World)
     */
    public void addedToWorld(World w) {
        perbaharuiBadan();
    }
    
     /**
     * Fungsi ini dipanggil oleh Greenfoot selalu.
     */
    public void act() 
    {
        if(Greenfoot.isKeyDown("up") && arah != Arah.BAWAH) {
           arah = Arah.ATAS;
        }else if(Greenfoot.isKeyDown("down") && arah != Arah.ATAS) {
           arah = Arah.BAWAH;
        }else if(Greenfoot.isKeyDown("left") && arah != Arah.KANAN) {
           arah = Arah.KIRI;
        }else if(Greenfoot.isKeyDown("right") && arah != Arah.KIRI) {
           arah = Arah.KANAN;
        }

        posisiAkhir = new Point(getX(), getY());
        
        move(arah);
        
       
         while (Greenfoot.isKeyDown("shift"))
        {
                Greenfoot.delay(1);
        }
            
       
        
        if(getOneObjectAtOffset(0,0, MakananUlar.class) != null) {
            MakananUlar makanan = (MakananUlar) getOneObjectAtOffset(0,0, MakananUlar.class); 
            makan(makanan);
        }else if(getOneObjectAtOffset(0,0, Ular.class) != null) {
            meledak();
        }
    
    } 
    
    public BisaDiikuti yangDiikuti() {
        return null;
    }
    
    private void meledak() {
        bisaDiikuti = false;
        Greenfoot.playSound("51464__smcameron__bombexplosion.wav");
        bagianBadan = new ArrayList<BadanUlar>();
        getWorld().removeObject(this);
    }
    
    /**
     * Memperbaharui badan tergantung dari ArrayList<BadanUlar> bagianBadan.
     */
    private void perbaharuiBadan() {
         for(BadanUlar bu : bagianBadan) {
             getWorld().addObject(bu, ((Actor)bu.yangDiikuti()).getX(), ((Actor)bu.yangDiikuti()).getY());
          }
    }
    
    /**
     * Makan makanan ular.
     * 
     * @param makanan makanan ular yang akan dimakan.
     */
    public void makan(MakananUlar makanan) {
        Greenfoot.playSound("20279_Koops_Apple_Crunch_16.wav"); //credit to freesound.org
        makanan.dimakan();
        bagianBadan.add(new BadanUlar(bagianBadan.get(bagianBadan.size()-1)));
        perbaharuiBadan();
    }
    
        
}
Starrqwas Starrqwas

2014/12/10

#
as some of the code is in another language it was hard to find the code that caused the snake to die at an edge. Thanks for taking a look danpost.
danpost danpost

2014/12/10

#
Glancing quickly through the codes, I did not see anywhere that might suggest it was checking for edges of the world. Out of curiosity, please also post the BisaDiikuti class code.
Starrqwas Starrqwas

2014/12/11

#
Yes I also was looking for the code that checked for an edge and could not find it. I am on my laptop at the moment but in about an hour and a half I will be able to get on my desktop to post that code for you.
danpost danpost

2014/12/11

#
I may not be able to respond for about 6 or so hours. Places to go -- people to meet; you know.
Starrqwas Starrqwas

2014/12/11

#
Y a no problem at all
Starrqwas Starrqwas

2014/12/11

#
import java.awt.Point;

/**
 * Objek yang menggunakan interface ini berarti bisa di ikuti.
 * 
 * @author   
 * @version 1.0
 */
public interface BisaDiikuti
{
    Point posisiAkhir();
    BisaDiikuti yangDiikuti();
    boolean bisaDiikuti();
}
danpost danpost

2014/12/12

#
I believe that lines 91 and 92 in the KepalaUlar class is what is causing the game to end when an edge is reached. I think it is programmed so that if the head tries to go 'into' the edge, the snake will move like it is a normal move; however, since the head is bound to the edge and does not therefore move, it ends up intersecting the body part behind it which is like running into itself; so the game ends.
Starrqwas Starrqwas

2014/12/12

#
Oh I think that I see it now... Any idea on how to fix it? also on how to unbind a world, because I put in the code
DuniaUlar(30, 20, 37)  boolean bounded = false)
and it just gave me an error
Starrqwas Starrqwas

2014/12/12

#
 super(30, 20, 35);
        boolean bounded = false;
       
updated the code now it compiles but does not become unbound
There are more replies on the next page.
1
2