Программирование игры "Тетрис" на Java

Особенности и основные этапы выполнения Java-программы, необходимость ее компиляции. Набор программ и классов JDK. Порядок и механизм разработки исходного кода программы в интегрированной среде разработки Eclipse, ее описание и назначение, листинг.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 02.03.2011
Размер файла 510,1 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Введение

Сначала Java (официальный день рождения технологии Java - 23 мая 1995 г.) предназначалась для программирования бытовых электронных устройств, таких как телефоны. Потом Java стала применяться для программирования браузеров - появились аплеты. Затем оказалось, что на Java можно создавать полноценные приложения. Их графические элементы стали оформлять в виде компонентов - появились JavaBeans, с которыми Java вошла в мир распределенных систем и промежуточного программного обеспечения, тесно связавшись с технологией CORBA. Остался один шаг до программирования серверов - этот шаг был сделан - появились сервлеты и EJB (Enterprise JavaBeans). Серверы должны взаимодействовать с базами данных - появились драйверы JDBC (Java DataBase Connection). Взаимодействие оказалось удачным, и многие системы управления базами данных и даже операционные системы включили, Java в свое ядро, например Oracle, Linux, MacOS X, AIX. Что еще не охвачено? Назовите, и через полгода услышите, что Java уже вовсю применяется и там. Из-за этой размытости самого понятия его описывают таким же размытым словом - технология.

Такое быстрое и широкое распространение технологии Java не в последнюю очередь связано с тем, что она использует новый, специально созданный язык программирования, который так и называется - язык Java. Этот язык создан на базе языков Smalltalk, Pascal, C++ и др., вобрав их лучшие, по мнению создателей, черты и отбросив худшие. На этот счет есть разные мнения, но бесспорно, что язык получился удобным для изучения, написанные на нем программы легко читаются и отлаживаются: первую программу можно написать уже через час после начала изучения языка. Язык Java становится языком обучения объектно-ориентированному программированию, так же, как язык Pascal был языком обучения структурному программированию.

1. Основы Java

1.1 Выполнение Java-программы

Программа, написанная на одном из языков высокого уровня, к которым относится и язык Java, так называемый исходный модуль («исходник» или «сырец» на жаргоне, от английского «source»), не может быть сразу же выполнена. Ее сначала надо откомпилировать, т.е. перевести в последовательность машинных команд - объектный модуль. Но и он, как правило, не может быть сразу же выполнен: объектный модуль надо еще скомпоновать с библиотеками использованных в модуле функций и разрешить перекрестные ссылки между секциями объектного модуля, получив в результате загрузочный модуль - полностью готовую к выполнению программу.

Исходный модуль, написанный на Java, не может избежать этих процедур, но здесь проявляется главная особенность технологии Java - программа компилируется сразу в машинные команды, но не команды какого-то конкретного процессора, а в команды так называемой виртуальной машины Java (JVM, Java Virtual Machine). Виртуальная машина Java - это совокупность команд вместе с системой их выполнения. Для специалистов скажем, что виртуальная машина Java полностью стековая, так что не требуется сложная адресация ячеек памяти и большое количество регистров. Поэтому команды JVM короткие, большинство из них имеет длину 1 байт, отчего команды JVM называют байт-кодами (bytecodes), хотя имеются команды длиной 2 и 3 байта. Согласно статистическим исследованиям средняя длина команды составляет 1,8 байта. Полное описание команд и всей архитектуры JVM содержится в спецификации виртуальной машины Java (VMS, Virtual Machine Specification). Если вы хотите в точности узнать, как работает виртуальная машина Java, ознакомьтесь с этой спецификацией.

Другая особенность Java - все стандартные функции, вызываемые в программе, подключаются к ней только на этапе выполнения, а не включаются в байт-коды. Как говорят специалисты, происходит динамическая компоновка (dynamic binding). Это тоже сильно уменьшает объем откомпилированной программы.

Итак, на первом этапе программа, написанная на языке Java, переводится компилятором в байт-коды. Эта компиляция не зависит от типа какого-либо конкретного процессора и архитектуры некоего конкретного компьютера. Она может быть выполнена один раз сразу же после написания программы. Байт-коды записываются в одном или нескольких файлах, могут храниться во внешней памяти или передаваться по сети. Это особенно удобно благодаря небольшому размеру файлов с байт-кодами. Затем полученные в результате компиляции байт-коды можно выполнять на любом компьютере, имеющем систему, реализующую JVM. При этом не важен ни тип процессора, ни архитектура компьютера. Так реализуется принцип Java «Write once, run anywhere» - «Написано однажды, выполняется где угодно».

Интерпретация байт-кодов и динамическая компоновка значительно замедляют выполнение программ. Это не имеет значения в тех ситуациях, когда байт-коды передаются по сети, сеть все равно медленнее любой интерпретации, но в других ситуациях требуется мощный и быстрый компьютер. Поэтому постоянно идет усовершенствование интерпретаторов в сторону увеличения скорости интерпретации. Разработаны JIT-компиляторы (Just-In-Time), запоминающие уже интерпретированные участки кода в машинных командах процессора и просто выполняющие эти участки при повторном обращении, например, в циклах. Это значительно увеличивает скорость повторяющихся вычислений. Фирма SUN разработала целую технологию Hot-Spot и включает ее в свою виртуальную машину Java. Но, конечно, наибольшую скорость может дать только специализированный процессор.

