Вернуться на Страничку новостей.

01.03.2009

Задача 10.4 "Дверной замок."

Отдел безопасности Саванны занимается изготовлением дверных и цифровых замков с десятью кнопками, на которых указаны цифры от 0 до 9. с двумя кнопками: Индикатор и Открыть. При нажатии корректной последовательности из четырех цифр и кнопки Открыть загорается зеленая лампочка. В противном случае загорается красная лампочка. Создайте GUI-программу, обеспечивающую работу такого замка. Протестируйте ее, введя заранее в программу пять комбинаций цифр, которые пользователь должен выбрать, чтобы загорелся зеленый свет

Решение Для решения воспользуемся менеджером размещения BorderLayout. Создадим 10 кнопок для набора кода и разместим их в северной части фрейма. Создадим холст с изображением лампочки и поместим его в центре фрейма. Создадим еще 2 кнопки - "Открыть" и "Индикатор" и расположим их в южной части фрейма.

При правильном наборе кода загорится зеленая лампочка:

Подсказка

При неправильном наборе кода загорится красная лампочка:

Подсказка

При наборе пользователем кода мы должны перехватывать эти события (нажатие каждой кнопки из кнопок набора). Каждая кнопка имеет свое имя и свой вес. Первоначально вес каждой кнопки одинаков и равен 1. При каждом нажатии вес кнопки увеличивается на 1. Всего при правильном ходе событий пользователь должен сделать 4 нажатия. Общий вес всех кнопок при этом будет 14. Если какая-нибудь кнопка нажата более,чем 1 раз, то ее вес становится равным 15.

Каждая кнопка имеет свое имя. При нажатии на кнопку ее имя сохраняется в переменной типа Integer, далее эта переменная преобразуется в переменную типа String, и методом конкатенации из четырех переменных String (четыре клавиши) образуется контрольное слово, которое должно совпасть с ключом.

При нажатии клавиши "Открыть" проверяется контрольное слово и контрольная сумма. Если контрольное слово совпадает с ключом и общий вес нажатых клавиш равен 14, выполняется обработка - должна загореться зеленая лампочка. В противном случае должна загореться красная.

Для "зажигания" лампочек используем массив переменных типа Color. В каждом случае выбирая соответствующий цвет и перерисовывая холст при помощи инструкции repaint().

Код, открывающий замок - 4672

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



import java.awt.*;
import java.awt.event.*;

class Lock0 extends Frame implements ActionListener {

/*Программа "Кодовый дверной замок" версия 0
*Задача: Джуди Бишоп. Решение: Альберт Волос
* март 2009
*менеджер размещения элементов BorderLayout
*применение панелей Panels и холста Canvas
*перехват событий кнопок
*/
//объявим переменные
LightsCanvas lights;
Button exitButton,
openButton,
zeroButton,
oneButton,
twoButton,
threeButton,
fourButton,
fiveButton,
sixButton,
sevenButton,
eightButton,
nineButton;

Button but1[] = {

zeroButton,oneButton,twoButton, threeButton,fourButton,fiveButton, sixButton,sevenButton,eightButton,nineButton
};
Button but2[] = {openButton,exitButton};

String keySum,key1,key2,key3,key4;
String[] str = {"4672","8923","1623","2365","3287"};//ключи для входа
String[] str1 = {"0","1","2","3","4","5","6","7","8","9"};
String[] str2 = {"открыть","индикатор"};

int zero,one,two,three,four,five,six,seven,eight,nine;
int int2[] ={zero,one,two,three,four,five,six,seven,eight,nine};

Integer I_zero,I_one,I_two,I_three,I_four,I_five,I_six,I_seven,I_eight,I_nine;
Integer I_int[] = {I_zero,I_one,I_two,I_three,I_four,I_five,I_six,I_seven,I_eight,I_nine};

int a,b,c,d,f,g,h,i,j,k;
int int1[] = {a,b,c,d,f,g,h,i,j,k};

Lock0() {

//добавим компоненты во фрейм
Panel buttons1 = new Panel();
for(int i=0;i<10;i++){
but1[i] = new Button(str1[i]);
but1[i].addActionListener(this);
buttons1.add(but1[i]);
}
add("North", buttons1);

lights = new LightsCanvas();
add("Center", lights);

Panel buttons = new Panel();
for(int i=0;i<2;i++){

but2[i] = new Button(str2[i]);
but2[i].addActionListener(this);
buttons.add(but2[i]);
}
add("South", buttons);

// установим фрейм
setTitle("Lock Security version 0");
setSize(300,200);
setVisible(true); addWindowListener(new WindowAdapter () {

public void windowClosing(WindowEvent e) {
System.exit(0);
}
});

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

int1[j] = 1;
}

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

int2[j] = 1;
}

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

