Разделение логики игры
30.08.2018, 13:33. Показов 1305. Ответов 1
Здравствуйте. Делю логику игры Виселица и есть ошибки, которые я не знаю, как исправить.
1. Я не понимаю, почему у меня не отображается на JPanel слово, преобразованное в нижние подчеркивания.
2. При угадывании слова не учитываются неверные угадывания, то есть игрок может сколько угодно нажимать на кнопки с буквами алфавита, в результате чего будет появляться надпись "Sorry *button text" is not part of the word".
Этот класс работает, но в нем нет деления на ui и логику.
| Java | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
| package com.fbenk.hangman;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.image.BufferedImage;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.File;
import javax.imageio.ImageIO;
import java.util.LinkedList;
import java.util.Arrays;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
public class Hangman_testGIT extends JFrame implements ActionListener, MouseListener {
public static void main(String[] args) {
Hangman_testGIT hangman = new Hangman_testGIT();
hangman.setVisible(true);
hangman.setResizable(false);
}
public static final String FILE_START = "Play";
public static final String FILE_STOP = "Exit";
public static final String SHOW_REPLAY = "Play again?";
public static JLabel j1;
// changes the state of the file
private int state = 0;
// Random genator for word array
public Random rGen = new Random();
// word array to random phrase
private static char[] randPhrase;
// word array contains words from txt
private static String[] words;
// Char array that houses the user guesses
private static char[] guesses;
// counts the number of hangman bodyparts
public static int numBodyParts = 0;
//holds the pic of gallow
public BufferedImage img, img1, img2, img3, img4, img5, img6;
// holds the letters that the user guesses
private static String numGuesses = "";
// variable made to prevent 2 equal words during the playtime
public static String randomWord;
// all my panels - mainpanel holds left/right/bottom(keyboard)
public static JPanel mPanel, jp, lPanel, rPanel, bottomPanel, belowPanel;
public Hangman_testGIT() {
// pass title to super class
super("Hangman");
// set size of the jframe
setSize(600, 600);
// populate word array
words = getWordList();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mPanel = new JPanel();
mPanel.setLayout(new GridLayout(3, 0));
rPanel = new JPanel();
lPanel = new JPanel();
mPanel.add(lPanel);
mPanel.add(rPanel);
bottomPanel = new JPanel();
bottomPanel.setLayout(new GridLayout(4, 4));
mPanel.add(bottomPanel, BorderLayout.SOUTH);
belowPanel = new JPanel();
add(mPanel);
add(belowPanel, BorderLayout.AFTER_LAST_LINE);
// invisibility of below panel until you lost
belowPanel.setVisible(false);
// menu
makeMenu();
// keyboard
createButtons(bottomPanel);
// replay/exit buttons
replay(belowPanel);
addMouseListener(this);
}
// creates 2 buttons for replay/exit and adds actionlisteners
public void replay(JPanel belowPanel) {
JButton playAgain = new JButton(SHOW_REPLAY);
playAgain.setSize(100, 100);
playAgain.setActionCommand(SHOW_REPLAY);
playAgain.addActionListener(this);
JButton exit = new JButton(FILE_STOP);
exit.setActionCommand(FILE_STOP);
exit.addActionListener(this);
exit.setSize(100, 100);
belowPanel.add(playAgain);
belowPanel.add(exit);
}
// creates buttons with letters
public void createButtons(JPanel bottomPanel) {
JButton[] buttons = new JButton[26];
String[] alph = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
"W", "X", "Y", "Z" };
for (int i = 0; i < buttons.length; i++) {
buttons[i] = new JButton(alph[i]);
buttons[i].setSize(40, 40);
buttons[i].setActionCommand(alph[i]);
buttons[i].addActionListener(this);
bottomPanel.add(buttons[i]);
}
}
// creates menu and menuitems
public void makeMenu() {
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu fileMenu = new JMenu("Choose File");
menuBar.add(fileMenu);
makeItem(fileMenu, FILE_START);
makeItem(fileMenu, FILE_STOP);
}
// creates menu items with action listeners
public void makeItem(JMenu menu, String itemName) {
JMenuItem menuItem = new JMenuItem(itemName);
menuItem.addActionListener(this);
menu.add(menuItem);
}
public void paint(Graphics g) {
super.paint(g);
// if 'play' selected
if (state == 1) {
gameMessages(g);
String result = "";
for (int i = 0; i < guesses.length; i++) {
result += guesses[i] + " ";
}
g.drawString(result, 300, 175);
// if the letter is wrong
draw(g);
}
}
// draws parts of hangman`s body
private void draw (Graphics g) {
j1 = new JLabel();
jp = new JPanel();
if (numBodyParts >= 1) {
try {
img = ImageIO.read(new File("C:\\book\\hangman\\h0.png"));
}
catch (IOException ioe) {
System.exit(0);
}
j1 = new JLabel(new ImageIcon(img));
jp.setLayout(new BorderLayout());
jp.add(j1, BorderLayout.WEST);
g.drawImage(img, 10, 100, jp);
if (numBodyParts >= 2) {
try {
img1 = ImageIO.read(new File("C:\\book\\hangman\\h1.png"));
g.drawImage(img1, 10, 100, jp) ;
}
catch (IOException ioe) {};
}
if (numBodyParts >= 3) {
try {
img2 = ImageIO.read(new File("C:\\book\\hangman\\h2.png"));
g.drawImage(img2, 10, 100, jp) ;
}
catch (IOException ioe) {};
}
if (numBodyParts >= 4) {
try {
img3 = ImageIO.read(new File("C:\\book\\hangman\\h3.png"));
g.drawImage(img3, 10, 100, jp) ;
}
catch (IOException ioe) {};
}
if (numBodyParts >= 5) {
try {
img4 = ImageIO.read(new File("C:\\book\\hangman\\h4.png"));
g.drawImage(img4, 10, 100, jp) ;
}
catch (IOException ioe) {};
}
if (numBodyParts >= 6) {
try {
img5 = ImageIO.read(new File("C:\\book\\hangman\\h5.png"));
g.drawImage(img5, 10, 100, jp) ;
}
catch (IOException ioe) {};
}
if (numBodyParts >= 7) {
try {
img6 = ImageIO.read(new File("C:\\book\\hangman\\h6.png"));
g.drawImage(img5, 10, 100, jp);
g.drawString("You lost. To try again choose 'File' from Menu.", 300, 80);
}
catch (IOException ioe) {};
}
}
}
// shows winner`s/ loser`s message on Panel
private void gameMessages(Graphics g) {
if (Arrays.equals(guesses, randPhrase) && numBodyParts < 7) {
g.drawString("You Won!", 50, 80);
bottomPanel.setVisible(false);
belowPanel.setVisible(true);
} else if (numBodyParts == 7) {
bottomPanel.setVisible(false);
belowPanel.setVisible(true);
}
}
// generates a random word and returns it as string
public String getword() {
words = getWordList();
int n = words.length;
int r = rGen.nextInt(n);
String word = words[r];
return word;
}
// takes word from list placed in file
public String[] getWordList() {
LinkedList<String> list = new LinkedList<String>();
String str;
BufferedReader in = null;
try {
FileReader wordList = new FileReader(
"C:\\book\\words_eng.txt");
in = new BufferedReader(wordList);
while((str = in.readLine())!= null) {
list.add(str);
}
}
catch (IOException exc) { exc.printStackTrace(); }
finally {
try { in.close(); }
catch (IOException e) {
System.out.println(e.getMessage());
System.exit(-1);
}
}
return list.toArray(new String[list.size()]);
}
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if (cmd.equals(FILE_START)) {
state = 1;
play();
repaint();
}
else if (cmd.length() == 1 && state == 1) {
letters(cmd);
}
//replay
else if (cmd.equals(SHOW_REPLAY)) {
numBodyParts = 0;
numGuesses = "";
bottomPanel.setVisible(true);
state = 1;
play();
repaint();
} else if (cmd.equals(FILE_STOP)) {
state = 2;
System.exit(0);
}
}
// compares pressed button to random phrase
public void letters(String cmd) {
if (randomWord.contains(cmd.toLowerCase())) {
for (int i = 0; i < randPhrase.length; i++) {
if (cmd.toLowerCase().charAt(0) == randPhrase[i]) {
guesses[i] = cmd.toLowerCase().charAt(0);
}
}
// increase of parts of the body if letter`s wrong
} else if (!randomWord.contains(cmd.toLowerCase())) {
JOptionPane.showMessageDialog(null, "Sorry " + cmd
+ " is not part of the word");
numBodyParts++;
}
numGuesses += cmd;
repaint();
}
// change '_' to letter if user guessed any letter
public void play() {
// takes random word
randomWord = getword();
// random word to char array
randPhrase = randomWord.toCharArray();
// holds user input
guesses = new char[randPhrase.length];
for (int i = 0; i < guesses.length; i++) {
guesses[i] = '_';
}
}
public void mouseClicked(MouseEvent e) { }
public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
public void mousePressed(MouseEvent e) { }
public void mouseReleased(MouseEvent e) { }
} |
|
Вот 3 класса, которые не могу связать между собой.
1. Класс, преобразующий слово, взятое из словаря, в строку из нижних подчеркиваний.
| Java | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
| package com.fbenk.hangman;
import javax.swing.*;
import java.awt.*;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Random;
public class GuessProcess extends JFrame {
// generates randomly the word array
private static Random rGen = new Random();
// transforms word array to random phrase
private static char[] randPhrase;
// word array contains words from txt
private static String[] words;
// char array houses the user guesses
private static char[] guesses;
// excludes 2 equal words during runtime
private static String randomWord;
private static HangmanFrame ng = new HangmanFrame();
public static String numGuesses = ng.getnumGuesses();
private static HangmanFrame botp = new HangmanFrame();
private static JPanel bottomPanel = botp.getbottomPanel();
private static HangmanFrame belowp= new HangmanFrame();
private static JPanel belowPanel = belowp.getbelowPanel();
private static HangmanFrame nbp= new HangmanFrame();
private static int numBodyParts = nbp.getnumBodyParts();
public char[] getguesses() { return guesses; }
public static String[] getWords(){ return words; }
public static void setBelowp(HangmanFrame belowp) {
GuessProcess.belowp = belowp;
}
// shows winner`s/ loser`s message on Panel
public void gameMessages(Graphics g) {
if (Arrays.equals(guesses, randPhrase) && numBodyParts < 7) {
g.drawString("You Won!", 50, 80);
bottomPanel.setVisible(false);
belowPanel.setVisible(true);
} else if (numBodyParts == 7) {
bottomPanel.setVisible(false);
belowPanel.setVisible(true);
}
}
// generates a random word and returns it as string
public String getword() {
words = getWordList();
int n = words.length;
int r = rGen.nextInt(n);
String word = words[r];
return word;
}
// takes word from list placed in file
public String[] getWordList() {
LinkedList<String> list = new LinkedList<String>();
String str;
BufferedReader in = null;
try {
FileReader wordList = new FileReader(
"C:\\book\\words_eng.txt");
in = new BufferedReader(wordList);
while((str = in.readLine())!= null) {
list.add(str);
}
}
catch (IOException exc) { exc.printStackTrace(); }
finally {
try { in.close(); }
catch (IOException e) {
System.out.println(e.getMessage());
System.exit(-1);
}
}
return list.toArray(new String[list.size()]);
}
// compares pressed button to random phrase
public void letters(String cmd) {
if (randomWord.contains(cmd.toLowerCase())) {
for (int i = 0; i < randPhrase.length; i++) {
if (cmd.toLowerCase().charAt(0) == randPhrase[i]) {
guesses[i] = cmd.toLowerCase().charAt(0);
}
}
// increase of parts of the body if letter`s wrong
} else if (!randomWord.contains(cmd.toLowerCase())) {
JOptionPane.showMessageDialog(null, "Sorry " + cmd
+ " is not part of the word");
numBodyParts++;
}
numGuesses += cmd;
repaint();
}
// change '_' to letter if user guessed any letter
public void play() {
// takes random word
randomWord = getword();
// random word to char array
randPhrase = randomWord.toCharArray();
// holds user input
guesses = new char[randPhrase.length];
for (int i = 0; i < guesses.length; i++) {
guesses[i] = '_';
}
}
} |
|
2. Класс, содержащий методы с рисованием картинок и вывод массива нижнего подчеркивания.
| Java | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
| package com.fbenk.hangman;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class HangmanPainter extends JFrame {
private static JLabel j1;
private static JPanel jp;
public static BufferedImage img, img1, img2, img3, img4, img5, img6;
HangmanFrame nbp = new HangmanFrame();
int numBodyParts = nbp.getnumBodyParts();
GuessProcess guess = new GuessProcess();
char[] guesses = guess.getguesses();
GuessProcess gamemess = new GuessProcess();
public void paint(Graphics g) {
super.paint(g);
gamemess.gameMessages(g);
String result = "";
for (int i = 0; i < guesses.length; i++) {
result += guesses[i] + " ";
}
g.drawString(result, 300, 175);
// if the letter is wrong
draw(g);
}
// draws parts of hangman`s body
public void draw(Graphics g) {
j1 = new JLabel();
jp = new JPanel();
if (numBodyParts >= 1) {
try {
img = ImageIO.read(new File("C:\\book\\hangman\\h0.png"));
}
catch (IOException ioe) {
System.exit(0);
}
j1 = new JLabel(new ImageIcon(img));
jp.setLayout(new BorderLayout());
jp.add(j1, BorderLayout.WEST);
g.drawImage(img, 10, 100, jp);
if (numBodyParts >= 2) {
try {
img1 = ImageIO.read(new File("C:\\book\\hangman\\h1.png"));
g.drawImage(img1, 10, 100, jp) ;
}
catch (IOException ioe) {};
}
if (numBodyParts >= 3) {
try {
img2 = ImageIO.read(new File("C:\\book\\hangman\\h2.png"));
g.drawImage(img2, 10, 100, jp) ;
}
catch (IOException ioe) {};
}
if (numBodyParts >= 4) {
try {
img3 = ImageIO.read(new File("C:\\book\\hangman\\h3.png"));
g.drawImage(img3, 10, 100, jp) ;
}
catch (IOException ioe) {};
}
if (numBodyParts >= 5) {
try {
img4 = ImageIO.read(new File("C:\\book\\hangman\\h4.png"));
g.drawImage(img4, 10, 100, jp) ;
}
catch (IOException ioe) {};
}
if (numBodyParts >= 6) {
try {
img5 = ImageIO.read(new File("C:\\book\\hangman\\h5.png"));
g.drawImage(img5, 10, 100, jp) ;
}
catch (IOException ioe) {};
}
if (numBodyParts >= 7) {
try {
img6 = ImageIO.read(new File("C:\\book\\hangman\\h6.png"));
g.drawImage(img5, 10, 100, jp);
g.drawString("You lost. To try again choose 'File' from Menu.", 300, 80);
}
catch (IOException ioe) {};
}
}
}
} |
|
3. Основной класс с методом main().
| Java | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
| package com.fbenk.hangman;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class HangmanFrame extends JFrame implements ActionListener, MouseListener {
private JPanel mPanel, rPanel, lPanel, bottomPanel, belowPanel;
// changes the state of the file
private int state = 0;
// counts the number of hangman bodyparts
private static int numBodyParts = 0;
// holds the letters that the user guesses
private static String numGuesses = "";
GuessProcess gpp = new GuessProcess();
public static void main (String[] args) {
HangmanFrame hf = new HangmanFrame();
hf.setVisible(true);
hf.setResizable(false);
}
GuessProcess gpw = new GuessProcess();
String[] words = gpw.getWords();
public HangmanFrame() {
super("Hangman");
words = gpp.getWordList();
// set jframe size
setSize(600, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mPanel = new JPanel();
mPanel.setLayout(new GridLayout(3, 0));
rPanel = new JPanel();
lPanel = new JPanel();
mPanel.add(lPanel);
mPanel.add(rPanel);
bottomPanel = new JPanel();
bottomPanel.setLayout(new GridLayout(4, 4));
mPanel.add(bottomPanel, BorderLayout.SOUTH);
belowPanel = new JPanel();
add(mPanel);
add(belowPanel, BorderLayout.AFTER_LAST_LINE);
// sets below panel invisible until player loses
belowPanel.setVisible(false);
// creates menu
createMenu();
// creates keyboard
createButtons(bottomPanel);
// creates replay/exit buttons
createReplayButtons(belowPanel);
addMouseListener(this);
}
public int getnumBodyParts() {
return numBodyParts;
}
public String getnumGuesses() {
return numGuesses;
}
public JPanel getbottomPanel() {
return this.bottomPanel;
}
public JPanel getbelowPanel() {
return this.belowPanel;
}
public int getState() {
return this.state;
}
// creates 2 buttons for replay/exit and adds actionlisteners
private void createReplayButtons(JPanel belowPanel) {
JButton playAgain = new JButton("Play again?");
playAgain.setSize(100, 100);
playAgain.setActionCommand("Play again?");
playAgain.addActionListener(this);
JButton exit = new JButton("Exit");
exit.setActionCommand("Exit");
exit.addActionListener(this);
exit.setSize(100, 100);
belowPanel.add(playAgain);
belowPanel.add(exit);
}
// creates buttons with letters
private void createButtons(JPanel bottomPanel) {
JButton[] buttons = new JButton[26];
String[] alph = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
"W", "X", "Y", "Z" };
for (int i = 0; i < buttons.length; i++) {
buttons[i] = new JButton(alph[i]);
buttons[i].setSize(40, 40);
buttons[i].setActionCommand(alph[i]);
buttons[i].addActionListener(this);
buttons[i].setBorderPainted(false);
buttons[i].setFocusPainted(false);
buttons[i].setContentAreaFilled(false);
buttons[i].setFont(new Font("Courier New", Font.ITALIC, 20));
buttons[i].setForeground(Color.RED);
bottomPanel.add(buttons[i]);
bottomPanel.setBackground(Color.black);
}
}
// creates menu and menuitems
private void createMenu() {
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu fileMenu = new JMenu("Choose File");
menuBar.add(fileMenu);
makeItem(fileMenu, "Play");
makeItem(fileMenu, "Exit");
}
// creates menu items with action listeners
private void makeItem(JMenu menu, String itemName) {
JMenuItem menuItem = new JMenuItem(itemName);
menuItem.addActionListener(this);
menu.add(menuItem);
}
public void playing(Graphics g) {
gpp.paint(g);
}
@Override
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if (cmd.equals("Play")) {
state = 1;
gpp.play();
repaint();
}
else if (cmd.length() == 1 && state == 1) {
gpp.letters(cmd);
}
//replay
else if (cmd.equals("Play again?")) {
numBodyParts = 0;
numGuesses = "";
bottomPanel.setVisible(true);
state = 1;
gpp.play();
repaint();
} else if (cmd.equals("Exit")) {
state = 2;
System.exit(0);
}
}
@Override
public void mouseClicked(MouseEvent e) { }
@Override
public void mouseEntered(MouseEvent e) { }
@Override
public void mouseExited(MouseEvent e) { }
@Override
public void mousePressed(MouseEvent e) { }
@Override
public void mouseReleased(MouseEvent e) { }
} |
|
Заранее спасибо за любое содействие.
0
|