Фирма SUN Microsystems выпустила микропроцессоры PicoJava, работающие на системе команд JVM, и собирается выпускать целую линейку все более мощных Java-процессоров. Есть уже и Java-процессоры других фирм. Эти процессоры непосредственно выполняют байт-коды. Но при выполнении программ Java на других процессорах требуется еще интерпретация команд JVM в команды конкретного процессора, а значит, нужна программа-интерпретатор, причем для каждого типа процессоров, и для каждой архитектуры компьютера следует написать свой интерпретатор.

Эта задача уже решена практически для всех компьютерных платформ. На них реализованы виртуальные машины Java, а для наиболее распространенных платформ имеется несколько реализаций JVM разных фирм. Все больше операционных систем и систем управления базами данных включают реализацию JVM в свое ядро. Создана и специальная операционная система JavaOS, применяемая в электронных устройствах. В большинство браузеров встроена виртуальная машина Java для выполнения аплетов.

Внимательный читатель уже заметил, что кроме реализации JVM для выполнения байт-кодов на компьютере еще нужно иметь набор функций, вызываемых из байт-кодов и динамически компонующихся с байт-кодами. Этот набор оформляется в виде библиотеки классов Java, состоящей из одного или нескольких пакетов. Каждая функция может быть записана байт-кодами, но, поскольку она будет храниться на конкретном компьютере, ее можно записать прямо в системе команд этого компьютера, избегнув тем самым интерпретации байт-кодов. Такие функции называют «родными» методами (native methods). Применение «родных» методов ускоряет выполнение программы.

Фирма SUN Microsystems - создатель технологии Java - бесплатно распространяет набор необходимых программных инструментов для полного цикла работы с этим языком программирования: компиляции, интерпретации, отладки, включающий и богатую библиотеку классов, под названием JDK (Java Development Kit). Есть наборы инструментальных программ и других фирм. Например, большой популярностью пользуется JDK фирмы IBM.

1.2 Что такое JDK

Набор программ и классов JDK содержит:

· компилятор javac из исходного текста в байт-коды; интерпретатор java, содержащий реализацию JVM;

· облегченный интерпретатор jre (в последних версиях отсутствует);

· программу просмотра апплетов appietviewer, заменяющую браузер;

· отладчик jdt>;

· дизассемблер javap;

· программу архивации и сжатия jar;

· программу сбора документации javadoc;

· программу javah генерации заголовочных файлов языка С;

· программу javakey добавления электронной подписи;

· программу native2ascii, преобразующую бинарные файлы в текстовые;

· программы rmic и rmiregistry для работы с удаленными объектами;

· программу seriaiver, определяющую номер версии класса;

· библиотеки и заголовочные файлы «родных» методов;

· библиотеку классов Java API (Application Programming Interface).

В 1996 г. была выпущена первая версия JDK 1.0, которая модифицировалась до версии с номером 1.0.2. В этой версии библиотека классов Java API содержала 8 пакетов. Весь набор JDK 1.0.2 поставлялся в упакованном виде в одном файле размером около 5 Мбайт, а после распаковки занимал около 8 Мбайт на диске.

В 1997 г. появилась версия JDK 1.1, последняя ее модификация, 1.1.8, выпущена в 1998 г. В этой версии было 23 пакета классов, занимала она 8,5 Мбайт в упакованном виде и около 30 Мбайт на диске.

В первых версиях JDK все пакеты библиотеки Java API были упакованы в один архивный файл classes.zip и вызывались непосредственно из этого архива, его не нужно распаковывать.

Затем набор инструментальных средств JDK был сильно переработан.

Версия JDK 1.2 вышла в декабре 1998 г. и содержала уже 57 пакетов классов. В архивном виде это файл размером почти 20 Мбайт и еще отдельный файл размером более 17 Мбайт с упакованной документацией. Полная версия располагается на 130 Мбайтах дискового пространства, из них около 80 Мбайт занимает документация.

Начиная с этой версии, все продукты технологии Java собственного производства компания SUN стала называть Java 2 Platform, Standard Edition, сокращенно J2SE, a JDK переименовала в Java 2 SDK, Standard Edition (Software Development Kit), сокращенно J2SDK, поскольку выпускается еще Java 2 SDK Enterprise Edition и Java 2 SDK Micro Edition. Впрочем, сама компания SUN часто пользуется и старым названием, а в литературе утвердилось название Java 2. Кроме 57 пакетов классов, обязательных на любой платформе и получивших название Core API, в Java 2 SDK vl.2 входят еще дополнительные пакеты классов, называемые Standard Extension API. В версии Java 2 SDK SE, vl.3, вышедшей в 2000 г., уже 76 пакетов классов, составляющих Core API.

В настоящее время версия JDK 1.0.2 уже не используется. Версия JDK 1.1.5 с графической библиотекой AWT встроена в популярные браузеры Internet Explorer 5.0 и Netscape Communicator 4.7, поэтому она применяется для создания апплетов. Технология Java 2 широко используется на серверах и в клиент-серверных системах.

