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

#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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

#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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

#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
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

#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
1
DuniaUlar(30, 20, 37boolean bounded = false)
and it just gave me an error
Starrqwas Starrqwas

2014/12/12

#
1
2
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