Tranvick

Snake

Aug 22nd, 2012
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.51 KB | None | 0 0
  1. import javax.swing.*;
  2. import java.awt.*;
  3. import java.awt.event.*;
  4. import java.util.Random;
  5.  
  6. class MyPanel extends JPanel {
  7.    
  8.     private int mapHeight, mapWidth, x[], y[], length, headX, headY, coinX, coinY;
  9.     private boolean used[][];
  10.     private int direction;
  11.     static public final int dirLeft = 1, dirRight = 2, dirUp = 3, dirDown = 4;
  12.     private Random rand;
  13.     private MyFrame frame;
  14.     private Game game;
  15.  
  16.     public void pauseGame() {
  17.         if (game != null) game.ok = false;
  18.     }
  19.    
  20.     public void resumeGame() {
  21.         game = new Game(this);
  22.     }
  23.    
  24.     public void lose() {
  25.         for (int i = 0; i < mapHeight; ++i)
  26.             for (int j = 0; j < mapWidth; ++j) used[i][j] = false;
  27.         headX = mapHeight / 2;
  28.         headY = mapWidth / 2;
  29.         x[0] = headX;
  30.         y[0] = headY;
  31.         on(headX, headY);
  32.         length = 1;
  33.         direction = 0;
  34.         repaint();
  35.     }
  36.    
  37.     private void on(int x,int y) {
  38.         used[x][y] = true;
  39.     }
  40.    
  41.     private void off(int x,int y) {
  42.         used[x][y] = false;
  43.     }
  44.  
  45.     private void nextCoin() {
  46.         int x, y;
  47.         do {
  48.             x = rand.nextInt(mapHeight);
  49.             y = rand.nextInt(mapWidth);
  50.             if (!used[x][y]) break;
  51.         } while (true);
  52.         coinX = x;
  53.         coinY = y;
  54.     }
  55.    
  56.     public MyPanel(int x, int y, MyFrame frame) {
  57.         this.frame = frame;
  58.         rand = new Random();
  59.         rand.setSeed(100);
  60.         length = 0;
  61.         mapHeight = x;
  62.         mapWidth = y;
  63.         setSize(20 * y, 20 * x);
  64.         this.x = new int [x * y];
  65.         this.y = new int [x * y];
  66.         used = new boolean[x][];
  67.         for (int i = 0; i < x; ++i) used[i] = new boolean[y];
  68.         headX = x / 2;
  69.         headY = y / 2;
  70.         this.x[0] = headX;
  71.         this.y[0] = headY;
  72.         on(headX, headY);
  73.         length = 1;
  74.     }
  75.    
  76.     public void paint(Graphics g) {
  77.         g.setColor(Color.white);
  78.         g.fillRect(0, 0, 20 * mapWidth, 20 * mapHeight);
  79.         for (int i = 0; i < mapHeight; ++i)
  80.             for (int j = 0; j < mapWidth; ++j) {
  81.                 if (used[i][j]) g.setColor(Color.black);
  82.                 else g.setColor(Color.lightGray);
  83.                 g.fillRect(20 * j, 20 * i, 19, 19);
  84.             }
  85.         g.setColor(Color.blue);
  86.         g.fillRect(20 * headY, 20 * headX, 19, 19);
  87.         g.setColor(Color.red);
  88.         g.fillRect(20 * coinY, 20 * coinX, 19, 19);
  89.         frame.setTitle(length + "");
  90.     }
  91.  
  92.    
  93.     public int getDirectoin() {
  94.         return direction;
  95.     }
  96.    
  97.     public void setDirection(int newDir) {
  98.         int cx = headX, cy = headY;
  99.         switch (newDir) {
  100.         case dirLeft:
  101.             --cy;
  102.             break;
  103.         case dirRight:
  104.             ++cy;
  105.             break;
  106.         case dirUp:
  107.             --cx;
  108.             break;
  109.         case dirDown:
  110.             ++cx;
  111.             break;
  112.         }
  113.         if (length > 1 && cx == x[length - 2] && cy == y[length - 2]) return;
  114.         direction = newDir;
  115.         go();
  116.     }
  117.    
  118.     public void go() { 
  119.         int n = length - 1;
  120.         switch (direction) {
  121.         case dirLeft:
  122.             --headY;
  123.             break;
  124.         case dirRight:
  125.             ++headY;
  126.             break;
  127.         case dirUp:
  128.             --headX;
  129.             break;
  130.         case dirDown:
  131.             ++headX;
  132.             break;
  133.         }
  134.         if (headX < 0 || headX >= mapHeight || headY < 0 || headY >= mapWidth || used[headX][headY]) {
  135.             lose();
  136.             return;
  137.         }
  138.         if (headX != coinX || headY != coinY) {
  139.             off(x[0], y[0]);
  140.             for (int i = 0; i < n; ++i) {
  141.                 x[i] = x[i + 1];
  142.                 y[i] = y[i + 1];
  143.             }
  144.             x[n] = headX;
  145.             y[n] = headY;
  146.             on(headX, headY);
  147.         } else {
  148.             x[length] = headX;
  149.             y[length] = headY;
  150.             ++length;
  151.             on(headX, headY);
  152.             nextCoin();
  153.         }
  154.         if (game != null) game.ok = false;
  155.         game = new Game(this);
  156.         repaint();
  157.     }
  158.    
  159. }
  160.  
  161. class Game implements Runnable {
  162.  
  163.     private MyPanel panel;
  164.     private Thread t;
  165.     public boolean ok;
  166.     private int time;
  167.    
  168.     public Game(MyPanel panel) {
  169.         this.panel = panel;
  170.         t = new Thread(this);
  171.         ok = true;
  172.         time = 300;
  173.         t.start();
  174.     }
  175.    
  176.     public void run() {
  177.         for (;;) {
  178.             try {
  179.                 Thread.sleep(time);
  180.                 if (ok) panel.go();
  181.             }
  182.             catch (Exception e) {}
  183.         }
  184.     }  
  185. }
  186.  
  187. class MyKeyAdapter extends KeyAdapter {
  188.    
  189.     private MyPanel panel;
  190.    
  191.     public MyKeyAdapter (MyPanel panel) {
  192.         this.panel = panel;
  193.     }
  194.  
  195.     public void keyPressed(KeyEvent ke) {
  196.         int code = ke.getKeyCode();
  197.         if (code == KeyEvent.VK_DOWN) panel.setDirection(MyPanel.dirDown);
  198.         if (code == KeyEvent.VK_UP) panel.setDirection(MyPanel.dirUp);
  199.         if (code == KeyEvent.VK_LEFT) panel.setDirection(MyPanel.dirLeft);
  200.         if (code == KeyEvent.VK_RIGHT) panel.setDirection(MyPanel.dirRight);
  201.         if (code == KeyEvent.VK_ESCAPE) System.exit(0);
  202.     }
  203.    
  204. }
  205.  
  206. class MyMenuHandler implements ActionListener {
  207.    
  208.     private MyPanel panel;
  209.    
  210.     public MyMenuHandler (MyPanel panel) {
  211.         this.panel = panel;
  212.     }
  213.    
  214.     public void actionPerformed(ActionEvent ae) {
  215.         String msg = ae.getActionCommand();
  216.         if (msg.equals("Новая игра")) panel.lose();
  217.         if (msg.equals("Выход")) System.exit(0);
  218.     }
  219.    
  220. }
  221.  
  222. class MyFrame extends JFrame {
  223.    
  224.     private MyPanel panel;
  225.     private JMenuBar menuBar;
  226.     private JMenu file;
  227.     private JMenuItem newGame, exit;
  228.    
  229.     public MyFrame() {
  230.        
  231.         addWindowListener(new WindowAdapter() {
  232.             public void windowClosing(WindowEvent we) {
  233.                 System.exit(0);
  234.             }
  235.         });
  236.        
  237.         setLayout(null);
  238.         setResizable(false);
  239.        
  240.         newGame = new JMenuItem("Новая игра");
  241.         exit = new JMenuItem("Выход");
  242.         file = new JMenu("Файл");
  243.         file.add(newGame);
  244.         file.add(exit);
  245.         menuBar = new JMenuBar();
  246.         menuBar.add(file);
  247.         setJMenuBar(menuBar);
  248.  
  249.         panel = new MyPanel(9, 19, this);
  250.         add(panel);
  251.         setSize(panel.getWidth() + 6, panel.getHeight() + 51);
  252.         MyMenuHandler menuHandler = new MyMenuHandler(panel);
  253.         addKeyListener(new MyKeyAdapter(panel));
  254.         exit.addActionListener(menuHandler);
  255.         newGame.addActionListener(menuHandler);
  256.         setVisible(true);
  257.     }
  258.    
  259. }
  260.  
  261. public class snake {
  262.  
  263.     public static void main(String[] args) {
  264.         new MyFrame();
  265.     }
  266.  
  267. }
Advertisement
Add Comment
Please, Sign In to add comment