import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
class OknoGlowne extends JFrame implements Runnable{
private static final long serialVersionUID = 1L;
int dots=5; // ilosc kropek
int aX, aY; // x i y jabłbka
boolean apple=false;
boolean czysc = false;
boolean ramka=false;
Random r;
JButton zacznij;
JSlider slider;
JTextField koniec;
ArrayList<Integer> x,y;
Thread t;
boolean left=false,right=true,up=false,down=false;
public OknoGlowne(String title){
super(title);
Dimension location = new Dimension(Toolkit.getDefaultToolkit().getScreenSize()); //
setSize(600, 500); //
setResizable(false); //
setLayout(null); // ustawienia okna
setLocation((location.width-600)/2,(location.height-500)/2); //
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //
this.setBackground(Color.BLACK); //
x = new ArrayList<Integer>(); //
y = new ArrayList<Integer>(); //
zacznij = new JButton("NEW");
zacznij.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent me) {
if(!t.isAlive()){
t.start();
}
zacznij.setEnabled(false);
slider.setEnabled(false);
odnowa();
}
});
zacznij.setAlignmentX(Component.CENTER_ALIGNMENT);
zacznij.setBounds(510, 10, 80, 50);
add(zacznij);
slider = new JSlider();
slider.setMinorTickSpacing(1);
slider.setPaintTicks(true);
slider.setPaintLabels(true);
slider.setValue(100);
slider.setMinimum(1);
slider.setMaximum(10);
slider.setMajorTickSpacing(2);
slider.setBounds(510, 130, 90, 120);
slider.setOrientation(SwingConstants.VERTICAL);
slider.setEnabled(true);
add(slider);
koniec = new JTextField("KONIEC GRY");
koniec.setFont(new Font("Tekton Pro", Font.BOLD | Font.ITALIC, 60));
koniec.setForeground(Color.blue);
koniec.setBackground(getBackground());
koniec.setBounds(126, 185, 310, 109);
koniec.setEnabled(false);
koniec.setEditable(false);
add(koniec);
for(int i =0;i<(dots)*10;i+=10){
x.add(100-i);
y.add(250);
}
t = new Thread(this);
r = new Random();
}
public void paint(Graphics g){
if(ramka==false){
for(int i = 0;i<500;i+=10){
g.setColor(Color.white);
g.fillRect(i, 20, 10, 10);
g.fillRect(0, i, 10, 10); // rysowanie granic
g.fillRect(500, i, 10, 10);
g.fillRect(i, 490, 10, 10);
}
}
g.setColor(Color.GREEN);
g.fillOval(x.get(0), y.get(0), 10, 10);
for(int i=1;i<dots-1;i++){
g.setColor(new Color(i*2,255-i*2,i*2));
g.fillRect(x.get(i), y.get(i), 10, 10);
g.setColor(new Color(0,0,0));
g.fillOval(x.get(i), y.get(i), 10, 10);
}
g.setColor(getBackground());
g.fillRect(x.get(x.size()-1), y.get(y.size()-1), 10, 10);
if(apple == true){
g.setColor(Color.RED);
g.fillOval(aX, aY, 10, 10);
}
if(czysc==true){
for(int i=0;i<dots-1;i++){
g.setColor(getBackground());
g.fillRect(x.get(i), y.get(i), 10, 10);
g.fillRect(aX, aY, 10, 10);
g.drawRect(126, 185, 310, 109);
}
koniec.setForeground(getBackground());
czysc=false;
}
}
public void run() {
setFocusable(true);
sterowanie sterowanie = new sterowanie(this);
addKeyListener(sterowanie);
synchronized (this) {
while(true){
for (int i = dots-1;i>0;i--){ //
x.set(i, x.get(i-1)); //
y.set(i, y.get(i-1)); //
} //
//
if(sterowanie.gora==true){ //
y.set(0, y.get(0)-10); //
} //
if(sterowanie.dol==true){ // ustawianie współrzędnych
y.set(0, y.get(0)+10); //
} //
if(sterowanie.lewo==true){ //
x.set(0, x.get(0)-10); //
} //
if(sterowanie.prawo==true){ //
x.set(0, x.get(0)+10); //
} //
if(apple == false){
apple=true;
aX = r.nextInt(48)*10+10;
aY = r.nextInt(45)*10+30;
}
if(aX==x.get(0) && aY==y.get(0)){
apple=false;
x.add(-50);
y.add(-50);
dots++;
}
repaint();
try {
Thread.sleep(250/slider.getValue());
} catch (InterruptedException e) {
e.printStackTrace();
}
if ( (x.get(0) == 0 || x.get(0) == 500 || y.get(0) == 20 || y.get(0) == 490) || najechanie()){
ramka=false;
zacznij.setEnabled(true);
try {
czysc = true;
koniec.setEnabled(true);
slider.setEnabled(true);
wait();
koniec.setEnabled(false);
repaint();
koniec.setForeground(Color.BLUE);
Thread.sleep(10);
x.clear(); y.clear();
dots=5;
for(int i =0;i<(dots)*10;i+=10){
x.add(100-i);
y.add(250);
dots=5;
apple=false;
sterowanie.lewo=false;sterowanie.prawo=true;sterowanie.dol=false;sterowanie.gora=false;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
synchronized void odnowa(){
notify();
}
boolean najechanie(){
for (int i = 1;i<dots;i++){
if( (x.get(0).equals(x.get(i))) && y.get(0).equals(y.get(i)) )
return true;
}
return false;
}
}
class sterowanie implements KeyListener { //
OknoGlowne og; //
boolean lewo=false,prawo=true,dol=false,gora=false; //
sterowanie(OknoGlowne og){ //
this.og=og; //
} //
public void keyPressed(KeyEvent e) { //
int key = e.getKeyCode(); //
if(key == KeyEvent.VK_UP && gora==false && dol==false){ //
lewo=false; //
prawo=false; //
dol=false; //
gora=true; //
} //
if(key == KeyEvent.VK_DOWN && gora==false && dol==false){ // sterowanie
lewo=false; //
prawo=false; //
dol=true; //
gora=false; //
} //
if(key == KeyEvent.VK_LEFT && lewo==false && prawo==false){ //
lewo=true; //
prawo=false; //
dol=false; //
gora=false; //
} //
if(key == KeyEvent.VK_RIGHT && lewo==false && prawo==false){ //
lewo=false; //
prawo=true; //
dol=false; //
gora=false; //
} //
} //
public void keyReleased(KeyEvent e) { //
} //
public void keyTyped(KeyEvent e) { //
} //
} //
public class Poczatek {
public static void main (String args[]){
JFrame j = new OknoGlowne("Snake"); // inicjacja okna (poczatek)
JLabel lblNewLabel = new JLabel("Punkty:");
lblNewLabel.setForeground(Color.LIGHT_GRAY);
lblNewLabel.setFont(new Font("Tekton Pro Cond", Font.BOLD, 20));
lblNewLabel.setBounds(514, 63, 70, 44);
j.getContentPane().add(lblNewLabel);
JLabel lblNewLabel_1 = new JLabel("540");
lblNewLabel_1.setForeground(Color.GREEN);
lblNewLabel_1.setFont(new Font("Sylfaen", Font.BOLD | Font.ITALIC, 20));
lblNewLabel_1.setBounds(514, 94, 70, 33);
j.getContentPane().add(lblNewLabel_1);
j.setVisible(true);
}
}