I_int[j] = new Integer(int2[i]);
}

}//end costruct Lock

public void actionPerformed(ActionEvent e) {

if (e.getSource() == but1[0]) {
int2[0] = 0;
I_int[0] = new Integer(int2[0]);
int1[0]++;
if(int1[0]>2){int1[0]=15;}
} else
if (e.getSource() == but1[1]) {
int2[1] = 1;
I_int[1] = new Integer(int2[1]);
int1[1]++;
if(int1[1]>2){int1[1]=15;}
} else
if (e.getSource() == but1[2]) {
int2[2] = 2;
I_int[2] = new Integer(int2[2]);
int1[2]++;
if(int1[2]>2){int1[2]=15;}
} else
if (e.getSource() == but1[3]) {
int2[3] = 3;
I_int[3] = new Integer(int2[3]);
int1[3]++;
if(int1[3]>2){int1[3]=15;}
} else
if (e.getSource() == but1[4]) {
int2[4] = 4;
I_int[4] = new Integer(int2[4]);
int1[4]++;
if(int1[4]>2){int1[4]=15;}
} else
if (e.getSource() == but1[5]) {
int2[5] = 5;
I_int[5] = new Integer(int2[5]);
int1[5]++;
if(int1[5]>2){int1[5]=15;}
} else
if (e.getSource() == but1[6]) {
int2[6] = 6;
I_int[6] = new Integer(int2[6]);
int1[6]++;
if(int1[6]>2){int1[6]=15;}
} else
if (e.getSource() == but1[7]) {
int2[7] = 7;
I_int[7] = new Integer(int2[7]);
int1[7]++;
if(int1[7]>2){int1[7]=15;}
} else
if (e.getSource() == but1[8]) {
int2[8] = 8;
I_int[8] = new Integer(int2[8]);
int1[8]++;
if(int1[8]>2){int1[8]=15;}
} else
if (e.getSource() == but1[9]) {
int2[9] = 9;
I_int[9] = new Integer(int2[9]);
int1[9]++;
if(int1[9]>2){int1[9]=15;}
} else
if (e.getSource() == but2[0]) {
key1 = I_int[4].toString();
key2 = I_int[6].toString();
key3 = I_int[7].toString();
key4 = I_int[2].toString();
//контрольное слово
keySum = key1+key2+key3+key4;

//контрольная сумма
int tik = 0;
for(int i =0;i<10;i++){

tik = tik+int1[i];
}

//если оба критерия соответствуют, то открыть
if(keySum.equals(str[0])&&tik==14){

col[0] = Color.green;
lights.repaint();
}
else{
col[0] = Color.red;
lights.repaint();
}

//вернуть переменные в исходное состояние
for(int j=0;j<10;j++){

int1[j] = 1;
}
for(int j=0;j<10;j++){
int2[j] = 1;
}

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

I_int[j] = new Integer(int2[i]);
}

} else
if (e.getSource() == but2[1]) {
col[0] = Color.gray;
lights.repaint();
}

}//end Performed

public static void main(String[] args) {

new Lock0 ();
}

Color[] col = {Color.gray,Color.red,Color.yellow,Color.green};

class LightsCanvas extends Canvas {

public void paint(Graphics g) {
g.setColor(col[0]);
g.fillOval(135, 30, 30, 30); // red
}
}

}//end program


Hosted by uCoz