import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;

public class menu extends JFrame{
	private static final long serialVersionUID = 1L;
	centrum centrum;
	prawa prawa;
	ranking ran;
	
	public menu(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);										// 
		
		prawa = new prawa();
		centrum = new centrum();
		ran = new ranking(this, prawa);
		
		prawa.referencja(centrum);
		centrum.referencja(prawa,this,ran);
		
		add(prawa);
		add(centrum);
		
		
	}
	public static void main(String[] args) {
		
		JFrame j = new menu("Snake");
		j.setVisible(true);
	}

}


import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.SwingConstants;


public class prawa extends JPanel{
	private static final long serialVersionUID = 1L;
	centrum cen;
	JSlider predkosc;
	JTextField koniec;
	JButton zacznij;
	JLabel ilosc;
	
	public void referencja(centrum cen){
		this.cen=cen;
	}
	
	public prawa(){
		
		this.setBounds(500, 0, 100, 500);
		this.setLayout(null);
		
		zacznij = new JButton("Zacznij");
		zacznij.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent me) {
				if(!cen.t.isAlive()==true){
					cen.t.start();
					zacznij.setVisible(false);
					predkosc.setVisible(false);
				}
				else {
				cen.odnowa();
				zacznij.setVisible(false);
				predkosc.setVisible(false);
				}
			}
		});
		zacznij.setAlignmentX(Component.CENTER_ALIGNMENT);
		zacznij.setBounds(0, 0, 100, 40);
		add(zacznij);
		
		JLabel punkty = new JLabel("Punkty:");
		punkty.setForeground(Color.LIGHT_GRAY);
		punkty.setFont(new Font("Tekton Pro Cond", Font.BOLD, 20));
		punkty.setBounds(0, 50, 100, 25);
		add(punkty);
		
		ilosc = new JLabel("0");
		ilosc.setForeground(Color.GREEN);
		ilosc.setFont(new Font("Sylfaen", Font.BOLD | Font.ITALIC, 20));
		ilosc.setBounds(0, 80, 100, 25);
		add(ilosc);
		
		predkosc = new JSlider();
		predkosc.setPaintTicks(true);
		predkosc.setPaintLabels(true);
		predkosc.setValue(5);
		predkosc.setMinimum(1);
		predkosc.setMaximum(10);
		predkosc.setMajorTickSpacing(1);
		predkosc.setBounds(0, 105, 100, 200);
		predkosc.setOrientation(SwingConstants.VERTICAL);
		predkosc.setEnabled(true);
		add(predkosc);
		
	}
}


import java.awt.Color;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.Random;

import javax.swing.JPanel;


