Тексти файлів проекту

Файл GameSnake.java

 

public class GameSnake {

   

public static void main(String[] args) {

   GameFrame window = new GameFrame();

}

}



Файл GameFrame.java

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

 

public class GameFrame extends JFrame{

   

GameField field;

MenuString menu;

boolean running = false;

       

public GameFrame() {

   setDefaultLookAndFeelDecorated(true);

   setSize(400, 300);

   setTitle("Гра Змійка");

       

   menu = new MenuString(this);

   field = new GameField(this);

 

   getContentPane().add(field);

   setJMenuBar(menu);

 

   addWindowListener(new WindowAdapter() {

       public void windowClosing(WindowEvent e) {

           dispose();

           System.exit(0);

       }

   });

   addKeyListener(field);

   setVisible(true);

}

   

public void newGame(){

   field.newGame();

}     

 

public void pauseGame(){

   field.pauseGame();

}

   

public void stopGame(){

   field.stopGame();

}

}



Файл GameField.java

import java.awt.*;

import javax.swing.*;

import java.util.*;

import java.awt.event.*;

 

public class GameField extends JPanel

                   implements Runnable, KeyListener{

Snake snake;

GameFrame frame;

SnakeElement targetElem;

InformPanel informPanel;

protected boolean isGameRun;

protected boolean isGamePause = false;

int gameSpeed = 2;

protected int colObstacles = 12;//Кількість перепон

protected int delay;//Затримка при русі змійки

final int w = 35, h = 25;

protected Thread th;

protected GameSquare square[][];

boolean keyBlocked = false;

boolean crash = false;

boolean target = false;

   

public GameField(GameFrame owner) {

   super();

   frame = owner;

   this.setLayout(null);

   Random rnd = new Random();

   square = new GameSquare[w][h];

   for(int x = 0; x<w; x++){

       for(int y = 0; y<h; y++){

           square[x][y] = new GameSquare();

           add(square[x][y]);

       }

   }

   informPanel = new InformPanel(this);

   frame.getContentPane().add(informPanel, BorderLayout.EAST);

   clearSquares();

   createSnake();

   createBorders();

     start();

}

public void setDefault(){

   clearSquares();

   createSnake();

   createBorders();

      

   createObstacles(colObstacles);

   createTarget();

   informPanel.updateInfo(snake.getLives(), snake.colElements,

                           gameSpeed, colObstacles);

}

   

public void clearSquares(){

   for(int x = 0; x<w; x++){

       for(int y = 0; y<h; y++){

           square[x][y].setBorder(false);

           square[x][y].setUsed(false);

       }

   }

}

   

protected void createSnake(){

   snake = new Snake(5, w/2, h-2);

   for (int i = 0; i<snake.colElements; i++){

       square[snake.elem[i].xPos][snake.elem[i].yPos].setUsed(true);

       square[snake.elem[i].xPos][snake.elem[i].yPos].setBorder(true);

       square[snake.elem[i].xPos][snake.elem[i].yPos].n = i;

   }

}

   

protected void createBorders(){

   for (int i = 0; i<w; i++){

       square[i][0].setBorder(true);

       square[i][h-1].setBorder(true);

   }

   for (int i = 0; i<h; i++){

       square[0] [i].setBorder(true);

       square[w-1][i].setBorder(true);

   }

}

   

protected void createObstacles(int col){//створює n ререпон на ігровому полі

   Random rnd = new Random();

   int x, y;

   for (int i = 0; i<col; i++){

       do{

           x = Math.abs(rnd.nextInt(w));

           y = Math.abs(rnd.nextInt(h));

       } while (square[x][y].isBorder);

       square[x][y].setBorder(true);

   }

}

   

protected void createTarget(){//Мішень для змійки

   Random rnd = new Random();

   int x, y;

       

targetElem = new SnakeElement(0, 0);

   do{

       x = Math.abs(rnd.nextInt(w));

       y = Math.abs(rnd.nextInt(h));

   } while (square[x][y].isBorder);

   targetElem.setSpeed(0, 0);

   targetElem.xPos = x; targetElem.yPos = y;

   square[x][y].setUsed(true);

}

   

public void paintComponent(Graphics g){

   super.paintComponent(g);

   int squareW = (getWidth())/w;

   int squareH = (getHeight())/h;

      for(int x = 0; x<w; x++){

       for(int y = 0; y<h; y++){

           square[x][y].setSize(squareW, squareH);

           square[x][y].setLocation(x*squareW, y*squareH);

       }

   }

   g.setColor(Color.BLUE);

   g.setFont(new Font("1", Font.BOLD, 20));

   if (!isGameRun){

       g.drawString("Розпочніть нову гру", 40, 100);

   } else {

       if (isGamePause){

           g.drawString("ПАУЗА", 100, 100);

       }

   }

}

   

public void run (){

   while (true){

       if (isGameRun &&!isGamePause){

           keyBlocked = true;

           int n = snake.colElements-1;

           SnakeElement lastElem = new SnakeElement(snake.elem[n].xPos, snake.elem[n].yPos);

           lastElem.setSpeed(snake.elem[n].xSpeed, snake.elem[n].ySpeed);

           square[lastElem.xPos][lastElem.yPos].setUsed(false);

           square[lastElem.xPos][lastElem.yPos].setBorder(false);

           snake.move();

           crash = square[snake.elem[0].xPos][snake.elem[0].yPos].isBorder;

           target =!crash &&

                   square[snake.elem[0].xPos][snake.elem[0].yPos].used;

           if (target){

               snake.increment(lastElem);   

               createTarget();

                

           cheeckWin();

           }

           keyBlocked = false;

           for (int i = 0; i<snake.colElements; i++){

               square[snake.elem[i].xPos][snake.elem[i].yPos].setUsed(true);

               square[snake.elem[i].xPos][snake.elem[i].yPos].setBorder(true);

               square[snake.elem[i].xPos][snake.elem[i].yPos].n = i;

           }

           if (crash) { processCrash();   }

           repaint();           

           informPanel.updateInfo(snake.getLives(), snake.colElements,

                                       gameSpeed, colObstacles);           

           informPanel.repaint();

           try { Thread.sleep (delay);   }

           catch (InterruptedException ex){ }

       }   

   }

}

   

public void cheeckWin(){

   if (snake.isMaxLong()) {

       JOptionPane.showMessageDialog(frame,

               "Ви перемогли!\nНа швидкості "+gameSpeed, "Ігрова інформація",

               JOptionPane.INFORMATION_MESSAGE);

       stopGame();

       try { Thread.sleep (delay*2);   }

       catch (InterruptedException ex){ }

       setDefault();

   }

}

 

public void processCrash(){

   snake.decrementLive();

   if (snake.isKilled()) {

       JOptionPane.showMessageDialog(frame,

               "Гру завершено!", "Ігрова інформація",

               JOptionPane.INFORMATION_MESSAGE);

       stopGame();

   }

   try { Thread.sleep (delay*2);   }

   catch (InterruptedException ex){ }

   setDefault();       

}

   

public void newGame(){

   if (isGameRun) stopGame();

   setDefault();

 

 

   snake.resetLives();

   isGameRun = true;

   isGamePause = false; 

}

   

public void pauseGame(){

   isGamePause =!isGamePause;

   if (isGamePause){

       keyBlocked = true;

       repaint();

   } else{

       keyBlocked = false;

   }

}

   

public void stopGame(){

   isGameRun = false;

   repaint();

}

 

public void setGameSpeed(int s){

   gameSpeed = s;

      switch (gameSpeed){

       case 1: delay = 400; break;

       case 2: delay = 200; break;

       case 3: delay = 100; break;

   }

   informPanel.updateInfo(snake.getLives(), snake.colElements,

                           gameSpeed, colObstacles);

}

 

public void start(){

   isGameRun = false;

   setGameSpeed(2);

   th = new Thread(this);

   th.start();

}

   

public void stop(){}

   

public void keyPressed (KeyEvent e){

   switch (e.getKeyCode()) { // Яку клавішу натиснули.

          case KeyEvent.VK_LEFT :

              if (!snake.elem[0].isMovingRight() &&!keyBlocked){

               snake.setMoveLeft();

               keyBlocked = true;

           }

           break;

 

 

        case KeyEvent.VK_RIGHT:

              if (!snake.elem[0].isMovingLeft() &&!keyBlocked){

               snake.setMoveRight();

               keyBlocked = true;

           }

           break;

          case KeyEvent.VK_UP   :

              if (!snake.elem[0].isMovingDown() &&!keyBlocked){

               snake.setMoveUp();

               keyBlocked = true;

           }

           break;

          case KeyEvent.VK_DOWN :

              if (!snake.elem[0].isMovingUp() &&!keyBlocked){

               snake.setMoveDown();

               keyBlocked = true;

           }

           break;

       case KeyEvent.VK_SPACE:

           newGame();

           break;

       case KeyEvent.VK_P        :

           pauseGame();

           break;

   }

}

 

public void keyTyped(KeyEvent e){}

 

public void keyReleased(KeyEvent e){}   

}

 




Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: