Слайд 1Основы программирования - Java
ФИСТ 1 курс
Власенко Олег Федосович
Лекция 5
ООП.
Знакомство с
таймером, клавиатурой и мышкой
Слайд 2Неформальное введение в ООП
( Again )
Слайд 17UML – диаграмма классов
UML = Unified Modeling Language
Слайд 18источник вдохновения
http://www.slideshare.net/smirik/ruby-11754239
Слайд 20Перевод числа
из 10-й системы счисления в 2-ую
Пример:
N = 12
N
% 2 = 12 % 2 = 0 0 N
= N / 2 = 12 / 2 = 6 N > 0 +
N % 2 = 6 % 2 = 0 0 N = N / 2 = 6 / 2 = 3 N > 0 +
N % 2 = 3 % 2 = 1 1 N = N / 2 = 3 / 2 = 1 N > 0 +
N % 2 = 1 % 2 = 1 1 N = N / 2 = 1 / 2 = 0 N > 0 -
Полученные цифры нужно вывести в обратном порядке:
1100
Слайд 21Реализация через StringBuilder
public class Lect5Main1 {
public static void main(String[] args)
{
int num = 49;
StringBuilder str = new StringBuilder();
do {
int binDigit
= num % 2;
char binChar = binDigit == 0 ? '0' : '1';
str.append(binChar);
num = num / 2;
} while (num > 0);
str.reverse();
System.out.println(str.toString());
}
}
Слайд 22Реализация через стек
public class Lect5Main2 {
public static void main(String[] args)
{
int num = 129;
StackChar stack = new StackChar(32);
do {
int
binDigit = num % 2;
char binChar = binDigit == 0 ? '0' : '1';
stack.push(binChar);
num = num / 2;
} while (num > 0);
while (!stack.isEmpty()) {
System.out.print(stack.pop());
}
System.out.println();
}
}
Слайд 24Реализуем стек
public class StackChar {
private char [] stack;
private int top;
public
StackChar(int size) {
stack = new char[size];
top = 0;
}
public void push(char
ch) {
stack[top] = ch;
top++;
}
public char pop() {
top--;
return stack[top];
}
public boolean isEmpty() {
return top == 0;
}
}
Слайд 25Реализация через стек (Again)
public class Lect4Main2_v2 {
public static void main(String[]
args) {
int num = 129;
StackChar stack = new StackChar(32);
do
{
int binDigit = num % 2;
char binChar = binDigit == 0 ? '0' : '1';
stack.push(binChar);
num = num / 2;
} while (num > 0);
while (!stack.isEmpty()) {
System.out.print(stack.pop());
}
System.out.println();
}
}
Слайд 26Интерфейс
Интерфе́йс (англ. interface) — общая граница между двумя функциональными объектами, требования к
которой определяются стандартом;
совокупность средств, методов и правил взаимодействия (управления,
контроля и т.д.) между элементами системы. (https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81 )
Интерфейс это совокупность методов и правил взаимодействия элементов системы. Другими словами интерфейс определяет как элементы будут взаимодействовать между собой.
Интерфейс двери – элементы: ручка, замок
Интерфейс автомобиля – элементы: руль, педали, рычаг коробки передач.
Когда вы используете эти "объекты" вы уверены в том что вы сможете использовать их подобным образом. Благодаря тому что вы знакомы с их интерфейсом
Слайд 27Интерфейс IStackChar
public interface IStackChar {
void push(char ch);
char pop();
boolean isEmpty();
}
Слайд 28реализация стека №1
public class StackChar1 implements IStackChar {
private char []
stack;
private int top;
public StackChar1(int size) {
stack = new char[size];
top =
0;
}
@Override
public void push(char ch) {
stack[top] = ch;
top++;
}
…
}
Слайд 29реализация стека №2
import java.util.ArrayList;
public class StackChar2 implements IStackChar {
ArrayList stack;
public
StackChar2(int size) {
stack = new ArrayList(size);
}
@Override
public void push(char ch) {
stack.add(ch);
}
…
}
Слайд 30реализация стека №2 (ч 2)
public class StackChar2 implements IStackChar {
ArrayList
stack;
…
@Override
public char pop() {
int lastIndex = stack.size() - 1;
char ch
= stack.get(lastIndex);
stack.remove(lastIndex);
return ch;
}
@Override
public boolean isEmpty() {
return stack.isEmpty();
}
}
Слайд 31Решение с интерфейсом
public class Lect4Main2_v3 {
public static void main(String[] args)
{
int num = 26;
//IStackChar stack = new StackChar1(32);
IStackChar stack
= new StackChar2(32);
do {
int binDigit = num % 2;
char binChar = binDigit == 0 ? '0' : '1';
stack.push(binChar);
num = num / 2;
} while (num > 0);
while (!stack.isEmpty()) {
System.out.print(stack.pop());
}
System.out.println();
}
}
Слайд 34Модификаторы доступа
private: члены класса доступны только внутри класса;
«default» (package-private) (модификатор,
по-умолчанию): члены класса видны внутри пакета;
protected: члены класса доступны внутри
пакета и в наследниках;
public: члены класс доступны всем;
Слайд 35Модификаторы доступа
static - ссылка этого поля у любого экземпляра класса
будет ссылаться на одно и то же значение
final – это
модификатор, позволяющий объявлять константные поля в классе.
Слайд 36Элементы класса
public class Sample {
private int x; //
переменная экземпляра класса
private int y = 0; //
переменная экземпляра класса
public final int CURRENT_YEAR = 2012; // константа
protected static int bonus; // переменная класса
static String version = "Java SE 7"; // переменная класса
protected Calendar now;
public int method(int z) {
return z++;
}
}
Слайд 37Примеры использования статических методов
public class StaticSamples {
public static void main(String[]
args) {
double phi = Math.PI / 6;
System.out.printf("sin(%f)=%f\n", phi, Math.sin(phi));
phi =
Math.PI / 4;
System.out.printf("tan(%f)=%f\n", phi, Math.tan(phi));
phi = Math.PI / 2;
System.out.printf("tan(%f)=%f\n", phi, Math.tan(phi));
System.out.printf("sin(%f)=%f\n", phi, Math.sin(phi));
System.out.printf("cos(%f)=%f\n", phi, Math.cos(phi));
}
}
Слайд 38Конструкторы
public class Quest {
// конструктор без параметров (по
умолчанию)
public Quest() {
System.out.println("Вызван конструктор
без параметров!!!");
}
// конструктор с параметрами
public Quest(int idc, String txt) {
super(); /* вызов конструктора супер класса явным образом необязателен, компилятор вставит его автоматически*/
System.out.println("Вызван конструктор c параметрами!!!");
System.out.println(id + " " + text);
}
}
Слайд 39Порядок
инициализации класса
public class Department {
{ System.out.println("logic"); };
//2
static { System.out.println("static logic"); } //1
private int id = 7;
public Department(int d) {
id = d;
System.out.println("конструктор"); //3
}
int getId() { return id; }
{ id = 10; System.out.println("logic"); } //2
}
Слайд 40Абстрактный класс
public abstract class AbstractCourse {
private String name;
public AbstractCourse() {
}
public abstract void
changeTeacher(int id); /*определение метода отсутствует */
public void setName(String n) {
name = n;
}
}
Слайд 41Особенности
наследования в Java
public class ArrayList extends AbstractList implements List,
RandomAccess, Cloneable, Serializable {
…
}
Внимание: В Java класс наследуется от ОДНОГО
класса, но реализует произвольное количество интерфейсов.
Слайд 42Литература
http://www.slideshare.net/smirik/ruby-11754239 (источник вдохновения - наследование)
http://hashcode.ru/questions/136909/%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%D1%8B-%D0%B2-%D0%BE%D0%BE%D0%BF-java-%D0%BF%D0%BE-%D0%BF%D1%80%D0%BE%D1%81%D1%82%D0%BE%D0%BC%D1%83 (источник вдохновения - интерфейсы)
Слайд 45Создаем заготовку для игры
btnAddFigure = new JButton("Add");
btnAddFigure.addActionListener(new ActionListener() {
public void
actionPerformed(ActionEvent arg0) {
tetrisArray.addFigure();
textArea.setText(tetrisArray.toString());
panel.repaint();
if (tetrisArray.isGameOver()) {
btnToLeft.setEnabled(false);
btnAddFigure.setEnabled(false);
btnToRight.setEnabled(false);
btnDown.setEnabled(false);
btnTimer.setEnabled(false);
}
}
});
btnAddFigure.setBounds(64, 202, 89, 23);
frmLab.getContentPane().add(btnAddFigure);
Слайд 46Создаем заготовку для игры
btnToLeft = new JButton("
actionPerformed(ActionEvent e) {
tetrisArray.toLeft();
textArea.setText(tetrisArray.toString());
panel.repaint();
}
});
btnToLeft.setBounds(10, 202, 51, 23);
frmLab.getContentPane().add(btnToLeft);
Слайд 47Создаем заготовку для игры
btnToRight = new JButton(">>");
btnToRight.addActionListener(new ActionListener() {
public void
actionPerformed(ActionEvent e) {
tetrisArray.toRight();
textArea.setText(tetrisArray.toString());
panel.repaint();
}
});
btnToRight.setBounds(157, 202, 51, 23);
frmLab.getContentPane().add(btnToRight);
Слайд 48Создаем заготовку для игры
btnDown = new JButton("Down");
btnDown.addActionListener(new ActionListener() {
public void
actionPerformed(ActionEvent e) {
tetrisArray.fallToBottom();
textArea.setText(tetrisArray.toString());
panel.repaint();
}
});
btnDown.setBounds(64, 226, 89, 23);
frmLab.getContentPane().add(btnDown);
Слайд 49Создаем заготовку для игры
btnTimer = new JButton("Timer");
btnTimer.addActionListener(new ActionListener() {
public void
actionPerformed(ActionEvent arg0) {
tetrisArray.fallOneLine();
textArea.setText(tetrisArray.toString());
panel.repaint();
}
});
btnTimer.setBounds(279, 202, 102, 23);
frmLab.getContentPane().add(btnTimer);
Слайд 50Создаем заготовку для игры – TetrisArray
public class TetrisArray {
private int
[][]array;
private int lastI;
private int lastJ;
public TetrisArray() {
array = new int[6][8];
lastI
= array.length - 1;
lastJ = array[lastI].length - 1;
}
private int countFullLines = 0;
private boolean gameIsOver = false;
Слайд 51Создаем заготовку для игры – TetrisArray
public int getGameResult() {
return countFullLines;
}
public
void addFigure() {
if (canAddFigure()) {
array[0][3] = 1;
} else {
gameIsOver =
true;
}
}
public void addBrick(int i, int j) {
if (array[i][j] == 0) {
array[i][j] = 2;
}
}
Слайд 52Создаем заготовку для игры – TetrisArray
public void deleteBrick(int i, int
j) {
if (array[i][j] == 2) {
array[i][j] = 0;
}
}
public boolean isGameOver()
{
return gameIsOver;
}
boolean canAddFigure() {
if (array[0][3] == 0) {
return true;
} else {
return false;
}
}
Слайд 53Создаем заготовку для игры – TetrisArray
public void toLeft() {
if (!figureExist())
{
return;
}
if (canMoveToLeft()) {
moveToLeft();
} else {
fastenFigure();
}
}
public void toRight() {
if (!figureExist()) {
return;
}
if
(canMoveToRight()) {
moveToRight();
} else {
fastenFigure();
}
}
Слайд 54Создаем заготовку для игры – TetrisArray
void moveToLeft() {
for (int i
= 0; i
1; j <= lastJ; j++) {
if (array[i][j] == 1) {
array[i][j - 1] = 1;
array[i][j] = 0;
}
}
}
}
void moveToRight() {
for (int i = 0; i < lastI; i++) {
for (int j = lastJ - 1; j >= 0; j--) {
…
Слайд 55Создаем заготовку для игры – TetrisArray
public void fallToBottom() {
if (!figureExist())
{
return;
}
while (canMoveDown()) {
moveDown();
}
fastenFigure();
}
public void fallOneLine() {
if (!figureExist()) {
return;
}
if (canMoveDown()) {
moveDown();
}
else {
fastenFigure();
}
}
Слайд 56Создаем заготовку для игры – TetrisArray
void moveDown() {
// Начинаем с
предпоследней строки
for (int i = lastI - 1; i >=
0; i--) {
for (int j = 0; j <= lastJ; j++) {
if (array[i][j] == 1) {
array[i + 1][j] = 1;
array[i][j] = 0;
}
}
}
}
Слайд 57Создаем заготовку для игры – TetrisArray
boolean bottomLineIsFull() {
for (int j
= 0; j
{
return false;
}
}
return true;
}
Слайд 58Создаем заготовку для игры – TetrisArray
void deleteBottomLine() {
for (int i
= lastI - 1; i >= 0; i--) {
for (int
j = 0; j <= lastJ; j++) {
array[i + 1][j] = array[i][j];
}
}
for (int j = 0; j <= lastJ; j++) {
array[0][j] = 0;
}
}
Слайд 59Создаем заготовку для игры – TetrisArray
public boolean figureExist() {
for (int
i = 0; i
= 0; j <= lastJ; j++) {
if (array[i][j] == 1) {
return true;
}
}
}
return false;
}
Слайд 60Создаем заготовку для игры – TetrisArray
boolean canMoveDown() {
for (int i
= 0; i < lastI; i++) {
for (int j =
0; j <= lastJ; j++) {
if (array[i][j] == 1) {
if (array[i + 1][j] == 2) {
return false;
}
}
}
}
for (int j = 0; j <= lastJ; j++) {
if (array[lastI][j] == 1) {
return false;
}
}
return true;
}
Слайд 61Создаем заготовку для игры – TetrisArray
boolean canMoveToLeft() {
for (int i
= 0; i
1; j <= lastJ; j++) {
if (array[i][j] == 1) {
if (array[i][j - 1] == 2) {
return false;
}
}
}
}
for (int i = 0; i <= lastI; i++) {
if (array[i][0] == 1) {
return false;
}
}
return true;
}
Слайд 62Создаем заготовку для игры – TetrisArray
boolean canMoveToRight() {
for (int i
= 0; i
0; j < lastJ; j++) {
if (array[i][j] == 1) {
if (array[i][j + 1] == 2) {
return false;
}
}
}
}
for (int i = 0; i <= lastI; i++) {
if (array[i][lastJ] == 1) {
return false;
}
}
return true;
}
Слайд 63Создаем заготовку для игры – TetrisArray
void fastenFigure() {
for (int i
= 0; i
0; j <= lastJ; j++) {
if (array[i][j] == 1) {
array[i][j] = 2;
}
}
}
if (bottomLineIsFull()) {
deleteBottomLine();
countFullLines++;
}
}
Слайд 64Создаем заготовку для игры – TetrisArray
public String toString() {
String str
= "";
for (int i = 0; i
{
for (int j = 0; j <= lastJ; j++) {
str = str + array[i][j] + " ";
}
str = str + "\n";
}
str = str + "\n";
str = str + "countFullLines=" + countFullLines + "\n";
if (gameIsOver) {
str = str + "GAME IS OVER!!!" + "\n";
}
return str;
}
Слайд 65Создаем заготовку для игры – TetrisArray
final public static int CELL_HEIGHT
= 24;
final public static int CELL_WIDTH = 24;
public void drawArray(Graphics
g, int width, int height) {
for (int i = 0; i < array.length; i++) {
int top = i * CELL_HEIGHT;
for (int j = 0; j < array[i].length; j++) {
int left = j * CELL_WIDTH;
if (array[i][j] == 0) {
g.setColor(Color.GRAY);
} else if (array[i][j] == 1) {
g.setColor(Color.BLUE);
} else if (array[i][j] == 2) {
g.setColor(Color.RED);
}
g.fillRect(left, top, CELL_WIDTH, CELL_HEIGHT);
}
}
}
Слайд 67Создаем почти игру - interface Updated
public interface Updated {
void
update();
}
Слайд 68Создаем почти игру - Win_TetrisGame
public class Win_TetrisGame
implements KeyListener,
Updated {
...
TetrisArray tetrisArray;
private JPanel panel;
private javax.swing.Timer timer;
private JLabel lblGameResult;
private JLabel
lblGameOver;
Слайд 69Создаем почти игру - Win_TetrisGame
/**
* Initialize the contents
of the frame.
*/
private void initialize() {
frmLab = new JFrame();
frmLab.setTitle("Lab8
- \u043C\u044B \u0434\u0435\u043B\u0430\u0435\u043C \u0438\u0433\u0440\u0443!");
frmLab.setBounds(100, 100, 450, 300);
frmLab.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frmLab.getContentPane().setLayout(null);
frmLab.addKeyListener(this); // Форма СЛУШАЕТ клавиатуру
panel = new TetrisPanel(tetrisArray, this);
panel.setBounds(10, 11, 249, 180);
frmLab.getContentPane().add(panel);
Слайд 70Создаем почти игру - Win_TetrisGame
lblGameResult = new JLabel("Count =
0");
lblGameResult.setBounds(284, 35, 113, 14);
frmLab.getContentPane().add(lblGameResult);
lblGameOver = new JLabel("");
lblGameOver.setFont(new Font("Traditional Arabic", Font.BOLD,
14));
lblGameOver.setBounds(277, 84, 131, 14);
frmLab.getContentPane().add(lblGameOver);
Слайд 71Создаем почти игру - Win_TetrisGame
//Будет вызываться каждые 500 мсек
timer
= new Timer(1000, new ActionListener() {
public void actionPerformed(ActionEvent e) {
if
(tetrisArray.figureExist()) {
tetrisArray.fallOneLine();
} else {
tetrisArray.addFigure();
}
panel.repaint();
String res = "Count = " + tetrisArray.getGameResult();
lblGameResult.setText(res);
if (tetrisArray.isGameOver()) {
lblGameOver.setText("GAME OVER!");
}
}
} );
timer.start();
Слайд 72Создаем почти игру - Win_TetrisGame
}
@Override
public void keyReleased(KeyEvent arg0) {
switch(arg0.getKeyCode())
{
case KeyEvent.VK_LEFT:
tetrisArray.toLeft();
panel.repaint();
break;
case KeyEvent.VK_RIGHT:
tetrisArray.toRight();
panel.repaint();
break;
Слайд 73Создаем почти игру - Win_TetrisGame
case KeyEvent.VK_DOWN:
tetrisArray.fallToBottom();
panel.repaint();
break;
default:
return;
}
String res = "Count
= " + tetrisArray.getGameResult();
lblGameResult.setText(res);
if (tetrisArray.isGameOver()) {
lblGameOver.setText("GAME OVER!");
}
}
Слайд 74Создаем почти игру - Win_TetrisGame
@Override
public void keyPressed(KeyEvent arg0) {
//
TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated
method stub
}
@Override
public void update() {
panel.repaint();
}
}
Слайд 75Создаем почти игру - TetrisPanel
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JPanel;
public class
TetrisPanel extends JPanel implements MouseListener {
TetrisArray arr;
Updated win;
public TetrisPanel(TetrisArray array,
Updated window) {
arr = array;
win = window;
addMouseListener(this); // Слушатель ТЕПЕРЬ слушает!!!
}
Слайд 76Создаем почти игру - TetrisPanel
public void paint(Graphics g) {
super.paint(g);
arr.drawArray(g, this.getWidth(),
this.getHeight());
}
Слайд 77Создаем почти игру - TetrisPanel
@Override
public void mouseClicked(MouseEvent me) {
int i
= me.getY() / TetrisArray.CELL_HEIGHT;
int j = me.getX() / TetrisArray.CELL_WIDTH;
int cntClicks
= me.getClickCount();
if (cntClicks == 2) {
arr.addBrick(i, j);
} else {
arr.deleteBrick(i, j);
}
//repaint();
win.update();
}
Слайд 78Создаем почти игру - TetrisPanel
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO
Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method
stub
}
Слайд 79Создаем почти игру - TetrisPanel
@Override
public void mousePressed(MouseEvent arg0) {
// TODO
Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method
stub
}
}
Слайд 80Создаем почти игру
MouseListener, правая и левая кнопка мыши - https://javatalks.ru/topics/4964
Слайд 81Спасибо за внимание!
Власенко Олег Федосович
E-mail: vlasenko.oleg@gmail.com
Vk: vk.com/oleg.f.vlasenko
Телефон: 8 902 246
05 47