public class centrum extends JPanel 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;
	
	ArrayList<Integer> x,y;
	Thread t;
	prawa prawa;
	menu menu;
	ranking ranking;
	
	boolean left=false,right=true,up=false,down=false;
	
	public void referencja(prawa prawa, menu menu, ranking ranking){
		this.prawa = prawa;
		this.menu = menu;
		this.ranking = ranking;
	}
	
	public centrum() {
		
		this.setLayout(null);
		this.setBounds(0, 0, 500, 500);
		
		x = new ArrayList<Integer>();            
		y = new ArrayList<Integer>();            
		
		for(int i =0;i<(dots)*10;i+=10){
			x.add(100-i);
			y.add(250);
		}
		
		r = new Random();
		t = new Thread(this);
	}
	
	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(47)*10+10;
					aY = r.nextInt(44)*10+10;
				}
				if(aX==x.get(0) && aY==y.get(0)){
					apple=false;
					x.add(-50);
					y.add(-50);
					dots++;
					prawa.ilosc.setText(Integer.parseInt(prawa.ilosc.getText())+prawa.predkosc.getValue()+"");
				}
				
				repaint();
				try {
					Thread.sleep(300/prawa.predkosc.getValue());
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
				if ( (x.get(0) == 0 || x.get(0) == 490 || y.get(0) == 0 || y.get(0) == 460) || najechanie()){
					ramka=false;
					try {
						czysc = true;
						ranking.punkty.setText(prawa.ilosc.getText());
						prawa.predkosc.setVisible(true);
						prawa.zacznij.setVisible(true);
						menu.ran.setVisible(true);
						
						wait();
						repaint();
						prawa.ilosc.setText("0");
						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;
	}
	
	
	public void paint(Graphics g){
		
		if(ramka==false){
			for(int i = 0;i<500;i+=10){
				g.setColor(Color.BLUE);
				g.fillRect(i, 0, 10, 10);
				g.fillRect(0, i, 10, 10);				// rysowanie granic
				g.fillRect(490, i, 10, 10);
				g.fillRect(i, 460, 10, 15);
			}
		}
		
		g.setColor(Color.GREEN);
		g.fillRect(x.get(0), y.get(0), 10, 10);
		
		int k=0;
		for(int i=1;i<dots-1;i++){
			if(i>125){
				k=i-125;
				g.setColor(new Color(255-k*2,k*2,255-k*2));
			}
			else{
				k=i;
				g.setColor(new Color(k*2,255-k*2,k*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);
			}
			czysc=false;
		}
		
	}
}


import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.NoSuchElementException;
import java.util.Scanner;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;


public class ranking extends JDialog{
	private static final long serialVersionUID = 1L;

	File plikDane;
	Scanner skanuj;
	String plik;
	PrintWriter zapisz;
	prawa prawa;
	JLabel punkty;
	JTextField nicktext;
	
	ArrayList<String> lista = new ArrayList<String>();
	ArrayList<String> points = new ArrayList<String>();
	
	JLabel l[] = new JLabel[5];
	JLabel p[] = new JLabel[5];
	public ranking(JFrame okno, prawa prawa){
		super(okno,"RANKING GRACZY",true);
		this.prawa=prawa;
		
		setResizable(false);
		getContentPane().setEnabled(false);
		this.setSize(300, 300);
		getContentPane().setLayout(null);
		Dimension location = new Dimension(Toolkit.getDefaultToolkit().getScreenSize());
		setLocation((location.width-300)/2,(location.height-300)/2);
		
		JButton zatwierdz = new JButton("OK");
		zatwierdz.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				if(!nicktext.getText().trim().equals("")){
					pozycjonowanie();
					zmienDane();
					setVisible(false);
				}
			}
		});
		zatwierdz.setBounds(50, 230, 90, 30);
		getContentPane().add(zatwierdz);
		
		JButton wroc = new JButton("Anuluj");
		wroc.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				setVisible(false);
			}
		});
		wroc.setBounds(150, 230, 90, 30);
		getContentPane().add(wroc);
		
		JLabel nick = new JLabel("Podaj swój nick");
		nick.setFont(new Font("Tekton Pro", Font.PLAIN, 30));
		nick.setBounds(57, 11, 184, 30);
		getContentPane().add(nick);
		
		l[0] = new JLabel("New label");
		l[0].setBounds(50, 77, 100, 14);
		getContentPane().add(l[0]);
		
		l[1] = new JLabel("New label");
		l[1].setBounds(50, 102, 100, 14);
		getContentPane().add(l[1]);
		
		l[2] = new JLabel("New label");
		l[2].setBounds(50, 127, 100, 14);
		getContentPane().add(l[2]);
		
		l[3] = new JLabel("New label");
		l[3].setBounds(50, 155, 100, 14);
		getContentPane().add(l[3]);
		
		l[4] = new JLabel("New label");
		l[4].setBounds(50, 180, 100, 14);
		getContentPane().add(l[4]);
		
		nicktext = new JTextField();
		nicktext.setBounds(54, 46, 128, 20);
		getContentPane().add(nicktext);
		nicktext.setColumns(10);
		
		JLabel wynik = new JLabel("WYNIK");
		wynik.setFont(new Font("Tekton Pro", Font.BOLD | Font.ITALIC, 14));
		wynik.setBounds(192, 46, 46, 14);
		getContentPane().add(wynik);
		
		punkty = new JLabel("0");
		punkty.setForeground(Color.GREEN);
		punkty.setFont(new Font("Tahoma", Font.BOLD | Font.ITALIC, 14));
		punkty.setBounds(238, 46, 46, 14);
		getContentPane().add(punkty);
		
		
		p[0] = new JLabel("New label");
		p[0].setBounds(150, 77, 46, 14);
		getContentPane().add(p[0]);
		
		p[1] = new JLabel("New label");
		p[1].setBounds(150, 102, 46, 14);
		getContentPane().add(p[1]);
		
		p[2] = new JLabel("New label");
		p[2].setBounds(150, 127, 46, 14);
		getContentPane().add(p[2]);
		
		p[3] = new JLabel("New label");
		p[3].setBounds(150, 155, 46, 14);
		getContentPane().add(p[3]);
		
		p[4] = new JLabel("New label");
		p[4].setBounds(150, 180, 46, 14);
		getContentPane().add(p[4]);

		wczytywanie();
	}
	
	@SuppressWarnings("resource")
	private void wczytywanie(){
		plik = "ranking.txt";
		plikDane= new File(plik);
		try {
			Scanner skanuj = new Scanner(plikDane);
			while(skanuj.hasNextLine()){
				lista.add(skanuj.nextLine());
				points.add(skanuj.nextLine());
			}
			
			for (int i=0;i<5;i++){
				l[i].setText(lista.get(i));
				p[i].setText(points.get(i)+"");
			}
		}
		catch (FileNotFoundException e) { 
			nowyPlik();
			}
		catch (NoSuchElementException f) {
			}
	}
	
	private void nowyPlik(){
		String plik = "ranking.txt";
		try {
			zapisz = new PrintWriter(plik);
				zapisz.println("Anonim ");
				zapisz.println("500");
				zapisz.println("Anonim ");
				zapisz.println("415");
				zapisz.println("Anonim ");
				zapisz.println("364");
				zapisz.println("Anonim ");
				zapisz.println("274");
				zapisz.println("Anonim ");
				zapisz.println("170");
			zapisz.close();
			wczytywanie();
		}
		catch (FileNotFoundException e) {
		}
	}
	
	private void zmienDane(){
		String plik = "ranking.txt";
		try {
			zapisz = new PrintWriter(plik);
			for(int i = 0; i<lista.size();i++){
				zapisz.println(lista.get(i));
				zapisz.println(points.get(i));
			}
			zapisz.close();
			wczytywanie();
		}
		catch (FileNotFoundException e) {
		}
	}
	
	private void pozycjonowanie(){
		for(int i = 0;i<points.size();i++){
			if( Integer.parseInt(points.get(i)) < Integer.parseInt(punkty.getText())){
				points.add(i, punkty.getText()+"");
				points.remove(points.size()-1);
				
				lista.add(i, nicktext.getText().trim()+"");
				lista.remove(lista.size()-1);
				break;
			}
		}
	}
}
