Анотація
Курсоваробота присвячена розробці логічної гри «Тетріс» у складі: набір об’єктнихмоделей, програмний код. Проводяться усі необхідні роботи з проектуванняархітектури гри, аналізуються вимоги до неї, приводиться опис реалізації,кодування, тестування програми. При написанні гри використовуєтьсяоб’єктно-орієнтованна мовоа Java.
Роботавикладена на 47 сторінках, містить 5 рисунків, 5 додатків.
Зміст
Вступ
1. Аналіз предметної області тапостановка задачі
1.1 Аналіз предметної області
1.2 Постановка задачі
2. Проект програми
2.1 Ієрархія об’єктів
2.2 Ієрархія спадкування
2.3 Діаграма станів гри
2.4 Алгоритмізація
2.5 Кодування і вибірінструментальних засобів
2.6 Тестування
ВИСНОВОК
Література
Додатки
Додаток А Опис класів
Додаток Б Опис інтерфейса програми
Додаток В Інструкція з встановлення
Додаток Г Лістинг програми
Додаток Д Результат роботи програми
Вступ
В даній курсовійроботі реалізується гра «Тетріс». Зміст гри полягає у тому, що випадковіфігурки падають зверху в прямокутний стакан висотою 10 і шириною 20 кліток. Упольоті гравець може повертати фігурку і рухати її по горизонталі, але неуповільнювати політ. Фігурка летить, поки не натикнеться на іншу фігурку або напідлогу стакана. Якщо при цьому заповнився горизонтальний ряд з 10 кліток, вінпропадає і все, що вище за нього, опускається на 1 клітку. Темп гри поступовозбільшується.
Приреалізації програми буде використовуватись об’єктно-орієнтований підхід,важливим наслідком чого є можливість формування такої структури програми, колидодавання нових компонентів при її подальшому розвитку не буде впливати наіснуючи компоненти, або такий вплив буде зведено до мінімуму.
Для кодування грибуде обрана мова Java, що сприяє написанню надійного програмного продукту.
1. Аналізпредметної області та постановка задачі
1.1Аналіз предметної області
Метою даноїкурсової роботи є розробка гри „Тетріс”. Вона відноситься до логічних ігор, якідопомагають розвинути реакцію, тренують логіку. При тривалій роботі закомп’ютером виникає бажання трохи відпочити. Для цієї мети не підходять ігритипу стратегій, бо для них потрібно багато часу, а для 5-10 хвилинноговідпочинку цілком підійде саме «Тетріс». У стандартній поставці операційнихсистем даної гри немає, тому виникла необхідність у її створенні.
До ігор такоготипу пред‘являються такі вимоги: використання простих засобів управління;зручний графічний інтерфейс; поступове ускладнення гри при наборі певноїкількості очок. Під час виконання програма повинна виконуватися коректно і неприводити до збоїв.
1.2 Постановка задачі
Зміст гри полягає у прагненніщільно зайняти ігрове поле падаючими геометричними фігурами, змінюючи їхорієнтацію у просторі, домагаючись відсутності пропусків в кожному рядку.
Фігурине повинні виходити за кордони ігрового поля, вони мають переміщуватись таперевертатись. Для надання більшої привабливості зовнішньому вигляду ігровогополя при написанні гри потрібно використовувати яскраву графіку. Інтерфейспрограми, що розроблюється повинний бути зручний і зрозумілий користувачу.
Програмаповинна реагувати на натискання клавіш клавіатури, виводячи зображення наекран.
Приреалізації програми було вирішено використовувати об’єктно-орієнтований підхід,що дозволить уникнути проблем проектування, характерних для процедурногопідходу. Важливим наслідком цього є можливість формування такої структурипрограми, коли додавання нових компонентів при її подальшому розвитку не будевпливати на існуючі компоненти, або такий вплив буде зведено до мінімуму.Відповідно до 1.1 і 1.2 розробимо наступний проект програми.
2. Проектпрограми
2.1 Ієрархіяоб’єктів
Аналізуючипотоки вхідних і вихідних даних, розробляємо загальний інтерфейс програми,уточнюємо вимоги до функцій, що виконуються програмою визначаємо їх структуру.
Наетапі ескізного проектування були виділені такі об’єкти, що входять до складупрограми: власне гра «Тетріс»; ігрове вікно, яке включає ігрове поле, полекнопок і ігрове меню. Графічно це відображається в ієрархії об’єктів на рисунку1.
/>
Рисунок1 – Ієрархія об’єктів
2.2 Ієрархіяспадкування
З урахуваннямприйнятої методології і ієрархії класів нам необхідно ієрархію спадкування, яказображена на рисунку 2.
/>
Рисунок2 – Ієрархія спадкування
2.3 Діаграмастанів гри
Діаграма станівгри зображена на рисунку 3.
/> />
/>/>/>/>/>/>/> Запуск Вихід/> /> /> /> /> />
Натиснута кнопка«Pause» Обраний пункт меню «Start New Game»
Обраний пункт меню «StopGame»
Натиснута кнопка «Resume»
/> Фігура досягла верху стакана
/>/>
Рисунок 3 — Діаграма станів
2.4Алгоритмізація
Одною знайважливіших функцій у даній роботі є очищення заповнених ліній. ЇЇ блок-схемапоказана на рисунку 4.
/>
Рисунок 4 –Блок-схема методу private int clearFullLines()
2.5 Кодування івибір інструментальних засобів
Враховуючипоставлену задачу, ієрархію класів, об’єктів, було зроблено висновок, що дляданої роботи найкраще підійде мова програмування Java, так як використовуючи їїмаємо змогу використовувати величезний набір класів, які входять в стандартнийпакет Java. Завдяки чому, наша робота включатиме розробку взаємодії міжготовими класами. Також Java дозволяє досить легко створювати програми зграфічним інтерфейсом користувача. Програма була написана в середовищі NetBeans6.0.
2.6 Тестування
Тестуючипрограму, бачимо, що в цілому програма працює вірно. Коли ми намагаємося рухатифігуру клавішами управління – вона рухається. Натискаючи на кнопку «Pause»бачимо, що програма призупиняється, а коли натискаємо «Resume» – продовжується.Той самий ефект спостерігаємо при повторному натисканні клавіші F3. При виборіпункту меню «Start New Game» – гра починається спочатку, а при виборі «StopGame» – гра зупиняється.
Висновок
Уданій курсовій роботі був розроблений програмний продукт – логічна гра Тетріс.
Булаобґрунтована необхідність створення програми, проведені усі необхідні роботи попроектуванню архітектури гри, проаналізовані вимоги до неї, приводиться описреалізації, кодування, тестування програми.
Принаписанні програми була використана об’єктно-орієнтована мова Java.
Література
1. ХабибуллинИ.Ш. Самоучитель Java 2. СПб.: БХВ-Петербург, 2007. – 720 с.: ил.
2. Эккель Б.Философия Java. Библиотека программиста. СПб.: Питер, 2001
3. БеркунськийЄ.Ю. Об’єктно-орієнтоване програмування мовою Java: Методичні вказівки длястудентів напрямку “ Комп’ютерні науки”. – Миколаїв: НУК, 2006. – 52 с.
Додатки
В даному розділібуде детально розглянуто кожен з класів даної роботи, його поля і методи
Додаток А Опискласів
interfaceGamePanel – інтерфейс гральної панеліПоле Опис поля final static int PLAY = 1 Стан «гра в процесі» final static int STOP = 2 Стан «гра зупинена» final static int PAUSE =3 Стан «гра призупинена» Метод Опис методу public void startNewGame() Почати нову гру public void pauseGame() Призупинити гру public void resumeGame() Продовжити гру public void stopGame() Зупинити гру public int getScore() Одержати рахунок public int getState() Одержати стан гри public void figureMoveRight() Рухати фігуру вправо public void figureMoveLeft() Рухати фігуру вліво public void figureMoveDown() Рухати фігуру вниз public void figureRotate() Обертати фігуру public void gamePauseResume() Змінити стан гри PAUSE на PLAY і навпаки
public classTetris – основний класМетод Опис методу public static void main(String[] args) Запуск програми
public classTetrisFrame – вікно програмиМетод Опис методу public TetrisFrame() Конструктор класу TetrisFrame private void tetrisGamePanel1KeyPressed (java.awt.event.KeyEvent evt) Обробка натискання клавіш управління private void menuNewGame1ActionPerformed (java.awt.event.ActionEvent evt) Обробка вибору пункту меню «Start New Game» private void menuPauseGame1ActionPerformed (java.awt.event.ActionEvent evt) Обробка вибору пункту меню «Stop Game» private void menuFileExit1ActionPerformed (java.awt.event.ActionEvent evt) Обробка вибору пункту меню «Exit» public void continueButtonPressed (ActionEvent evt) Обробка натискання кнопки «Resume»
public void pauseButtonPressed
(ActionEvent evt) Обробка натискання кнопки «Pause»
public classPlaySound – програвання музикиМетод Опис методу public PlaySound(String s) Конструктор класу PlaySound protected void play(String file) Програвання музики
public classFigure – клас фігуриПоле Опис поля final static byte[][][] PATTERN Шаблони фігур final static Color[] COLORS Шаблони кольорів фігур private int type Тип фігури private int[][] pat Шаблон фігури private int x Координата х private int y Координата у private int rotation Вугол private static int nextType Наступний тип фігури private static int nextRot Наступний вугол Метод Опис методу public Figure() Конструктор класу Figure public int getX() Одержати х public int getY() Одержати у public int getHeight() Одержати висоту public int getWidth() Одержати ширина public int getCell(int i, int j) Одержати вміст фігури public void draw(Graphics g) Малювати фігуру public void drawNext(Graphics g, int px, int py) Малювати наступну фігуру public void rotate() Повернути фігуру public boolean canDown Чи можна рухати фігуру вниз? public void moveDown() Рухати фігуру вниз public boolean canLeft(Glass stakan) Чи можна рухати фігуру вліво? public boolean canRight(Glass stakan) Чи можна рухати фігуру управо? public boolean canRotate(Glass stakan) Чи можна повертати фігуру? public void moveLeft() Рухати фігуру вліво public void moveRight() Рухати фігуру управо
public classGlass – клас стаканПоле Опис поля private int[] x Координата х стакана private int[] y Координата у стакана private int[][] cells Вміст стакана Метод Опис методу public Glass() Конструктор класу Glass public void clearGlass() Очищення стакана public int getHeight() Одержати висоту стакана public int getWidth() Одержати ширину стакана public int getCell(int i, int j) Одержати вміст стакана public void draw(Graphics g) Малювання стакана public void drawCell(Graphics g, int i, int j) Малювання осередку стакана public int acceptFigure(Figure f) Прийняття стаканом фігури, що впала private int clearFullLines() Очищення повністю заповнених ліній
public classButtonPanel – панель кнопокМетод Опис методу public ButtonPanel(TetrisFrame frame) Конструктор класу ButtonPanel private void jButton1ActionPerformed (java.awt.event.ActionEvent evt) Обробка натискання кнопки «Resume» private void jButton2ActionPerformed (java.awt.event.ActionEvent evt) Обробка натискання кнопки «Pause»
public classTetrisGamePanel – ігрова панельПоле Опис поля private Glass stakan Стакан тетріса private Figure fig Поточна фігура private int score Рахунок гри private int gameState Стан гри private int[] DELAY Паузи для падіння фігури по рівнях private int level Рівень гри Метод Опис методу public TetrisGamePanel() Конструктор класу TetrisGamePanel public void paintComponent(Graphics g) Малювання стакана, фігури, рахунка і рівня гри public int getScore() Поточний рахунок гри public void startNewGame() Почати нову гру public void pauseGame() Призупинення гри public void resumeGame() Продовження гри після паузи public void stopGame() Зупинити гру public int getState() Отримати стан гри public void figureMoveRight() Рухати фігуру вправо public void figureMoveLeft() Рухати фігуру вліво public void figureMoveDown() Рухати фігуру вниз public void figureRotate() Обертати фігуру public void gamePauseResume() Змінити стан гри PAUSE на PLAY і навпаки public void actionPerformed(ActionEvent e) Обробка дій, подій таймера
Додаток Б Описінтерфейса програми
Запустивши груфігури починають спускатися. Для управління фігурою треба користуватиськлавішами навігації. Для того, щоб призупинити гру треба натиснути кнопку«Pause» або клавішу F3. Для продовження гри треба натиснути кнопку «Resume» абоклавішу F3. Для початку нової гри треба вибрати пункт меню «Start New Game» абонатиснути клавішу F2, а для того, щоб зупинити гру зовсім – вибрати пункт меню«Stop Game». Для виходу з гри треба вибрати пункт меню «Exit» або просто закритипрограму.
Додаток ВІнструкція з встановлення
1.На комп’ютері повинна бутивстановлена JRE 6.3(віртуальна машина Java)
2.Монітор повинен підтримуватирежим 1024х768х24bit
3.45kb на жорсткому диску
4.Щоб виконати проект зкомандного рядка, перейдіть до каталогу, де знаходиться файл і наберітьнаступне: Java -jar «TetrisGame.jar», або запустіть програму подвійнимклацанням миші.
Додаток Г Лістингпрограми
Файл GamePanel.java
package Tetr;
importjava.awt.event.*;
/**
*
* @authorirdis_13
*/
interfaceGamePanel extends ActionListener{
final static intPLAY = 1;
final static intSTOP = 2;
final static intPAUSE =3;
public voidstartNewGame();
public voidpauseGame();
public voidresumeGame();
public voidstopGame();
public intgetScore();
public intgetState();
public voidfigureMoveRight();
public voidfigureMoveLeft();
public voidfigureMoveDown();
public voidfigureRotate();
public voidgamePauseResume();
}
Файл Tetris.java
package Tetr;
/**
*
* @authorirdis_13
*/
public classTetris {
public staticvoid main(String[] args) throws InterruptedException {
TetrisFrame.setDefaultLookAndFeelDecorated(true);
TetrisFrameframe = new TetrisFrame();
frame.setVisible(true);
String s =«D:\\FirstProb2\\src\\Tetr\\tetris.mid»;
if(args.length>0)
s = args[0];
newPlaySound(s);
}
}
Файл ButtonPanel.java
package Tetr;
/**
*
* @author irdis_13
*/
public classButtonPanel extends javax.swing.JPanel {
privateTetrisFrame frame;
publicButtonPanel(TetrisFrame frame) {
this.frame =frame;
initComponents();
}
////GEN-BEGIN:initComponents
private voidinitComponents() {
jButton1 = newjavax.swing.JButton();
jButton2 = newjavax.swing.JButton();
setFocusable(false);
jButton1.setText(«Resume»);
jButton1.setFocusable(false);
jButton1.addActionListener(newjava.awt.event.ActionListener() {
public voidactionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
add(jButton1);
jButton2.setText(«Pause»);
jButton2.setFocusable(false);
jButton2.addActionListener(newjava.awt.event.ActionListener() {
public voidactionPerformed(java.awt.event.ActionEvent evt) {
jButton2ActionPerformed(evt);
}
});
add(jButton2);
}////GEN-END:initComponents
private voidjButton1ActionPerformed(java.awt.event.ActionEvent evt){//GEN-FIRST:event_jButton1ActionPerformed
frame.continueButtonPressed(evt);
}//GEN-LAST:event_jButton1ActionPerformed
private voidjButton2ActionPerformed(java.awt.event.ActionEvent evt){//GEN-FIRST:event_jButton2ActionPerformed
frame.pauseButtonPressed(evt);
}//GEN-LAST:event_jButton2ActionPerformed
// Variablesdeclaration — do not modify//GEN-BEGIN:variables
privatejavax.swing.JButton jButton1;
privatejavax.swing.JButton jButton2;
// End ofvariables declaration//GEN-END:variables
}
Файл Figure.java
package Tetr;
importjava.util.Random;
importjava.awt.*;
/**
*
* @authorirdis_13
*/
public classFigure {
final staticbyte[][][] PATTERN = {
{{0,0,0,0}, //«пустой» шаблон — просто для удобства
{0,0,0,0},
{0,0,0,0},
{0,0,0,0}
},
{
{1}, //
{1},
{1},
{1}
},
{{2,0},
{2,0},
{2,2}
},
{{0,3},
{0,3},
{3,3}
},
{{4,0},
{4,4},
{4,0}
},
{{5,0},
{5,5},
{0,5}
},
{{0,6},
{6,6},
{6,0}
},
{{7,7},
{7,7}
}
};
final staticColor[] COLORS = {
Color.GRAY,
Color.BLUE,
Color.CYAN,
Color.GREEN,
Color.MAGENTA,
Color.RED,
Color.PINK,
Color.YELLOW
};
private inttype;
private int[][]pat;
private intx,y,rotation;
private staticRandom r = new Random();
private staticint nextType = 0;
private staticint nextRot = -1;
public Figure(){
if (nextType==0){
type =r.nextInt(PATTERN.length-1)+1;
rotation =r.nextInt(4);
} else {
type = nextType;
rotation =nextRot;
}
nextType =r.nextInt(PATTERN.length-1)+1;
y = 0; x = 4;
nextRot =r.nextInt(4);
pat = newint[PATTERN[type].length]
[PATTERN[type][0].length];
for (int i=0;i
for (int j=0;j
pat[i][j] =PATTERN[type][i][j];
}
for (int i=0;i
}
public intgetX() {
return x;
}
public intgetY() {
return y;
}
public intgetHeight() {
returnpat.length;
}
public intgetWidth() {
returnpat[0].length;
}
public intgetCell(int i, int j) {
if (i=pat.length || j=pat[0].length) return 0;
returnpat[i][j];
}
public voiddraw(Graphics g) {
for (int i=0;i
for (int j=0;j
if(pat[i][j]!=0){
g.setColor(COLORS[pat[i][j]]);
g.fillRect((x+j)*30+11,(i+y)*30+1,28,28);
}
}
drawNext(g,350,50);
}
public voiddrawNext(Graphics g, int px, int py) {
int[][] p = newint[PATTERN[nextType].length][PATTERN[nextType][0].length];
for (int i=0;i
for (int j=0;j
p[i][j] =PATTERN[nextType][i][j];
}
}
for (int kr=0;kr
int[][] p2 = newint[p[0].length][p.length];
for (int i=0;i
for (int j=0;j
p2[j][i] =p[i][j];
}
}
p = newint[p2.length][p2[0].length];
for (int i=0;i
p[i][j] =p2[p.length-i-1][j];
}
}
for (int i=0;i
g.setColor(COLORS[0]);
g.fillRect(j*30+px,i*30+py, 28,28);
}
for (int i=0;i
g.setColor(COLORS[p[i][j]]);
g.fillRect(j*30+px,i*30+py, 28,28);
}
}
public voidrotate() {
int[][] newPat =new int[pat[0].length][pat.length];
for (int i=0;i
newPat[j][i] =pat[i][j];
}
pat = newint[newPat.length][newPat[0].length];
for (int i=0;i
pat[i][j] =newPat[pat.length-i-1][j];
}
}
public booleancanDown(Glass stakan) {
int[][] a = newint[21][10];
for (int i = 0;i
for (int j = 0;j
a[i][j] =stakan.getCell(i,j);
}
}
for (int i=0;i
for (int j=0;j
int xx = x+j, yy= y+i+1;
if(pat[i][j]>0 && a[yy][xx]>0) {
return false;
}
}
}
return true;
}
public voidmoveDown() {
y++;
}
public booleancanLeft(Glass stakan) {
if (x==0) returnfalse;
int [][] s = newint[pat.length][pat[0].length];
for (int i=0;i
s[i][j] =stakan.getCell(y+i,j+x-1);
}
for (int i=0;i
if(s[i][j]*pat[i][j]>0) {
return false;
}
}
return true;
}
public booleancanRight(Glass stakan) {
if(x==stakan.getWidth()-pat[0].length) return false;
int [][] s = newint[pat.length][pat[0].length];
for (int i=0;i
s[i][j] =stakan.getCell(y+i,j+x+1);
}
for (int i=0;i
if(s[i][j]*pat[i][j]>0) {
return false;
}
}
return true;
}
public booleancanRotate(Glass stakan) {
if(x+pat.length>stakan.getWidth()) return false;
int[][] tmpPat =new int[pat[0].length][pat.length];
for (int i=0;i
tmpPat[j][i] =pat[i][j];
}
int[][] tPat =new int[tmpPat.length][tmpPat[0].length];
for (int i=0;i
tPat[i][j] =tmpPat[tPat.length-i-1][j];
}
int [][] s = newint[tPat.length][tPat[0].length];
for (int i=0;i
s[i][j] =stakan.getCell(y+i,j+x);
}
for (int i=0;i
if(s[i][j]*tPat[i][j]>0) {
return false;
}
}
return true;
}
public voidmoveLeft() {
if (x>0) {
x–;
}
}
public voidmoveRight() {
if(x
x++;
}
}
}
Файл Glass.java
package Tetr;
importjava.awt.*;
/**
*
* @authorirdis_13
*/
public classGlass {
private int[] x= {0, 10, 10, 310, 310, 320, 320, 0};
private int[] y= {0, 0, 600, 600, 0, 0, 610, 610};
private int[][]cells = new int[21][10];
public Glass() {
clearGlass();
}
public voidclearGlass() {
for (int i = 0;i
for (int j = 0;j
cells[i][j] =(i==cells.length-1)? 10: 0;
}
}
}
public intgetHeight() {
returncells.length;
}
public intgetWidth() {
returncells[0].length;
}
public intgetCell(int i, int j) {
returncells[i][j];
}
public voiddraw(Graphics g) {
g.setColor(Color.GRAY);
g.fillRect(10,0,300,600);
g.setColor(Color.BLUE);
g.fillPolygon(x,y,x.length);
for (int i = 0;i
for (int j = 0;j
drawCell(g,i,j);
}
}
}
public voiddrawCell(Graphics g, int i, int j) {
g.setColor(Figure.COLORS[cells[i][j]]);
g.fillRect(j*30+11,i*30+1,28,28);
}
public intacceptFigure(Figure f){
for (int i=0;i
for (int j=0;j
int xx =f.getX()+j, yy = f.getY()+i;
if(f.getCell(i,j)!=0) { // клетка не пуста
cells[yy][xx] =f.getCell(i,j);
} }
}
int lines =clearFullLines();
if (lines>0)return lines;
if (f.getY()==0)return -1;
return 0;
}
private intclearFullLines() {
int linesCount =0;
lineLoop: for(int i=1; i
for (int j=0;j
if(cells[i][j]==0) {
continuelineLoop;
}
}
linesCount++;
for (int j=i;j>=1; j–) {
cells[j]=cells[j-1];
}
cells[0] = newint[10];
for (int j=0;j
cells[0][j]=0;
}
}
returnlinesCount;
}
}
Файл PlaySound.java
package Tetr;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjavax.sound.midi.*;
import java.io.*;
/**
*
* @authorirdis_13
*/
public classPlaySound implements ActionListener{
publicPlaySound(String s){
play(s);
}
protected voidplay(String file) {
try{
File f = newFile(file);
Sequencersequencer = MidiSystem.getSequencer();
if (sequencer ==null) {
System.err.println(«Sequensernot supported»);
}
sequencer.open();
Sequence seq =MidiSystem.getSequence(f);
sequencer.setSequence(seq);
sequencer.start();
sequencer.setLoopCount(1000);
}catch(Exceptione){
System.err.println(e);
}
}
public voidactionPerformed(ActionEvent e) {
throw newUnsupportedOperationException(«Not supported yet.»);
}
}
Файл TetrisFrame.java
package Tetr;
importTetr.TetrisGamePanel;
importjava.awt.event.ActionEvent;
importjava.awt.event.KeyEvent;
/**
*
* @author irdis_13
*/
public classTetrisFrame extends javax.swing.JFrame {
/** Creates newform TetrisFrame */
publicTetrisFrame() {
initComponents();
tetrisGamePanel1.grabFocus();
}
////GEN-BEGIN:initComponents
private voidinitComponents() {
buttonPanel1 =buttonPanel1 = new ButtonPanel(this);
menuBar = newjavax.swing.JMenuBar();
jMenu1 = newjavax.swing.JMenu();
menuNewGame =new javax.swing.JMenuItem();
menuPauseGame =new javax.swing.JMenuItem();
jSeparator1 =new javax.swing.JSeparator();
menuFileExit =new javax.swing.JMenuItem();
tetrisGamePanel1= new Tetr.TetrisGamePanel();
menuBar1 = newjavax.swing.JMenuBar();
jMenu2 = newjavax.swing.JMenu();
menuNewGame1 =new javax.swing.JMenuItem();
menuPauseGame1 =new javax.swing.JMenuItem();
jSeparator2 =new javax.swing.JSeparator();
menuFileExit1 =new javax.swing.JMenuItem();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setFocusable(false);
jMenu1.setText(«File»);
menuNewGame.setText(«Item»);
jMenu1.add(menuNewGame);
menuPauseGame.setText(«Item»);
jMenu1.add(menuPauseGame);
jMenu1.add(jSeparator1);
menuFileExit.setText(«Item»);
jMenu1.add(menuFileExit);
menuBar.add(jMenu1);
tetrisGamePanel1.addKeyListener(newjava.awt.event.KeyAdapter() {
public voidkeyPressed(java.awt.event.KeyEvent evt) {
tetrisGamePanel1KeyPressed(evt);
}
});
menuBar1.setFocusable(false);
jMenu2.setText(«File»);
jMenu2.setFocusable(false);
menuNewGame1.setText(«StartNew Game»);
menuNewGame1.addActionListener(newjava.awt.event.ActionListener() {
public voidactionPerformed(java.awt.event.ActionEvent evt) {
menuNewGame1ActionPerformed(evt);
}
});
jMenu2.add(menuNewGame1);
menuPauseGame1.setText(«StopGame»);
menuPauseGame1.addActionListener(newjava.awt.event.ActionListener() {
public voidactionPerformed(java.awt.event.ActionEvent evt) {
menuPauseGame1ActionPerformed(evt);
}
});
jMenu2.add(menuPauseGame1);
jMenu2.add(jSeparator2);
menuFileExit1.setText(«Exit»);
menuFileExit1.addActionListener(newjava.awt.event.ActionListener() {
public voidactionPerformed(java.awt.event.ActionEvent evt) {
menuFileExit1ActionPerformed(evt);
}
});
jMenu2.add(menuFileExit1);
menuBar1.add(jMenu2);
setJMenuBar(menuBar1);
javax.swing.GroupLayoutlayout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(153,153, 153)
.addComponent(buttonPanel1,javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(tetrisGamePanel1,javax.swing.GroupLayout.PREFERRED_SIZE, 485,javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE,Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(buttonPanel1,javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18,18)
.addComponent(tetrisGamePanel1,javax.swing.GroupLayout.PREFERRED_SIZE, 612,javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE,Short.MAX_VALUE))
);
pack();
}////GEN-END:initComponents
private voidtetrisGamePanel1KeyPressed(java.awt.event.KeyEvent evt){//GEN-FIRST:event_tetrisGamePanel1KeyPressed
TetrisGamePanelp = (TetrisGamePanel)tetrisGamePanel1;
switch(evt.getKeyCode()) {
caseKeyEvent.VK_LEFT:
p.figureMoveLeft();
break;
caseKeyEvent.VK_RIGHT:
p.figureMoveRight();
break;
caseKeyEvent.VK_UP:
p.figureRotate();
break;
caseKeyEvent.VK_DOWN:
p.figureMoveDown();
break;
caseKeyEvent.VK_F2:
p.startNewGame();
break;
caseKeyEvent.VK_F3:
p.gamePauseResume();
break;
default: return;
}
repaint();
}//GEN-LAST:event_tetrisGamePanel1KeyPressed
private voidmenuNewGame1ActionPerformed(java.awt.event.ActionEvent evt){//GEN-FIRST:event_menuNewGame1ActionPerformed
TetrisGamePanelp = (TetrisGamePanel)tetrisGamePanel1;
p.startNewGame();
}//GEN-LAST:event_menuNewGame1ActionPerformed
private voidmenuPauseGame1ActionPerformed(java.awt.event.ActionEvent evt){//GEN-FIRST:event_menuPauseGame1ActionPerformed
TetrisGamePanelp = (TetrisGamePanel)tetrisGamePanel1;
p.stopGame();
}//GEN-LAST:event_menuPauseGame1ActionPerformed
private voidmenuFileExit1ActionPerformed(java.awt.event.ActionEvent evt){//GEN-FIRST:event_menuFileExit1ActionPerformed
System.exit(0);
}//GEN-LAST:event_menuFileExit1ActionPerformed
/**
* @param argsthe command line arguments
*/
public voidcontinueButtonPressed(ActionEvent evt) {
TetrisGamePanelp = (TetrisGamePanel)tetrisGamePanel1;
p.resumeGame();
}
public voidpauseButtonPressed(ActionEvent evt) {
TetrisGamePanelp = (TetrisGamePanel)tetrisGamePanel1;
p.pauseGame();
}
// Variablesdeclaration — do not modify//GEN-BEGIN:variables
privateTetr.ButtonPanel buttonPanel1;
privatejavax.swing.JMenu jMenu1;
privatejavax.swing.JMenu jMenu2;
privatejavax.swing.JSeparator jSeparator1;
privatejavax.swing.JSeparator jSeparator2;
privatejavax.swing.JMenuBar menuBar;
privatejavax.swing.JMenuBar menuBar1;
privatejavax.swing.JMenuItem menuFileExit;
privatejavax.swing.JMenuItem menuFileExit1;
privatejavax.swing.JMenuItem menuNewGame;
privatejavax.swing.JMenuItem menuNewGame1;
privatejavax.swing.JMenuItem menuPauseGame;
privatejavax.swing.JMenuItem menuPauseGame1;
privateTetr.TetrisGamePanel tetrisGamePanel1;
}
Файл TetrisGamePanel.java
package Tetr;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
/**
*
* @author irdis_13
*/
public classTetrisGamePanel extends javax.swing.JPanel implements GamePanel,ActionListener{
private Glassstakan;
private Figurefig = null;
private intscore = 0;
private intgameState;
private int[]DELAY = {500, 450, 400, 350, 300, 250, 200, 150, 100, 50};
private intlevel = 1;
Timer t = newjavax.swing.Timer(DELAY[level], this);
publicTetrisGamePanel() {
stakan = newGlass();
startNewGame();
t.start();
}
@Override
public voidpaintComponent(Graphics g) {
super.paintComponent(g);
stakan.draw(g);
fig.draw(g);
g.setFont(newFont(«Times New Roman», Font.BOLD, 24));
g.setColor(Color.BLACK);
g.drawString(«Счет:» + score, 350, 250);
g.drawString(«Уровень:» + level, 350, 300);
}
public intgetScore() {
return score;
}
public voidstartNewGame() {
score = 0;
level = 1;
fig = newFigure();
stakan = newGlass();
gameState =PLAY;
}
public voidpauseGame() {
if (gameState ==PLAY) {
gameState =PAUSE;
}
}
public voidresumeGame() {
if (gameState ==PAUSE) {
gameState =PLAY;
}
}
public voidstopGame() {
gameState =STOP;
}
public intgetState() {
returngameState;
}
public voidfigureMoveRight(){
if(fig.canRight(stakan)& gameState==PLAY)
fig.moveRight();
}
public voidfigureMoveLeft(){
if(fig.canLeft(stakan)& gameState==PLAY)
fig.moveLeft();
}
public voidfigureMoveDown(){
t.setDelay(DELAY[level]/20);
}
public voidfigureRotate(){
if(fig.canRotate(stakan)& gameState==PLAY)
fig.rotate();
}
public voidgamePauseResume(){
if(gameState==PLAY) {
gameState =PAUSE;
}
else
if(gameState==PAUSE) {
gameState =PLAY;
}
}
public voidactionPerformed(ActionEvent e) {
if (gameState !=PLAY) {
return;
}
int bonus;
if(fig.canDown(stakan)) {
fig.moveDown();
} else {
if ((bonus =stakan.acceptFigure(fig))
stopGame();
}
if (bonus >0) {
switch (bonus) {
case 4:
score += 20;
case 3:
score += 15;
case 2:
score += 10;
case 1:
score += 5;
}
int newLevel =score / 100 + 1;
if (newLevel> level && level
level++;
}
}
if (gameState ==PLAY) {
fig = newFigure();
t.setDelay(DELAY[level]);
}
}
repaint();
}
////GEN-BEGIN:initComponents
private voidinitComponents() {
javax.swing.GroupLayoutlayout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 400,Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 300,Short.MAX_VALUE)
);
}////GEN-END:initComponents
}
Додаток ДРезультат роботи програми
Результат роботипрограми зображено на рисунку 5
/>
Рисунок 5 –Результат роботи програми