игра Пятнашки
#39971837
Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
|
|
|
Нужно реализовать игру Пятнашки. Вот, что у меня получилось:
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.
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class Main extends JFrame {
private JPanel panel = new JPanel(new GridLayout(4, 4, 2, 2));
private JMenuBar menu = null;
private final String fileItems[] = new String [] {"Новая", "Справка", "Выход"};
private static Random generator = new Random(); // генератор случайных чисел
private int[][] numbers = new int[4][4];
public Main() {
setTitle("Пятнашки"); //Заголовок окна
setSize (300, 300); // Задаем размеры окна приложения
setLocationRelativeTo(null); // Окно приложения центрируется относительно экрана
setResizable(true); // задаем возможность растягивать окно
createMenu(); //инициализируем меню
setJMenuBar(menu); // добавляем панель меню к окну
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // закрываем программу при закрытии окна
Container container = getContentPane();
init();
panel.setDoubleBuffered(true);
panel.setBackground(Color.white); // устанавливаем цвет фона
container.add(panel); // добавление компонентов в контейнер
repaintField();
JLabel();
}
public void init() {
int[] invariants = new int[16]; // инициализируем массив с именем invariants из 16 элементов - лт 0 до 15
for (int i = 0; i < 4; i++) { // перебираем элементы i от 0 до 3
for (int j = 0; j < 4; j++) { // перебираем элементы j от 0 до 3
numbers[i][j] = 0; // указываем что перебор в цикле начинается с нулевого элемента
invariants[i*4 + j] = 0; // определяем какой из 16 элементов будет = 0
}
}
for (int i = 1; i < 16; i++) { // перебираем елементы i от 1 до 15
int k; //обьявляем переменную k типа int
int l; //обьявляем переменную l типа int
do { // цикл с послеусловием
k = generator.nextInt(100) % 4; // переменной k присваиваем произвольное число от 0 до 100 деленное по модулю на 4
l = generator.nextInt(100) % 4; // переменной l присваиваем произвольное число от 0 до 100 деленное по модулю на 4
}
while (numbers[k][l] != 0); // до тех пор пока двумерный массив numbers не равен 0
numbers[k][l] = i; // присваиваем двумерному массиву numbers значение i в цикле от 1 до 15
invariants[k*4+l] = i; // определяем позиции всех елементов кроме 0 на сетке
}
boolean change = true; // в булевую переменную change заносим значение true
int counter = 1; // инициализируем переменную counter типа int и присваиваем ей 1
while (change) {
change = false;
for (int i = 0; i < 16; i++) {
if (invariants[i] != i) {
for (int j = 0; j < 16; j++) {
if (invariants[j] == i) {
int temp = invariants[i];
invariants[i] = invariants[j];
invariants[j] = temp;
change = true;
counter++;
break;
}
}
break;
}
}
}
if (counter % 2 != 0) {
int temp = numbers[0][0];
numbers[0][0] = numbers[3][3];
numbers[3][3] = temp;
}
}
public void JLabel() {
Border solidBorder = BorderFactory.createLineBorder(Color.BLACK, 1); // создаем границу черного цвета
Font font = new Font("Verdana", Font.PLAIN, 15); // задаем тип шрифта, и его размер
JLabel topLabel = new JLabel(); // создаем обьект topLabel типа JLabel
topLabel.setBorder(solidBorder); // устанавливаем границу
topLabel.setFont(font); // устанавливаем тип текста
topLabel.setForeground(Color.RED); // Устанавливаем цвет текста
menu.add(topLabel); // добавляем JLabel на пенель menu
}
public void repaintField() { //метод расстановки кнопок со значениями на сетке
panel.removeAll();
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
JButton button = new JButton(Integer.toString(numbers[i][j]));
button.setFocusable(false);
panel.add(button);
button.setBackground(Color.magenta); // устанавливаем цвет кнопок
if (numbers[i][j] == 0) {
button.setVisible(false); // сокрытие нулевого элемента массива
} else
button.addActionListener(new ClickListener());
}
}
panel.validate();
}
public boolean checkWin() { //метод проверки победы
boolean status = true;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (i == 3 && j > 2) //проверка на то, что последняя ячейка в сетке пустая
break;
if (numbers[i][j] != i * 4 + j + 1) { //проверка на соотвествие элементам массива координатам в сетке
status = false;
}
}
}
return status;
}
private void createMenu() {
menu = new JMenuBar();
JMenu fileMenu = new JMenu("Меню");
for (int i = 0; i < fileItems.length; i++) {
JMenuItem item = new JMenuItem(fileItems[i]);
JSeparator separator = new JSeparator();
item.setActionCommand(fileItems[i].toLowerCase());
item.addActionListener(new NewMenuListener());
fileMenu.add(item);
fileMenu.add(separator);
}
menu.add(fileMenu);
}
private class NewMenuListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if ("выход".equals(command)) {
System.exit(0);
}
if ("справка".equals(command)) {
JOptionPane.showMessageDialog(null, "Автор: ...", "Справка", 1);
}
if ("новая игра".equals(command)) {
init();
repaintField();
}//
}
}
private class ClickListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
JButton button = (JButton) e.getSource();
button.setVisible(false);
String name = button.getText();
change(Integer.parseInt(name));
}
}
public void change(int num) { // передаем в качестве входящих параметров метода change переменную num типа int
int i = 0, j = 0; // присваиваем переменным i и j типа int значение равное 0
for (int k = 0; k < 4; k++) { // перебираем элементы k от 0 до 3
for (int l = 0; l < 4; l++) { // перебираем элементы l от 0 до 3
if (numbers[k][l] == num) { // если массив numbers[k][l] равен переменной num то,
i = k; // переменную i приравниваем переменной k
j = l; // переменную j приравниваем переменной l
}
}
}
/*реализация логики сдвигов кнопок на сетке 4 Х 4*/
//сдвиг вверх по строкам
if (i > 0) { // условие отвечающее за то можно ли сдвинуть кнопку по строке
if (numbers[i - 1][j] == 0) { //сравниваем значение координат элемента массива с кнопкой которая в текущем массиве равна нулю
numbers[i - 1][j] = num; //присваиваем переменной num значение координат элемента массива
numbers[i][j] = 0; //присваиваем нулевой элемент массива в ячейку которая перед этим смещалась в ноль
}
}
//сдвиг вниз по строкам
if (i < 3) {
if (numbers[i + 1][j] == 0) {
numbers[i + 1][j] = num;
numbers[i][j] = 0;
}
}
//сдвиг влево по столбцам
if (j > 0) {
if (numbers[i][j - 1] == 0) {
numbers[i][j - 1] = num;
numbers[i][j] = 0;
}
}
//сдвиг вправо по столбцам
if (j < 3) {
if (numbers[i][j + 1] == 0) {
numbers[i][j + 1] = num;
numbers[i][j] = 0;
}
}
repaintField();
if (checkWin()) {
JOptionPane.showMessageDialog(null, "ВЫ ВЫИГРАЛИ!", "Поздравляем", 1);
init();
repaintField();
setVisible(false);
setVisible(true);
}
}
public static void main(String[] args) throws InterruptedException {
Thread.sleep(1000);
JFrame app = new Main();
app.setVisible(true);
}
}
Сюда надо добавить управление клавиатурой и мнемоники и акселераторы, как это сделать я не знаю. Буду благодарен, если поможете)
|
|