Кроме JDK, компания SUN отдельно распространяет еще и набор JRE (Java Runtime Environment).

2. Практическая часть

Программа написана в интегрированной среде разработки Eclipse.

Скриншоты программы:

Заключение

В результате выполнения курсовой работы была написана игра «Тетрис».

В первой части работы рассмотрены основные моменты, связанные с языком Java: история возникновения и развития, основные возможности языка, преимущества и недостатки.

Вторая часть курсовой включает в себя практическую часть, в которой был разработан исходный код для программы «Тетрис», также было выполнено тестирование данной программы.

Для разработки приложения использовалась среда интегрированной разработки Eclipse.

программа java интегрированный листинг

Список литературы

1. http://eclipse-3.narod.ru/

2. Н.А. Вязовик. Программирование на Java. Курс лекций, Интернет-университет информационных технологий, 2003 г., 592 стр.

3. Герберт Шилдт, Джеймс Холмс, Искусство программирования на Java, 2005 г., 336 стр.

Приложение

Код программы:

import javax.imageio. ImageIO;

import javax.swing.*;

import javax.swing.border. BevelBorder;

import javax.swing.border. EtchedBorder;

import javax.swing.text.html.HTML;

import res. ResClass;

import net.sourceforge.jetris.io. PublishHiScore;

import java.awt.*;

import java.awt.event. ActionEvent;

import java.awt.event. ActionListener;

import java.awt.event. KeyAdapter;

import java.awt.event. KeyEvent;

import java.awt.event. KeyListener;

import java.awt.event. WindowEvent;

import java.awt.event. WindowFocusListener;

import java.io. BufferedInputStream;

