Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import javax.swing.*;
- import java.awt.*;
- import java.awt.event.*;
- import java.util.Random;
- class MyPanel extends JPanel {
- private int mapHeight, mapWidth, x[], y[], length, headX, headY, coinX, coinY;
- private boolean used[][];
- private int direction;
- static public final int dirLeft = 1, dirRight = 2, dirUp = 3, dirDown = 4;
- private Random rand;
- private MyFrame frame;
- private Game game;
- public void pauseGame() {
- if (game != null) game.ok = false;
- }
- public void resumeGame() {
- game = new Game(this);
- }
- public void lose() {
- for (int i = 0; i < mapHeight; ++i)
- for (int j = 0; j < mapWidth; ++j) used[i][j] = false;
- headX = mapHeight / 2;
- headY = mapWidth / 2;
- x[0] = headX;
- y[0] = headY;
- on(headX, headY);
- length = 1;
- direction = 0;
- repaint();
- }
- private void on(int x,int y) {
- used[x][y] = true;
- }
- private void off(int x,int y) {
- used[x][y] = false;
- }
- private void nextCoin() {
- int x, y;
- do {
- x = rand.nextInt(mapHeight);
- y = rand.nextInt(mapWidth);
- if (!used[x][y]) break;
- } while (true);
- coinX = x;
- coinY = y;
- }
- public MyPanel(int x, int y, MyFrame frame) {
- this.frame = frame;
- rand = new Random();
- rand.setSeed(100);
- length = 0;
- mapHeight = x;
- mapWidth = y;
- setSize(20 * y, 20 * x);
- this.x = new int [x * y];
- this.y = new int [x * y];
- used = new boolean[x][];
- for (int i = 0; i < x; ++i) used[i] = new boolean[y];
- headX = x / 2;
- headY = y / 2;
- this.x[0] = headX;
- this.y[0] = headY;
- on(headX, headY);
- length = 1;
- }
- public void paint(Graphics g) {
- g.setColor(Color.white);
- g.fillRect(0, 0, 20 * mapWidth, 20 * mapHeight);
- for (int i = 0; i < mapHeight; ++i)
- for (int j = 0; j < mapWidth; ++j) {
- if (used[i][j]) g.setColor(Color.black);
- else g.setColor(Color.lightGray);
- g.fillRect(20 * j, 20 * i, 19, 19);
- }
- g.setColor(Color.blue);
- g.fillRect(20 * headY, 20 * headX, 19, 19);
- g.setColor(Color.red);
- g.fillRect(20 * coinY, 20 * coinX, 19, 19);
- frame.setTitle(length + "");
- }
- public int getDirectoin() {
- return direction;
- }
- public void setDirection(int newDir) {
- int cx = headX, cy = headY;
- switch (newDir) {
- case dirLeft:
- --cy;
- break;
- case dirRight:
- ++cy;
- break;
- case dirUp:
- --cx;
- break;
- case dirDown:
- ++cx;
- break;
- }
- if (length > 1 && cx == x[length - 2] && cy == y[length - 2]) return;
- direction = newDir;
- go();
- }
- public void go() {
- int n = length - 1;
- switch (direction) {
- case dirLeft:
- --headY;
- break;
- case dirRight:
- ++headY;
- break;
- case dirUp:
- --headX;
- break;
- case dirDown:
- ++headX;
- break;
- }
- if (headX < 0 || headX >= mapHeight || headY < 0 || headY >= mapWidth || used[headX][headY]) {
- lose();
- return;
- }
- if (headX != coinX || headY != coinY) {
- off(x[0], y[0]);
- for (int i = 0; i < n; ++i) {
- x[i] = x[i + 1];
- y[i] = y[i + 1];
- }
- x[n] = headX;
- y[n] = headY;
- on(headX, headY);
- } else {
- x[length] = headX;
- y[length] = headY;
- ++length;
- on(headX, headY);
- nextCoin();
- }
- if (game != null) game.ok = false;
- game = new Game(this);
- repaint();
- }
- }
- class Game implements Runnable {
- private MyPanel panel;
- private Thread t;
- public boolean ok;
- private int time;
- public Game(MyPanel panel) {
- this.panel = panel;
- t = new Thread(this);
- ok = true;
- time = 300;
- t.start();
- }
- public void run() {
- for (;;) {
- try {
- Thread.sleep(time);
- if (ok) panel.go();
- }
- catch (Exception e) {}
- }
- }
- }
- class MyKeyAdapter extends KeyAdapter {
- private MyPanel panel;
- public MyKeyAdapter (MyPanel panel) {
- this.panel = panel;
- }
- public void keyPressed(KeyEvent ke) {
- int code = ke.getKeyCode();
- if (code == KeyEvent.VK_DOWN) panel.setDirection(MyPanel.dirDown);
- if (code == KeyEvent.VK_UP) panel.setDirection(MyPanel.dirUp);
- if (code == KeyEvent.VK_LEFT) panel.setDirection(MyPanel.dirLeft);
- if (code == KeyEvent.VK_RIGHT) panel.setDirection(MyPanel.dirRight);
- if (code == KeyEvent.VK_ESCAPE) System.exit(0);
- }
- }
- class MyMenuHandler implements ActionListener {
- private MyPanel panel;
- public MyMenuHandler (MyPanel panel) {
- this.panel = panel;
- }
- public void actionPerformed(ActionEvent ae) {
- String msg = ae.getActionCommand();
- if (msg.equals("Новая игра")) panel.lose();
- if (msg.equals("Выход")) System.exit(0);
- }
- }
- class MyFrame extends JFrame {
- private MyPanel panel;
- private JMenuBar menuBar;
- private JMenu file;
- private JMenuItem newGame, exit;
- public MyFrame() {
- addWindowListener(new WindowAdapter() {
- public void windowClosing(WindowEvent we) {
- System.exit(0);
- }
- });
- setLayout(null);
- setResizable(false);
- newGame = new JMenuItem("Новая игра");
- exit = new JMenuItem("Выход");
- file = new JMenu("Файл");
- file.add(newGame);
- file.add(exit);
- menuBar = new JMenuBar();
- menuBar.add(file);
- setJMenuBar(menuBar);
- panel = new MyPanel(9, 19, this);
- add(panel);
- setSize(panel.getWidth() + 6, panel.getHeight() + 51);
- MyMenuHandler menuHandler = new MyMenuHandler(panel);
- addKeyListener(new MyKeyAdapter(panel));
- exit.addActionListener(menuHandler);
- newGame.addActionListener(menuHandler);
- setVisible(true);
- }
- }
- public class snake {
- public static void main(String[] args) {
- new MyFrame();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment