I have downloaded a snake game project in java. Initially the project contains three java files i.e "
Engine.java
Snake.java
GameBoard.java
And Engine.java have the main() method, when i run this Engine.java class game starts running.
And to improve the user iteractivity i have created two JFrames :"PlayGame.java", Rules.java
Now this project having five java classes in this project-
Engine.java(containing main() method) 
Snake.java 
GameBoard.java 
PlayGame.java(is a JFrame) 
Rules.java(is a JFrame)
PlayGame.java have three buttons
Play - i want when play button getclicked snake game start/run. 
Rules - when clicked Rules.java Jframe should be opened 
Exit - exits the application
Now what i want is at first "PlayGame.java" JFrame should appear and throw this game should start i.e when I click play button game should start But problem I am facing on running theapplication 'PlayGame.java' Jframe displaying on the window but when I click 'play button' SnakeFrame appears but snake is not moving. So please give me solution so that I can make project in running state.
For better understandability of the prolem I am attachig some code in my question
Main() method code:
	Code:
	public static void main(String[] args)  {
		new PlayGame().setVisible(true);
 
		/**JFrame frame = new JFrame("SnakeGame");
		frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
		frame.setResizable(false);
 
		Canvas canvas = new Canvas();
		canvas.setBackground(Color.black);
		canvas.setPreferredSize(new Dimension(GameBoard.MAP_SIZE * GameBoard.TILE_SIZE, GameBoard.MAP_SIZE * GameBoard.TILE_SIZE));
 
		frame.getContentPane().add(canvas);
		frame.pack();
		frame.setLocationRelativeTo(null);
		frame.setVisible(true); 
 
		new Engine(canvas).startGame();*/
 
 
             }
 ActionPerformed() method of Play Button
	Code:
	private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
 
                JFrame frame = new JFrame("SnakeGame");
		frame.setVisible(true); 
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		frame.setResizable(true);
		Canvas canvas = new Canvas();
		canvas.setBackground(Color.black);
                canvas.setPreferredSize(new Dimension(GameBoard.MAP_SIZE * GameBoard.TILE_SIZE, GameBoard.MAP_SIZE * GameBoard.TILE_SIZE));
 
                frame.getContentPane().add(canvas); 
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
                new Engine(canvas).startGame();
    }
 And also I am attaching two classes which are major I this project or which involve the functioning of snake game
First is Engie.java
	Code:
	package org.psnbtech;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import org.psnbtech.GameBoard.TileType;
import org.psnbtech.Snake.Direction;
public class Engine extends KeyAdapter {
	private static final int UPDATES_PER_SECOND = 15;
	
	private static final Font FONT_SMALL = new Font("Arial", Font.BOLD, 20);
	
	private static final Font FONT_LARGE = new Font("Arial", Font.BOLD, 40);
		
	public Canvas canvas;
	
	public GameBoard board;
	
	public Snake snake;
	
	public int score;
	
	public boolean gameOver;
       
				
	public Engine(Canvas canvas) {
                this.canvas = canvas;
        	this.board = new GameBoard();
		this.snake = new Snake(board);
		
		resetGame();
		
		canvas.addKeyListener(this);
                //new Engine(canvas).startGame();
	}
	
	public void startGame() {
		canvas.createBufferStrategy(2);
		
		Graphics2D g = (Graphics2D)canvas.getBufferStrategy().getDrawGraphics();
		g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		
		long start = 0L;
		long sleepDuration = 0L;
		while(true) {
			start = System.currentTimeMillis();
			update();
			render(g);
			canvas.getBufferStrategy().show();
			g.clearRect(0, 0, canvas.getWidth(), canvas.getHeight());
			
			sleepDuration = (1500L / UPDATES_PER_SECOND) - (System.currentTimeMillis() - start);
			if(sleepDuration > 0) {
				try {
					Thread.sleep(sleepDuration);
				} catch(Exception e) {
                                    e.printStackTrace();
				}
			}
		}
	}
            
	public void update() {
		if(gameOver || !canvas.isFocusable()) {
			return;
		}
		TileType snakeTile = snake.updateSnake();
		if(snakeTile == null || snakeTile.equals(TileType.SNAKE)) {
			gameOver = true;
		} else if(snakeTile.equals(TileType.FRUIT)) {
			score += 10;
			spawnFruit();
		}
	}
	
	public void render(Graphics2D g) {
		board.draw(g);
		
		g.setColor(Color.WHITE);
		
		if(gameOver) {
			g.setFont(FONT_LARGE);
			String message = new String("Your Score: " + score);
			g.drawString(message, canvas.getWidth() / 2 - (g.getFontMetrics().stringWidth(message) / 2), 250);
			
			g.setFont(FONT_SMALL);
			message = new String("Press Enter to Restart the Game");
			g.drawString(message, canvas.getWidth() / 2 - (g.getFontMetrics().stringWidth(message) / 2), 350);
		} else {
			g.setFont(FONT_SMALL);
			g.drawString("Score:" + score, 10, 20);
		}
	}
	