public class JetrisMainFrame extends JFrame {

private static final String NAME = «Мой тетрис»;

private static final int CELL_H = 24;

private Font font;

private JPanel playPanel;

private JLabel score;

private JLabel lines;

private JLabel time;

private JLabel[] statsF;

private JLabel[] statsL;

private JLabel levelLabel;

private JLabel hiScoreLabel;

private JPanel[][] cells;

private TetrisGrid tg;

private JPanel[][] next;

private int nextX;

private int nextY;

private Figure f;

private Figure fNext;

private FigureFactory ff;

private boolean isNewFigureDroped;

private boolean isGameOver;

private boolean isPause;

private Color nextBg;

private TimeThread tt;

private KeyListener keyHandler;

private JPanel about;

private JMenuItem jetrisRestart;

private JMenuItem jetrisPause;

private JMenuItem jetrisHiScore;

private JMenuItem jetrisExit;

private JMenuItem helpJetris;

private HelpDialog helpDialog;

private JPanel hiScorePanel;

private PublishHandler pH;

private class GridThread extends Thread {

private int count = 0;

public void run() {

try {

while (true) {

if (isGameOver || isPause) {

Thread.sleep(50);

} else {

if(isNewFigureDroped) {

isNewFigureDroped = false;

count = 0;

nextMove();

continue;

} else {

Thread.sleep(50);

}

count += 50;

if (count + 50*tg.getLevel() >= 1100) {

count = 0;

nextY++;

nextMove();

}

}

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

private class TimeThread extends Thread {

private int hours;

private int min;

private int sec;

private int count;

private void incSec() {

sec++;

if (sec == 60) {

sec = 0;

min++;

}

if (min == 60) {

min = 0;

hours++;

}

}

private void resetTime() {

hours = min = sec = 0;

}

public void run() {

try {

while (true) {

Thread.sleep(50);

if (isGameOver) {

Graphics g = playPanel.getGraphics();

Font font = new Font (g.getFont().getFontName(), Font.BOLD, 24);

g.setFont(font);

g.drawString («GAME OVER», 47, 250);

} else if(isPause) {

time.setText («Пауза»);

} else if (count >= 1000) {

count = 0;

incSec();

time.setText (this.toString());

} else {

count+=50;

}

}

} catch (Exception e) {

e.printStackTrace();

}

}

public String toString() {

StringBuffer sb = new StringBuffer();

if (hours < 10) {

sb.append('0');

}

sb.append(hours);

sb.append (':');

if (min < 10) {

sb.append('0');

}

sb.append(min);

sb.append (':');

if (sec < 10) {

sb.append('0');

}

sb.append(sec);

return sb.toString();

}

}

public JetrisMainFrame() {

super(NAME);

SplashScreen sp = new SplashScreen();

keyHandler = new KeyAdapter() {

public void keyPressed (KeyEvent e) {

int code = e.getKeyCode();

if (code == KeyEvent.VK_A || code == KeyEvent.VK_LEFT) {

moveLeft();

} else if (code == KeyEvent.VK_D || code == KeyEvent.VK_RIGHT) {

moveRight();

} else if (code == KeyEvent.VK_S || code == KeyEvent.VK_DOWN) {

moveDown();

} else if (code == KeyEvent.VK_W || code == KeyEvent.VK_UP) {

rotation();

} else if (code == KeyEvent.VK_SPACE) {

moveDrop();

}

}

};

addKeyListener(keyHandler);

pH = new PublishHandler();

font = new Font («Dialog», Font.PLAIN, 12);

tg = new TetrisGrid();

ff = new FigureFactory();

nextBg = new Color (238,238,238);

initMenu();

JPanel all = new JPanel (new BorderLayout());

all.add (getStatPanel(), BorderLayout.WEST);

all.add (getPlayPanel(), BorderLayout.CENTER);

all.add (getMenuPanel(), BorderLayout.EAST);

all.add (getCopyrightPanel(), BorderLayout.SOUTH);

setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

this.getContentPane().add (all, BorderLayout.CENTER);

pack();

this.setResizable(false);

fNext = ff.getRandomFigure();

dropNext();

GridThread gt = new GridThread();

tt = new TimeThread();

gt.start();

tt.start();

addWindowFocusListener (new WindowFocusListener() {

public void windowGainedFocus (WindowEvent arg0) {}

public void windowLostFocus (WindowEvent arg0) {

isPause = true;

}

});

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

setLocation (screenSize.width / 2 - getWidth() / 2, screenSize.height / 2 - getHeight() / 2);

setVisible(true);

sp.setVisible(false);

sp.dispose();

}

private void initMenu() {

MenuHandler mH = new MenuHandler();

JMenuBar menu = new JMenuBar();

setJMenuBar(menu);

JMenu mJetris = new JMenu();

menu.add(mJetris);

mJetris.setText («Тетрис»);

mJetris.setMnemonic('J');

{

jetrisRestart = new JMenuItem («Рестарт»);

mJetris.add(jetrisRestart);

setKeyAcceleratorMenu (jetrisRestart, 'R', 0);

jetrisRestart.addActionListener(mH);

jetrisRestart.setMnemonic('R');

jetrisPause = new JMenuItem («Пауза»);

mJetris.add(jetrisPause);

setKeyAcceleratorMenu (jetrisPause, 'P', 0);

jetrisPause.addActionListener(mH);

jetrisPause.setMnemonic('P');

mJetris.addSeparator();

jetrisHiScore = new JMenuItem («Результаты»);

mJetris.add(jetrisHiScore);

setKeyAcceleratorMenu (jetrisHiScore, 'H', 0);

jetrisHiScore.addActionListener(mH);

jetrisHiScore.setMnemonic('H');

mJetris.addSeparator();

jetrisExit = new JMenuItem («Выход»);

mJetris.add(jetrisExit);

setKeyAcceleratorMenu (jetrisExit, KeyEvent.VK_ESCAPE, 0);

jetrisExit.addActionListener(mH);

jetrisExit.setMnemonic('X');

}

JMenu mHelp = new JMenu();

menu.add(mHelp);

mHelp.setText («Помощь»);

mHelp.setMnemonic('H');

{

helpJetris = new JMenuItem («Помощь по тетрису»);

mHelp.add(helpJetris);

setKeyAcceleratorMenu (helpJetris, KeyEvent.VK_F1,0);

helpJetris.addActionListener(mH);

helpJetris.setMnemonic('J');

}

}

private void setKeyAcceleratorMenu (JMenuItem mi, int keyCode, int mask) {

KeyStroke ks = KeyStroke.getKeyStroke (keyCode, mask);

mi.setAccelerator(ks);

}

private JPanel getPlayPanel() {

playPanel = new JPanel();

playPanel.setLayout (new GridLayout (20,10));

playPanel.setPreferredSize (new Dimension (10*CELL_H, 20*CELL_H));

cells = new JPanel[20] [10];

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

for (int j = 0; j < 10; j++) {

cells[i] [j] = new JPanel();

cells[i] [j].setBackground (Color.WHITE);

cells[i] [j].setBorder (BorderFactory.createLineBorder (Color.LIGHT_GRAY));

playPanel.add (cells[i] [j]);

}

}

return playPanel;

}

private JPanel getMenuPanel() {

JPanel r = new JPanel();

BoxLayout rL = new BoxLayout (r, BoxLayout.Y_AXIS);

r.setLayout(rL);

r.setBorder (new EtchedBorder());

Dimension ra = new Dimension (5, 0);

next = new JPanel[4] [4];

JPanel nextP = new JPanel();

nextP.setLayout (new GridLayout (4,4));

Dimension d = new Dimension (4*18, 4*18);

nextP.setMinimumSize(d);

nextP.setPreferredSize(d);

nextP.setMaximumSize(d);

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

for (int j = 0; j < 4; j++) {

next[i] [j] = new JPanel();

nextP.add (next[i] [j]);

}

}

JPanel jp = new JPanel();

jp.setLayout (new BoxLayout (jp, BoxLayout.LINE_AXIS));

jp.add (Box.createRigidArea(ra));

jp.add (new JLabel («Следующий:»));

jp.add (Box.createHorizontalGlue());

r.add(jp);

r.add(nextP);

r.add (Box.createRigidArea (new Dimension (100, 10)));

jp = new JPanel();

jp.setLayout (new BoxLayout (jp, BoxLayout.LINE_AXIS));

jp.add (Box.createRigidArea(ra));

jp.add (new JLabel («Счёт:»));

jp.add (Box.createHorizontalGlue());

r.add(jp);

hiScoreLabel = new JLabel (««+tg.hiScore[0].score);

hiScoreLabel.setForeground (Color.RED);

jp = new JPanel();

jp.setLayout (new BoxLayout (jp, BoxLayout.LINE_AXIS));

jp.add (Box.createRigidArea(ra));

jp.add(hiScoreLabel);

jp.add (Box.createHorizontalGlue());

r.add(jp);

r.add (Box.createVerticalStrut(5));

jp = new JPanel();

jp.setLayout (new BoxLayout (jp, BoxLayout.LINE_AXIS));

jp.add (Box.createRigidArea(ra));

jp.add (new JLabel («Очки:»));

jp.add (Box.createHorizontalGlue());

r.add(jp);

score = new JLabel («0»);

score.setForeground (Color.BLUE);

jp = new JPanel();

jp.setLayout (new BoxLayout (jp, BoxLayout.LINE_AXIS));

jp.add (Box.createRigidArea(ra));

jp.add(score);

jp.add (Box.createHorizontalGlue());

r.add(jp);

jp = new JPanel();

jp.setLayout (new BoxLayout (jp, BoxLayout.LINE_AXIS));

jp.add (Box.createRigidArea(ra));

jp.add (new JLabel («Линии:»));

jp.add (Box.createHorizontalGlue());

r.add(jp);

lines = new JLabel («0»);

lines.setForeground (Color.BLUE);

jp = new JPanel();

jp.setLayout (new BoxLayout (jp, BoxLayout.LINE_AXIS));

jp.add (Box.createRigidArea(ra));

jp.add(lines);

jp.add (Box.createHorizontalGlue());

r.add(jp);

jp = new JPanel();

jp.setLayout (new BoxLayout (jp, BoxLayout.LINE_AXIS));

jp.add (Box.createRigidArea(ra));

jp.add (new JLabel («Уровень:»));

jp.add (Box.createHorizontalGlue());

r.add(jp);

levelLabel = new JLabel («1»);

levelLabel.setForeground (Color.BLUE);

jp = new JPanel();

jp.setLayout (new BoxLayout (jp, BoxLayout.LINE_AXIS));

jp.add (Box.createRigidArea(ra));

jp.add(levelLabel);

jp.add (Box.createHorizontalGlue());

r.add(jp);

jp = new JPanel();

jp.setLayout (new BoxLayout (jp, BoxLayout.LINE_AXIS));

jp.add (Box.createRigidArea(ra));

jp.add (new JLabel («Время:»));

jp.add (Box.createHorizontalGlue());

r.add(jp);

time = new JLabel («00:00:00»);

time.setForeground (Color.BLUE);

jp = new JPanel();

jp.setLayout (new BoxLayout (jp, BoxLayout.LINE_AXIS));

jp.add (Box.createRigidArea(ra));

jp.add(time);

jp.add (Box.createHorizontalGlue());

r.add(jp);

r.add (Box.createVerticalGlue());

r.add (addHelpPanel(«A or \u2190 - Влево»));

r.add (addHelpPanel(«D or \u2192 - Вправо»));

r.add (addHelpPanel(«W or \u2191 - Изменить»));

r.add (addHelpPanel(«S or \u2193 - Вниз»));

r.add (addHelpPanel(«Пробел - резко вниз»));

 //BUTTONS

r.add (Box.createRigidArea (new Dimension (0, 10)));

jp = new JPanel();

jp.setLayout (new BoxLayout (jp, BoxLayout.LINE_AXIS));

jp.add (Box.createRigidArea(ra));

JButton restartBut = new JButton («Рестарт»);

restartBut.setToolTipText («Нажмите 'R'»);

restartBut.setFocusable(false);

restartBut.addKeyListener(keyHandler);

restartBut.addActionListener (new ActionListener() {

public void actionPerformed (ActionEvent arg0) {

restart();

}

});

d = new Dimension (90, 30);

restartBut.setMinimumSize(d);

restartBut.setPreferredSize(d);

restartBut.setMaximumSize(d);

jp.add(restartBut);

jp.add (Box.createHorizontalGlue());

r.add(jp);

r.add (Box.createRigidArea (new Dimension (0, 5)));

jp = new JPanel();

jp.setLayout (new BoxLayout (jp, BoxLayout.LINE_AXIS));

jp.add (Box.createRigidArea(ra));

JButton pauseBut = new JButton («Пауза»);

pauseBut.setToolTipText («Нажмите 'P'»);

pauseBut.setFocusable(false);

pauseBut.addActionListener (new ActionListener() {

public void actionPerformed (ActionEvent arg0) {

pause();

}

});

pauseBut.setMinimumSize(d);

pauseBut.setPreferredSize(d);

pauseBut.setMaximumSize(d);

jp.add(pauseBut);

jp.add (Box.createHorizontalGlue());

r.add(jp);

return r;

}

private JPanel addHelpPanel (String help) {

JPanel jp = new JPanel();

jp.setLayout (new BoxLayout (jp, BoxLayout.LINE_AXIS));

jp.add (Box.createRigidArea (new Dimension (5,0)));

JLabel jL = new JLabel(help);

jL.setFont(font);

jL.setForeground (Color.GRAY);

jp.add(jL);

jp.add (Box.createHorizontalGlue());

return jp;

}

private JPanel getCopyrightPanel() {

JPanel r = new JPanel (new BorderLayout());

BoxLayout rL = new BoxLayout (r, BoxLayout.X_AXIS);

r.setLayout(rL);

r.setBorder (new EtchedBorder());

r.add (Box.createRigidArea (new Dimension (32,0)));

JLabel jL = new JLabel («Торгашев Денис Александрович»);

jL.setFont(font);

HTMLLink email = new HTMLLink («den8707@rambler.ru», true);

email.setFont(font);

r.add(jL);

r.add(email);

return r;

}

private JPanel getStatPanel() {

int h = 12;

JPanel r = new JPanel();

BoxLayout rL = new BoxLayout (r, BoxLayout.Y_AXIS);

r.setLayout(rL);

r.setBorder (new EtchedBorder());

JPanel[][] fig;

JPanel figP, statFP;

Dimension d = new Dimension (4*h, 4*h);

Figure f;

statsF = new JLabel[7];

statsL = new JLabel[4];

JPanel jp = new JPanel();

jp.setLayout (new BoxLayout (jp, BoxLayout.LINE_AXIS));

jp.add (Box.createRigidArea (new Dimension (5,0)));

jp.add (new JLabel («Статистика:»));

jp.add (Box.createHorizontalGlue());

r.add(jp);

r.add (Box.createRigidArea (new Dimension (0, 5)));

for (int k = 0; k < 7; k++) {

fig = new JPanel[4] [4];

figP = new JPanel();

statFP = new JPanel();

statFP.setLayout (new BoxLayout (statFP, BoxLayout.LINE_AXIS));

figP.setLayout (new GridLayout (4,4));

figP.setMinimumSize(d);

figP.setPreferredSize(d);

figP.setMaximumSize(d);

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

for (int j = 0; j < 4; j++) {

fig[i] [j] = new JPanel();

fig[i] [j].setBackground(nextBg);

figP.add (fig[i] [j]);

}

}

switch (k+1) {

case Figure.I: f = new FigureI(); f.setOffset (2,0); break;

case Figure.T: f = new FigureT(); f.setOffset (1,1); break;

case Figure.O: f = new FigureO(); f.setOffset (1,1); break;

case Figure.J: f = new FigureJ(); f.setOffset (1,1); break;

case Figure.L: f = new FigureL(); f.setOffset (1,1); break;

case Figure.S: f = new FigureS(); f.setOffset (1,1); break;

default: f = new FigureZ(); f.setOffset (1,1); break;

}

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

fig [f.arrY[i]+f.offsetY] [f.arrX[i]+f.offsetX].setBackground (f.getGolor());

fig [f.arrY[i]+f.offsetY] [f.arrX[i]+f.offsetX].setBorder (BorderFactory.createBevelBorder (BevelBorder.RAISED));

}

statFP.add(figP);

statFP.add (new JLabel (» X»));

statsF[k] = new JLabel («0»);

statsF[k].setForeground (Color.BLUE);

statFP.add (statsF[k]);

r.add(statFP);

}

r.add (Box.createRigidArea (new Dimension (100, 15)));

for (int i = 0; i < statsL.length; i++) {

statFP = new JPanel();

statFP.setLayout (new BoxLayout (statFP, BoxLayout.LINE_AXIS));

switch (i) {

case 0: statFP.add (new JLabel (» Простой X»)); break;

case 1: statFP.add (new JLabel («Двойной X»)); break;

case 2: statFP.add (new JLabel (» Тройной X»)); break;

default: statFP.add (new JLabel («Четверной X»)); break;

}

statsL[i] = new JLabel («0»);

statsL[i].setForeground (Color.BLUE);

statFP.add (statsL[i]);

r.add(statFP);

r.add (Box.createRigidArea (new Dimension (0, 5)));

}

return r;

}

static Image loadImage (String imageName) {

try {

Image im = ImageIO.read (new BufferedInputStream (

new ResClass().getClass().getResourceAsStream(imageName)));

return im;

} catch (Exception e) {

e.printStackTrace (System.out);

return null;

}

}

private synchronized void nextMove() {

f.setOffset (nextX, nextY);

if (tg.addFigure(f)) {

dropNext();

f.setOffset (nextX, nextY);

paintTG();

} else {

clearOldPosition();

}

paintNewPosition();

if(isGameOver) {

int tmp = tg.updateHiScore();

if (tmp >= 0) {

String s;

do {

s = JOptionPane.showInputDialog (this, «Введите своё имя…\n Длиной от 1-го до 10 символов», «Новый результат «+(tmp+1)+». Место», JOptionPane.PLAIN_MESSAGE);

} while (s!= null && (s.length() < 1 || s.length() > 10));

if (s == null) {

s = «<нет никто>»;

}

tg.saveHiScore (s, tmp);

if (tmp == 0)

hiScoreLabel.setText (««+tg.hiScore[0].score);

}

}

}

private void clearOldPosition() {

for (int j = 0; j < 4; j++) {

cells [f.arrY[j]+f.offsetYLast] [f.arrX[j]+f.offsetXLast].setBackground (Color.WHITE);

cells [f.arrY[j]+f.offsetYLast] [f.arrX[j]+f.offsetXLast].setBorder (BorderFactory.createLineBorder (Color.LIGHT_GRAY));

}

}

private void paintNewPosition() {

for (int j = 0; j < 4; j++) {

cells [f.arrY[j]+f.offsetY] [f.arrX[j]+f.offsetX].setBackground (f.getGolor());

cells [f.arrY[j]+f.offsetY] [f.arrX[j]+f.offsetX].setBorder (BorderFactory.createBevelBorder (BevelBorder.RAISED));

}

}

private void paintTG() {

int i = 0;

Color c;

for (int[] arr: tg.gLines) {

for (int j = 0; j < arr.length; j++) {

if (arr[j]!= 0) {

switch (arr[j]) {

case Figure.I: c = Figure.COL_I; break;

case Figure.T: c = Figure.COL_T; break;

case Figure.O: c = Figure.COL_O; break;

case Figure.J: c = Figure.COL_J; break;

case Figure.L: c = Figure.COL_L; break;

case Figure.S: c = Figure.COL_S; break;

default: c = Figure.COL_Z; break;

}

cells[i] [j].setBackground(c);

cells[i] [j].setBorder (BorderFactory.createBevelBorder (BevelBorder.RAISED));

} else {

cells[i] [j].setBackground (Color.WHITE);

cells[i] [j].setBorder (BorderFactory.createLineBorder (Color.LIGHT_GRAY));

}

}

i++;

}

}

private void showNext (Figure f) {

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

for (int j = 0; j < 4; j++) {

next[i] [j].setBackground(nextBg);

next[i] [j].setBorder (BorderFactory.createEmptyBorder());

}

}

for (int j = 0; j < f.arrX.length; j++) {

next [f.arrY[j]] [f.arrX[j]].setBackground (f.getGolor());

next [f.arrY[j]] [f.arrX[j]].setBorder (BorderFactory.createBevelBorder (BevelBorder.RAISED));

}

}

