Facebook
From abc, 2 Years ago, written in Java.
Embed
Download Paste or View Raw
Hits: 522
  1. import javax.swing.*;
  2. import java.awt.*;
  3. import java.awt.event.*;
  4.  
  5. class WindowPanel extends JPanel implements ActionListener, KeyListener
  6. {
  7.     public static final int M_TILE   = 25;
  8.     public static final int M_WIDTH  = M_TILE * 25;
  9.     public static final int M_HEIGHT = M_TILE * 25;
  10.     public static final int M_FPS    = 15;
  11.     public static final int M_DELAY  = 1000 / M_FPS;
  12.  
  13.     private Timer m_timer = new Timer( M_DELAY, this );
  14.     private Font  m_font  = new Font( "MS Gothic", Font.PLAIN, 100 );
  15.    
  16.     private int m_iFruitX, m_iFruitY;
  17.     private int m_iSnakeLength = 4;
  18.     private char m_cDir = 'r';          // r, l, u, d
  19.     private boolean m_bGameOver = false;
  20.     private int[] m_iSnakeX, m_iSnakeY;
  21.    
  22.     @Override public void paintComponent( Graphics g )
  23.     {
  24.         super.paintComponent( g );
  25.         // Snake        
  26.         g.setColor( Color.GREEN );
  27.         for ( int i = 0; i < m_iSnakeLength; i++ )
  28.             g.fillRect( m_iSnakeX[ i ], m_iSnakeY[ i ], M_TILE, M_TILE );
  29.         // Fruit
  30.         g.setColor( Color.RED );
  31.         g.fillRect( m_iFruitX, m_iFruitY, M_TILE, M_TILE );
  32.         // Grid
  33.         g.setColor( Color.WHITE );
  34.         for ( int i = 0; i < M_WIDTH; i += M_TILE )
  35.             for ( int j = 0; j < M_HEIGHT; j += M_TILE )
  36.                 g.drawRect( i, j, M_TILE, M_TILE );
  37.         // Game Over
  38.         if ( m_bGameOver ) {
  39.             g.setColor( Color.YELLOW );
  40.             g.setFont( m_font );
  41.             g.drawString( "GAME OVER", M_WIDTH / 2 - 233, M_HEIGHT / 2 );
  42.         }
  43.         g.dispose();
  44.     }
  45.  
  46.     @Override public void actionPerformed( ActionEvent e )
  47.     {
  48.         if ( !m_bGameOver ) {
  49.             for ( int i = m_iSnakeLength; i > 0; i-- ) {
  50.                 m_iSnakeX[ i ] = m_iSnakeX[ i - 1 ];
  51.                 m_iSnakeY[ i ] = m_iSnakeY[ i - 1 ];
  52.             }
  53.             if ( m_cDir == 'r' ) m_iSnakeX[ 0 ] += M_TILE;
  54.             if ( m_cDir == 'l' ) m_iSnakeX[ 0 ] -= M_TILE;
  55.             if ( m_cDir == 'u' ) m_iSnakeY[ 0 ] -= M_TILE;
  56.             if ( m_cDir == 'd' ) m_iSnakeY[ 0 ] += M_TILE;
  57.             if ( m_iSnakeX[ 0 ] < 0 )
  58.                 m_iSnakeX[ 0 ] = M_WIDTH;
  59.             if ( m_iSnakeY[ 0 ] < 0 )
  60.                 m_iSnakeY[ 0 ] = M_HEIGHT;
  61.             if ( m_iSnakeX[ 0 ] > M_WIDTH )
  62.                 m_iSnakeX[ 0 ] = 0;
  63.             if ( m_iSnakeY[ 0 ] > M_HEIGHT )
  64.                 m_iSnakeY[ 0 ] = 0;
  65.             if ( m_iSnakeX[ 0 ] == m_iFruitX &&
  66.                  m_iSnakeY[ 0 ] == m_iFruitY ) {
  67.                 m_iSnakeLength++;
  68.                 m_iFruitX = new java.util.Random().nextInt( M_WIDTH  / M_TILE );
  69.                 m_iFruitY = new java.util.Random().nextInt( M_HEIGHT / M_TILE );
  70.                 m_iFruitX *= M_TILE;
  71.                 m_iFruitY *= M_TILE;
  72.             }
  73.             for ( int i = m_iSnakeLength; i > 0; i-- ) {
  74.                 if ( m_iSnakeX[ 0 ] == m_iSnakeX[ i ] &&
  75.                      m_iSnakeY[ 0 ] == m_iSnakeY[ i ] )
  76.                     m_bGameOver = true;
  77.             }
  78.         }
  79.         repaint();
  80.     }
  81.  
  82.     @Override public void keyPressed( KeyEvent e )
  83.     {
  84.         if ( e.getKeyCode() == KeyEvent.VK_RIGHT )
  85.             if ( m_cDir != 'l' )
  86.                 m_cDir = 'r';
  87.         if ( e.getKeyCode() == KeyEvent.VK_LEFT )
  88.             if ( m_cDir != 'r' )
  89.                 m_cDir = 'l';
  90.         if ( e.getKeyCode() == KeyEvent.VK_UP )
  91.             if ( m_cDir != 'd' )
  92.                 m_cDir = 'u';
  93.         if ( e.getKeyCode() == KeyEvent.VK_DOWN )
  94.             if ( m_cDir != 'u' )
  95.                 m_cDir = 'd';
  96.     }
  97.  
  98.     @Override public void keyTyped( KeyEvent e ) {}
  99.     @Override public void keyReleased( KeyEvent e ) {}
  100.    
  101.     public WindowPanel()
  102.     {
  103.         this.setFocusable( true );
  104.         this.setDoubleBuffered( true );
  105.         this.setPreferredSize( new Dimension( M_WIDTH, M_HEIGHT ) );
  106.         this.setBackground( Color.BLACK );
  107.         this.addKeyListener( this );
  108.         m_iFruitX = new java.util.Random().nextInt( M_WIDTH  / M_TILE );
  109.         m_iFruitY = new java.util.Random().nextInt( M_HEIGHT / M_TILE );
  110.         m_iFruitX *= M_TILE;
  111.         m_iFruitY *= M_TILE;
  112.         m_iSnakeX = new int[ 200 ];
  113.         m_iSnakeY = new int[ 200 ];
  114.         m_timer.start();
  115.     }
  116. }
  117.  
  118. public class Main extends JFrame
  119. {
  120.     public Main()
  121.     {
  122.         this.add( new WindowPanel() );
  123.         this.pack();
  124.         this.setTitle( "Snake" );
  125.         this.setResizable( false );
  126.         this.setLocationRelativeTo( null );
  127.         this.setVisible( true );
  128.         this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
  129.     }
  130.  
  131.     public static void main( String[] args )
  132.     {
  133.         new Main();
  134.     }
  135. }
  136.