Программирование игры "Тетрис" на 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