private void dropNext() {

if(isGameOver) return;

nextX = 4;

nextY = 0;

score.setText (««+tg.getScore());

lines.setText (««+tg.getLines());

levelLabel.setText (tg.getLevel()+» / 20»);

f = fNext;

fNext = ff.getRandomFigure();

showNext(fNext);

isGameOver = tg.isGameOver(f);

isNewFigureDroped = true;

updateStats();

}

private void moveLeft() {

if (isGameOver || isPause) return;

if (nextX-1 >= 0) {

if (tg.isNextMoveValid (f, f.offsetX-1, f.offsetY)) {

nextX -;

nextMove();

}

}

}

private void moveRight() {

if (isGameOver || isPause) return;

if (f.getMaxRightOffset()+1 < 10) {

if (tg.isNextMoveValid (f, f.offsetX+1, f.offsetY)) {

nextX++;

nextMove();

}

}

}

private synchronized void moveDown() {

if (isGameOver || isPause) return;

nextY++;

nextMove();

}

private synchronized void moveDrop() {

if (isGameOver || isPause) return;

f.offsetYLast = f.offsetY;

f.offsetXLast = f.offsetX;

clearOldPosition();

while (tg.isNextMoveValid (f, f.offsetX, f.offsetY)) {

f.setOffset (f.offsetX, f.offsetY+1);

}

tg.addFigure(f);

paintTG();

dropNext();

nextMove();

}

