Professional Documents
Culture Documents
Курсова робота гра
Курсова робота гра
на тему
(прізвище та ініціали)
Керівник
(прізвище та ініціали)
м. Миколаїв – 2022 рік
Зміст
Аннотація
2. Проект програми
2.4. Специфікація
2.5. Кодування
3. Додаток
4. Література
Анотація
Гра «Змійка» - це гра, в якій уявна змійка рухається по ігровому полю
оминаючи перепони і їй потрібно влучити в ціль. Програма є нескладною і
доступна для виконання на багатьох ЕОМ в різних операційних системах з
встановленою Virtual Java Machine. Вона розрахована на широке коло
користувачів завдяки своїй простоті.
Завдання:
Провести аналіз, розробити проект, скласти опис і специфікацію, провести
кодування програми-гри «Змійка» використовуючи методи об’єктно-
орієнтованого програмування.
1.Аналіз предметної області, постановка задачі
1.1.Формулювання проблеми
Комп’ютерні ігри для людини – це не лише засіб розважитись. Вони
допомагають розвинути людську реакцію, інтелект, знання в певних галузях і
областях. Гра змійка – одна з таких ігор. Рівень, до якого дійде гравець,
залежить лише від швидкості його реакції на поточні обставини гри, які
динамічно змінюватимуться в сторону збільшення з кожним новим раундом,
що також сприятиме збільшенню реакції. Провівши частину вільного часу за
грою, можна отримати задоволення від набраних очок і пройдених рівнів.
Якщо людина ніколи не працювала з комп’ютером, то гра допоможе набути
мінімальних навиків з клавіатурою без необхідності розбиратись з складними
правилами великих ігор та програм.
Правила гри такі: на прямокутному ігровому полі створюється змійка, яка
має декілька життів і складається з кількох частин. На полі також
знаходяться клітки-перепони та ціль, в яку змійка має влучити. Змійка
починає рухатися в довільному напрямку на найнижчій швидкості, яка
відповідає першому рівню гри. Коли гравець натискатиме клавіші курсору,
то напрям руху першої частини змійки – «голови» змінюватиметься
відповідно до натиснутої клавіші. Коли голова змійки вийде за межі ігрового
поля чи влучить в одну з перепон, то в залежності від того, залишились чи ні
життя, в змійки або ж буде відняте одне життя, або ж гру буде припинено.
Коли голова змійки «врізається» в ціль, то вона стане новою головою і рух
змійки продовжиться. Коли довжина змійки перевищує максимально
можливу, то даний рівень буде пройдено і гра перейде на наступний. В
наступному рівні швидкість руху збільшується.
1.2.Аналіз предметної області
У грі для створення інтерфейсу користувача - виводу вікна гри, ігрових меню
та кнопок, можна використати стандартні засоби мови JAVA - компоненти
бібліотек AWT (застаріла) чи Swing (більш нова, що є частиною API – Java
Foundation Classes), і тому її використання цієї бібліотеки дає більше
можливостей для графічного оформлення гри – побудова найпростіших
геометричних фігур, розфарбовування областей екрану та інше.
1.3.Постановка задачі
2.2.Ієрархія наслідування
малюнок 2 – Ієрархія класів
2.4.Специфікація
Клас public class Game – головний клас проекту необхідний для запуску гри
Клас public class GameFrame реалізує вікно для відображення ігрового полята
даних гри
Метод public GameFrame() – конструктор вікна гри в якому встановлюються
його параметри.
Змінні:
protected int lives, len, speed, obstacles – кількість життів, довжина змійки,
швидкість змійки, кількість перепон;
Методи
public InformPanel(final GameField field) - Конструктор
public void updateInfo(int lives, int len, int speed, int obstacles) Зміна поточних
даних новими
public void paintComponent(Graphics g) – малювання панелі
Методи
public Snake(int c, int xPos, int yPos) – створення змійки довжини с з заданими
координатами
public void increment(SnakeElement lastElem) додавання до змійки нового
елемента
Змінні:
Змінні:
int w, h - розміри
Методи
mi_StopGame, mi_ExitGame;
Тому для даної роботи було обрано мову Java, як найбільш ефективну та
багато платформну.
Висновок
}
3.1.2.Файл GameFrame.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
GameField field;
MenuString menu;
public GameFrame() {
setDefaultLookAndFeelDecorated(true);
setSize(400, 300);
setTitle("Гра Змійка");
getContentPane().add(field);
setJMenuBar(menu);
addWindowListener(new WindowAdapter() {
dispose();
System.exit(0);
});
addKeyListener(field);
setVisible(true);
field.newGame();
}
field.pauseGame();
field.stopGame();
}
3.1.3Файл GameField.java
import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.awt.event.*;
Snake snake;
GameFrame frame;
SnakeElement targetElem;
InformPanel informPanel;
int gameSpeed = 2;
super();
frame = owner;
this.setLayout(null);
add(square[x][y]);
frame.getContentPane().add(informPanel, BorderLayout.EAST);
clearSquares();
createSnake();
createBorders();
start();
clearSquares();
createSnake();
createBorders();
createObstacles(colObstacles);
createTarget();
informPanel.updateInfo(snake.getLives(), snake.colElements,
gameSpeed, colObstacles);
square[x][y].setBorder(false);
square[x][y].setUsed(false);
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;
square[i][h-1].setBorder(true);
square[0] [i].setBorder(true);
square[w-1][i].setBorder(true);
}
protected void createObstacles(int col){//створює n ререпон на ігровому полі
int x, y;
do{
x = Math.abs(rnd.nextInt(w));
y = Math.abs(rnd.nextInt(h));
} while (square[x][y].isBorder);
square[x][y].setBorder(true);
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);
super.paintComponent(g);
square[x][y].setLocation(x*squareW, y*squareH);
g.setColor(Color.BLUE);
if ( !isGameRun ){
} else {
if (isGamePause){
keyBlocked = true;
int n = snake.colElements-1;
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;
square[snake.elem[0].xPos][snake.elem[0].yPos].used;
if (target){
snake.increment(lastElem);
createTarget();
cheeckWin();
keyBlocked = false;
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();
JOptionPane.showMessageDialog(frame,
JOptionPane.INFORMATION_MESSAGE);
stopGame();
setDefault();
if (snake.isKilled()) {
JOptionPane.showMessageDialog(frame,
JOptionPane.INFORMATION_MESSAGE);
stopGame();
setDefault();
if (isGameRun) stopGame();
setDefault();
snake.resetLives();
isGameRun = true;
isGamePause = false;
isGamePause = !isGamePause;
if (isGamePause){
keyBlocked = true;
repaint();
} else{
keyBlocked = false;
isGameRun = false;
repaint();
gameSpeed = s;
switch (gameSpeed){
informPanel.updateInfo(snake.getLives(), snake.colElements,
gameSpeed, colObstacles);
isGameRun = false;
setGameSpeed(2);
th = new Thread(this);
th.start();
case KeyEvent.VK_LEFT :
snake.setMoveLeft();
keyBlocked = true;
break;
snake.setMoveRight();
keyBlocked = true;
}
break;
case KeyEvent.VK_UP :
snake.setMoveUp();
keyBlocked = true;
break;
case KeyEvent.VK_DOWN :
snake.setMoveDown();
keyBlocked = true;
break;
case KeyEvent.VK_SPACE :
newGame();
break;
case KeyEvent.VK_P :
pauseGame();
break;
}
}
public void keyTyped(KeyEvent e){}
}
Файл InformPanel.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
JLabel label;
boolean rn = true;
add(label);
setDefault();
updateInfo(0, 0, 0, 0);
public void updateInfo(int lives, int len, int speed, int obstacles){
this.lives = lives;
this.len = len;
this.speed = speed;
this.obstacles = obstacles;
repaint();
int h = 100;
super.paintComponent(g);
class Snake {
int colElements;
SnakeElement elem[];
int xNextSpeed, yNextSpeed;
colElements = c;
elem[i].setMoveRight();
setMoveRight();
lives = startLives;
temp[i] = elem[i];
colElements++;
elem[i] = temp[i];
elem[colElements-1] = lastElem;
elem[colElements-1].xSpeed = lastElem.xSpeed;
elem[colElements-1].ySpeed = lastElem.ySpeed;
elem[i].move();
elem[0].xSpeed = xNextSpeed;
elem[0].ySpeed = yNextSpeed;
elem[0].move();
};
xNextSpeed = 0; yNextSpeed = 1;
};
};
xNextSpeed = 1; yNextSpeed = 0;
};
}
Файл SnakeElement.java
class SnakeElement {
int xSpeed=1;
int ySpeed=1;
int xPos=1;
int yPos=1;
this.xPos = xPos;
this.yPos = yPos;
xPos += xSpeed;
yPos += ySpeed;
xSpeed = x;
ySpeed = y;
}
}
Файл GameSquare.java
import java.awt.*;
import javax.swing.*;
int w, h;
boolean used = false;
int n;
super.setSize(w, h);
this.w = w;
this.h = h;
g.setColor(Color.ORANGE); g.fillRect(0,0,w-1,h-1);
g.setColor(Color.RED); g.drawRect(0,0,w-1,h-1);
}
if (used) {
}
Література
JAVA - Издательство Питер. Секреты программирования для Internet на Java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
mi_StopGame, mi_ExitGame;
super();
mi_NewGame.addActionListener(new ActionListener() {
});
mi_PauseGame.addActionListener(new ActionListener() {
owner.pauseGame();
});
mi_StopGame.addActionListener(new ActionListener() {
owner.stopGame();
});
mi_ExitGame.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//Вихід з гри
System.exit(0);
});
Game.add(mi_NewGame); Game.add(mi_PauseGame);
Game.add(mi_StopGame); Game.add(mi_ExitGame);
add(Game);
Options.add(Speed);
mi_S1.addActionListener(new ActionListener() {
owner.field.setGameSpeed(1);
} });
mi_S2.addActionListener(new ActionListener() {
owner.field.setGameSpeed(2);
});
mi_S3.addActionListener(new ActionListener() {
owner.field.setGameSpeed(3);
});
add(Options);
Help = new JMenu("Допомога");
mi_About.addActionListener(new ActionListener() {
//Інформаційне вікно
JOptionPane.showMessageDialog(owner,
JOptionPane.INFORMATION_MESSAGE);
});
Help.add(mi_About);
add(Help);