ому для даної роботи було обрано мову Java, як найбільш ефективну та багато платформну.2.6. ВисновокВраховуючи аналіз предметної області і проект програми, можливо зробити висновок, що розроблена гра „Змійка” розрахована на широке коло користувачів завдяки своїй простоті. Модель програми дозволяє легко та зручно її модернізувати: додати нові команди; зробити сприйнятливий для користувача інтерфейс.3. Додаток3.1. Тексти файлів проекту3.1.1. Файл GameSnake.java public class GameSnake { public static void main(String[] args) { GameFrame window = new GameFrame(); } } 3.1.2. Файл GameFrame.javaimport 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(); } } 3.1.3. Файл GameField.javaimport 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(){}
Страницы: 1, 2, 3
|