private synchronized void rotation() {

if (isGameOver || isPause) return;

for (int j = 0; j < f.arrX.length; j++) {

cells [f.arrY[j]+f.offsetY] [f.arrX[j]+f.offsetX].setBackground (Color.WHITE);

cells [f.arrY[j]+f.offsetY] [f.arrX[j]+f.offsetX].setBorder (BorderFactory.createLineBorder (Color.LIGHT_GRAY));

}

f.rotationRight();

if (! tg.isNextMoveValid (f, f.offsetX, f.offsetY)) {

f.rotationLeft();

}

nextMove();

}

private synchronized void pause() {

isPause =! isPause;

}

private void restart() {

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

for (int j = 0; j < 10; j++) {

tg.gLines.get(i) [j] = 0;

cells[i] [j].setBackground (Color.WHITE);

cells[i] [j].setBorder (BorderFactory.createLineBorder (Color.LIGHT_GRAY));

}

}

ff.resetCounts();

isGameOver = false;

isPause = false;

fNext = ff.getRandomFigure();

tt.resetTime();

time.setText («00:00:00»);

tg.resetStats();

dropNext();

nextMove();

}

private void updateStats() {

for (int i = 0; i < statsF.length; i++) {

statsF[i].setText (««+ff.getCounts() [i]);

}

for (int i = 0; i < statsL.length; i++) {

statsL[i].setText (««+tg.getDropLines() [i]);

}

}