	public void resetGame() {
		board.resetBoard();
		snake.resetSnake();
		score = 0;
		gameOver = false;
		spawnFruit();
	}
	
	public void spawnFruit() {
		int random = (int)(Math.random() * ((GameBoard.MAP_SIZE * GameBoard.MAP_SIZE) - snake.getSnakeLength())); // if '*' replace by '/' then only one fruit is there for snake
		
		int emptyFound = 0;
		int index = 0;
		while(emptyFound < random) {
			index++;
			if(board.getTile(index % GameBoard.MAP_SIZE, index / GameBoard.MAP_SIZE).equals(TileType.EMPTY)) { // if '/' replaced by '*' then nothing displays on the board 
				emptyFound++;
			}
		}
		board.setTile(index % GameBoard.MAP_SIZE, index / GameBoard.MAP_SIZE, TileType.FRUIT); // it also show nothing when replacing '/' by '/' 
	}
	
	@Override
	public void keyPressed(KeyEvent e) {
		if((e.getKeyCode() == KeyEvent.VK_UP)||(e.getKeyCode() == KeyEvent.VK_W)) {
			snake.setDirection(Direction.UP);
		}
		if((e.getKeyCode() == KeyEvent.VK_DOWN)||(e.getKeyCode() == KeyEvent.VK_S)) {
			snake.setDirection(Direction.DOWN);
		}
		if((e.getKeyCode() == KeyEvent.VK_LEFT)||(e.getKeyCode() == KeyEvent.VK_A)) {
			snake.setDirection(Direction.LEFT);
		}
		if((e.getKeyCode() == KeyEvent.VK_RIGHT)||(e.getKeyCode() == KeyEvent.VK_D)) {
			snake.setDirection(Direction.RIGHT);
		}
		if(e.getKeyCode() == KeyEvent.VK_ENTER && gameOver) {
			resetGame();
		}
	}
	
	     public static void main(String[] args)  {
		new PlayGame().setVisible(true);
               
		/**JFrame frame = new JFrame("SnakeGame");
		frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
		frame.setResizable(false);
		
		Canvas canvas = new Canvas();
		canvas.setBackground(Color.black);
		canvas.setPreferredSize(new Dimension(GameBoard.MAP_SIZE * GameBoard.TILE_SIZE, GameBoard.MAP_SIZE * GameBoard.TILE_SIZE));
		
		frame.getContentPane().add(canvas);
		frame.pack();
		frame.setLocationRelativeTo(null);
		frame.setVisible(true); 
		
		new Engine(canvas).startGame();*/
  
                
             }        
}
 Second is PlayGame.java
	Code:
	
package org.psnbtech;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JFrame;
public class PlayGame extends javax.swing.JDialog {
   
    public PlayGame(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
    }
 public PlayGame() {
        initComponents();
       
    }
    
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();
        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        jButton1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/psnbtech/play.png"))); // NOI18N
        jButton1.setText("Play");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });
        jButton2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/psnbtech/GUID-4ED364DF-2D44-40F5-9F05-31D451F15EF1-low.png"))); // NOI18N
        jButton2.setText("Rules");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });
        jButton3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/psnbtech/exit.png"))); // NOI18N
        jButton3.setText("Exit");
        jButton3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton3ActionPerformed(evt);
            }
        });
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(223, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jButton3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jButton2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addGap(74, 74, 74))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(45, 45, 45)
                .addComponent(jButton1)
                .addGap(40, 40, 40)
                .addComponent(jButton2)
                .addGap(40, 40, 40)
                .addComponent(jButton3, javax.swing.GroupLayout.PREFERRED_SIZE, 42, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(53, Short.MAX_VALUE))
        );
        pack();
    }// </editor-fold>                        
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    JFrame frame = new JFrame("SnakeGame"); 
    frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
    frame.setResizable(false);
 
    Canvas canvas = new Canvas();
    canvas.setBackground(Color.black);
    canvas.setPreferredSize(new Dimension(GameBoard.MAP_SIZE *GameBoard.TILE_SIZE,GameBoard.MAP_SIZE * GameBoard.TILE_SIZE));
 
    frame.add(canvas);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true); 
 
    new Engine(canvas).startGame();
    
    }                                        
    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
                this.dispose();
                new RulesDialog().setVisible(true);
    }                                        
    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
                System.exit(0);
    }                                        
    
   
    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    // End of variables declaration                   
}
 Please suggest me with some solution so that it would be helpful to me in order to complete the game