private void doHelp() {

if (helpDialog == null) helpDialog = new HelpDialog(this);

helpDialog.show();

}

private void showHiScore() {

setHiScorePanel();

JOptionPane.showMessageDialog (this, hiScorePanel, «Счёт»,

JOptionPane.PLAIN_MESSAGE,

new ImageIcon (loadImage(«jetris32x32.png»)));

hiScorePanel = null;

}

private void setHiScorePanel() {

hiScorePanel = new JPanel (new BorderLayout());

String[] colNames = {«Место», «Очки», «Линии», «Имя»};

String[][] data = new String [tg.hiScore.length+1] [colNames.length];

data[0] = colNames;

for (int i = 0; i < tg.hiScore.length; i++) {

data [i+1] = new String [colNames.length];

data [i+1] [0] = (i+1)+».»;

data [i+1] [1] = (««+tg.hiScore[i].score);

data [i+1] [2] = (««+tg.hiScore[i].lines);

data [i+1] [3] = (««+tg.hiScore[i].name);

}

JTable table = new JTable (data, colNames);

table.setAutoResizeMode (JTable.AUTO_RESIZE_OFF);

table.setBackground (new Color (230,255,255));

table.setEnabled(false);

hiScorePanel.add (table, BorderLayout.CENTER);

}

private class PublishHandler implements ActionListener {

public void actionPerformed (ActionEvent ae) {

JButton jb = (JButton) ae.getSource();

PublishThread pt = new PublishThread(jb);

pt.start();

}

}

private class PublishThread extends Thread {

private JButton but;

PublishThread (JButton source) {

super();

but = source;

}

public void run() {

but.setEnabled(false);

boolean b = false;

try {

for (int i = 0; i < tg.hiScore.length; i++) {

PublishHiScore.publish (tg.hiScore[i]);

}

} catch (Exception e) {

e.printStackTrace();

b = true;

}

if(! b) {

}

but.setEnabled(true);

}

}

private class MenuHandler implements ActionListener {

public void actionPerformed (ActionEvent e) {

try {

JMenuItem tmp = (JMenuItem) e.getSource();

if (tmp == jetrisRestart) {

restart();

} else if (tmp == jetrisPause) {

pause();

} else if (tmp == jetrisHiScore) {

showHiScore();

} else if (tmp == jetrisExit) {

System.exit(0);

} else if (tmp == helpJetris) {

doHelp();

}

} catch (Exception exc) {

exc.printStackTrace (System.out);

}

}

}

}

Размещено на Allbest.ru


Подобные документы

  • Описание и установка интегрированной среды разработки Eclipse. Описание языка Java. Описание классов и методов, пакетов, использованных в программе, сервера и клиента. Разработка руководства пользователя для клиента и сервера. Пример работы чата.

    курсовая работа [443,5 K], добавлен 18.05.2015

  • Выполнение Java-программы. Набор программ и классов JDK. Объектно-ориентированное программирование в Java. Принципы построения графического интерфейса. Компонент и контейнер графической системы. Апплеты как программы, работающие в среде браузера.

    курсовая работа [42,3 K], добавлен 08.02.2011

  • История развития языка программирования Java. История тетриса - культовой компьютерной игры, изобретённой в СССР. Правила проведения игры, особенности начисления очков. Создание интерфейса программы, ее реализация в среде Java, кодирование, тестирование.

    курсовая работа [168,1 K], добавлен 27.09.2013

  • Разработка игры "Экзамен" с применением объектно-ориентированного программирования и языка Java (в среде Eclipse Helios). Структура программы и алгоритм решения задачи. Описание методов и переменных. Экспериментальное тестирование и оценка программы.

    курсовая работа [122,5 K], добавлен 19.05.2011

  • Встроенные типы данных, основные конструкции, структуры и применение языка Javа. Введение в интегрированную среду разработки Eclipse. Листинг программы, иллюстрирующей работу с одномерными массивами (создание массива). Спецификация класса Figure.

    методичка [1,4 M], добавлен 30.06.2009

  • Трансляция как процесс перевода программного кода из текстовой формы в машинные коды. Основные категории программ Java. Основные управляющие операторы. Объявление и инициализация переменных. Основные средства разработки приложений, написанных на Java.

    презентация [938,2 K], добавлен 26.10.2013

  • Основа пользовательского интерфейса. Возможности пакетов java.awt.geom, java.awt, классов java.awt.Graphics и java.awt.Graphics2D. Основные графические примитивы и работа с потоками. Листинг программы и составление композиции аффинных преобразований.

    методичка [525,3 K], добавлен 30.06.2009

  • Описание языков программирования Java и JavaFX. Среда разработки NetBeans и класс численных методов. Архитектура и принцип работы апплета с понятным пользовательским интерфейсом. Разработка алгоритма программы на примере модели межвидовой конкуренции.

    курсовая работа [1023,2 K], добавлен 19.09.2012

  • Описание алгоритма хода ЭВМ в режиме "пользователь-компьютер" в игре "Морской бой". Описание совокупности классов, их полей и методов. Разработка интерфейса и руководства пользователя по проведению игры. Листинг программы, написанной на языке Java.

    курсовая работа [645,0 K], добавлен 26.03.2014

  • Описание языка программирования Java: общие характеристики, главные свойства, краткий обзор. Надежность и безопасность, производительность и базовая система программы. Разработка программы поиска по словарю, алгоритм её работы. Общий вид кода программы.

    курсовая работа [20,3 K], добавлен 28.10.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.