Advertisement
Guest User

Untitled

a guest
Sep 30th, 2016
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.28 KB | None | 0 0
  1. import javax.swing.*;
  2. import javax.swing.Timer;
  3. import javax.swing.border.Border;
  4. import java.awt.*;
  5. import java.awt.event.*;
  6. import java.awt.color.*;
  7. import java.util.*;
  8.  
  9. public class pt extends JFrame { // класс pt называют прямым наследником класса JFrame
  10.  
  11. /*При построении интерфейсов нужны компоненты-контерйнеры, которые будут содержать другие компоненты
  12. пользовательского интерфейса. В Swing одним из таких компонентов-контейнеров является JPanel.
  13. Класс GridLayout позволяет размещать компоненты в контейнере в виде таблицы. В каждой ячейке таблицы может быть размещен только один компонент.
  14. Количество строк и столбцов таблицы определяется или в конструкторе, или вызовом методов setColumns и setRows.*/
  15.  
  16. private JPanel panel = new JPanel(new GridLayout(4, 4, 2, 2));
  17.  
  18. /*Главное меню JMenuBar - компонент графического интерфейса Java Swing*/
  19.  
  20. private JMenuBar menu = null;
  21. private final String fileItems[] = new String [] {"New", "Statistic", "Exit"};
  22. private static Random generator = new Random(); // генератор случайных чисел
  23. private int[][] numbers = new int[4][4];
  24.  
  25. /* -=== Опредиление клиентской ширины екрана ===- */
  26.  
  27. //опредиление размеров екрана
  28. //Класс Toolkit является абстрактным суперклассом для всех реализаций AWT.
  29. //Порожденные от него классы используются для привязки различных компонент конкретных реализаций.
  30.  
  31. /*Toolkit kit = Toolkit.getDefaultToolkit(); //Получение ссылки на Toolkit
  32. Dimension screenSize = kit.getScreenSize(); // Определяем разрешение екрана в пикселях
  33. int screenHeight = screenSize.height; // получаем высоту
  34. int screenWidth = screenSize.width; // получаем ширину*/
  35.  
  36. /* -=== /Опредиление клиентской ширины екрана ===- */
  37.  
  38. public pt() {
  39. setTitle("Пятнашки"); //Заголовок окна
  40.  
  41. /* -=== 2 - ой вариант задания размеров и положения окна ===- */
  42.  
  43. // Первые 2-а значения метода setBonds устанавливают положение на екране по x и y;
  44. // Вторые 2-а устанавливают ширину и высоту получаемого окна
  45. // setBounds(200, 200, 300, 300);
  46.  
  47. /* -=== /2 - ой вариант задания размеров и положения окна ===- */
  48.  
  49. setSize (300, 300); // Задаем размеры окна приложения
  50. setLocationRelativeTo(null); // Окно приложения центрируется относительно экрана
  51.  
  52. setResizable(true); // задаем возможность растягивать окно
  53. createMenu(); //инициализируем меню
  54. setJMenuBar(menu); // добавляем панель меню к окну
  55. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // закрываем программу при закрытии окна
  56.  
  57. //Класс container — прямой подкласс класса component, и наследует все его методы.
  58. //Каждый компонент перед выводом на экран помещается в контейнер (container). Контейнер "знает", как разместить компоненты на экране.
  59. /*Создав компонент — объект класса Component или его расширения, следует добавить его к предварительно созданному объекту класса container
  60. или его расширения одним из методов add (). */
  61.  
  62. Container container = getContentPane();
  63. init();
  64. panel.setDoubleBuffered(true);
  65. panel.setBackground(Color.white); // устанавливаем цвет фона
  66. container.add(panel); // добавление компонентов в контейнер
  67. repaintField();
  68. JLabel();
  69. Timer();
  70. }
  71.  
  72. public void init() { // описание метода init
  73. int[] invariants = new int[16]; // инициализируем массив с именем invariants из 16 елементов - лт 0 до 15
  74.  
  75. for (int i = 0; i < 4; i++) { // перебираем елементы i от 0 до 3
  76. for (int j = 0; j < 4; j++) { // перебираем елементы j от 0 до 3
  77. numbers[i][j] = 0; // указываем что перебор в цыкле начинаеться с нулевого елемента
  78. invariants[i*4 + j] = 0; // определяем какой из 16 елементов будет = 0
  79. }
  80. }
  81.  
  82. for (int i = 1; i < 16; i++) { // перебираем елементы i от 1 до 15
  83. int k; //обьявляем переменную k типа int
  84. int l; //обьявляем переменную l типа int
  85. do { // цыкл с послеусловием
  86. k = generator.nextInt(100) % 4; // переменной k присваиваем произвольное число от 0 до 100 деленное по модулю на 4
  87. l = generator.nextInt(100) % 4; // переменной l присваиваем произвольное число от 0 до 100 деленное по модулю на 4
  88. }
  89. while (numbers[k][l] != 0); // до тех пор пока двумерный массив numbers не равен 0
  90. numbers[k][l] = i; // присваиваем двумерному массиву numbers значение i в цикле от 1 до 15
  91. invariants[k*4+l] = i; // определяем позиции всех елементов кроме 0 на сетке
  92. }
  93.  
  94. boolean change = true; // в булевую переменную change заносим значение true
  95. int counter = 1; // инициализируем переменную counter типа int и присваеваем ей 1
  96. while (change) {
  97. change = false;
  98. for (int i = 0; i < 16; i++) {
  99. if (invariants[i] != i) {
  100. for (int j = 0; j < 16; j++) {
  101. if (invariants[j] == i) {
  102. int temp = invariants[i];
  103. invariants[i] = invariants[j];
  104. invariants[j] = temp;
  105. change = true;
  106. counter++;
  107. break;
  108. }
  109. }
  110. break;
  111. }
  112. }
  113. }
  114.  
  115. if (counter % 2 != 0) {
  116. int temp = numbers[0][0];
  117. numbers[0][0] = numbers[3][3];
  118. numbers[3][3] = temp;
  119. }
  120. }
  121.  
  122. public void JLabel() {
  123. Border solidBorder = BorderFactory.createLineBorder(Color.BLACK, 1); // создаем границу черного цвета
  124. Font font = new Font("Verdana", Font.PLAIN, 12); // задаем тип шрифта, и его размер
  125. JLabel topLabel = new JLabel(); // создаем обьект topLabel типа JLabel
  126. //topLabel.setText("Здесь будет секундомер");
  127. topLabel.setBorder(solidBorder); // устанавливаем границу
  128. topLabel.setFont(font); // устанавливаем тип текста
  129. topLabel.setForeground(Color.RED); // Устанавливаем цвет текста
  130. menu.add(topLabel); // добавляем JLabel на пенель menu
  131. }
  132.  
  133. public void Timer() {
  134. int seconds = 0, minutes = 0;
  135. while (true) {
  136. seconds++;
  137. if (minutes != 0)
  138. topLabel.setText(minutes + ":" + seconds); // текст в JLabel
  139. //System.out.print(minutes + ":");
  140. //System.out.println(seconds);
  141. if (seconds == 59) {
  142. seconds = -1;
  143. minutes++;
  144. }
  145. }
  146. }
  147.  
  148. public void repaintField() { //метод расстановки кнопок со значениями на сетке
  149. panel.removeAll();
  150.  
  151. for (int i = 0; i < 4; i++) {
  152. for (int j = 0; j < 4; j++) {
  153. JButton button = new JButton(Integer.toString(numbers[i][j]));
  154. button.setFocusable(false);
  155. panel.add(button);
  156. button.setBackground(Color.getHSBColor(0.1059322f, 0.5221239f, 0.8862745f)); // устанавливаем цвет кнопок
  157. if (numbers[i][j] == 0) {
  158. button.setVisible(false); // сокрытие нулевого елемента массива
  159. } else
  160. button.addActionListener(new ClickListener());
  161. }
  162. }
  163.  
  164. panel.validate();
  165. }
  166.  
  167. public boolean checkWin() { //метод проверки выигрыша
  168. boolean status = true;
  169. for (int i = 0; i < 4; i++) {
  170. for (int j = 0; j < 4; j++) {
  171. if (i == 3 && j > 2) //проверка на то что последняя ячейка в сетке пустая
  172. break;
  173. if (numbers[i][j] != i * 4 + j + 1) { //проверка на соотвествие элементам массива координатам в сетке
  174. status = false;
  175. }
  176. }
  177. }
  178. return status;
  179. }
  180.  
  181. private void createMenu() {
  182. menu = new JMenuBar();
  183. JMenu fileMenu = new JMenu("File");
  184.  
  185. for (int i = 0; i < fileItems.length; i++) {
  186. JMenuItem item = new JMenuItem(fileItems[i]);
  187. JSeparator separator = new JSeparator();
  188. item.setActionCommand(fileItems[i].toLowerCase());
  189. item.addActionListener(new NewMenuListener());
  190. fileMenu.add(item);
  191. fileMenu.add(separator);
  192. }
  193. //fileMenu.insertSeparator(1);
  194.  
  195. menu.add(fileMenu);
  196. }
  197.  
  198. private class NewMenuListener implements ActionListener {
  199. public void actionPerformed(ActionEvent e) {
  200. String command = e.getActionCommand();
  201. if ("exit".equals(command)) {
  202. System.exit(0);
  203. }
  204. if ("statistic".equals(command)) {
  205. JOptionPane.showMessageDialog(null, "ВЫ ВЫИГРАЛИ!", "Поздравляем", 1);
  206. }
  207. if ("new".equals(command)) {
  208. init();
  209. repaintField();
  210. }
  211. }
  212. }
  213.  
  214. private class ClickListener implements ActionListener {
  215. public void actionPerformed(ActionEvent e) {
  216. JButton button = (JButton) e.getSource();
  217. button.setVisible(false);
  218. String name = button.getText();
  219. change(Integer.parseInt(name));
  220. }
  221. }
  222.  
  223. public void change(int num) { // передаем в качестве входящих параметров метода change переменную num типа int
  224. int i = 0, j = 0; // присваиваем перменным i и j типа int значение равное 0
  225. for (int k = 0; k < 4; k++) { // перебираем елементы k от 0 до 3
  226. for (int l = 0; l < 4; l++) { // перебираем елементы l от 0 до 3
  227. if (numbers[k][l] == num) { // если массив numbers[k][l] равный переменной num то,
  228. i = k; // переменную i приравниваем переменной k
  229. j = l; // переменную j приравниваем переменной l
  230. }
  231. }
  232. }
  233.  
  234. /*реализация логики сдвигов кнопок на сетке 4 Х 4*/
  235. //сдвиг вверх по строкам
  236. if (i > 0) { // условие отвечающее за то можно ли сдвинуть кнопку по строке
  237. if (numbers[i - 1][j] == 0) { //сравниваем значение координат элемента массива с кнопкой которая в текущем массиве равна нулю
  238. numbers[i - 1][j] = num; //присваиваем переменной num значение координат элемента массива
  239. numbers[i][j] = 0; //присваеваем нулевой элемент массива в ячейку которая перед этим смещалась в ноль
  240. }
  241. }
  242. //сдвиг вниз по строкам
  243. if (i < 3) {
  244. if (numbers[i + 1][j] == 0) {
  245. numbers[i + 1][j] = num;
  246. numbers[i][j] = 0;
  247. }
  248. }
  249. //сдвиг влево по столбцам
  250. if (j > 0) {
  251. if (numbers[i][j - 1] == 0) {
  252. numbers[i][j - 1] = num;
  253. numbers[i][j] = 0;
  254. }
  255. }
  256. //сдвиг вправо по столбцам
  257. if (j < 3) {
  258. if (numbers[i][j + 1] == 0) {
  259. numbers[i][j + 1] = num;
  260. numbers[i][j] = 0;
  261. }
  262. }
  263. repaintField();
  264. if (checkWin()) {
  265. JOptionPane.showMessageDialog(null, "ВЫ ВЫИГРАЛИ!", "Поздравляем", 1);
  266. init();
  267. repaintField();
  268. setVisible(false);
  269. setVisible(true);
  270. }
  271. }
  272.  
  273. public static void main(String[] args) throws InterruptedException {
  274. Thread.sleep(1000);
  275. JFrame app = new pt();
  276. app.setVisible(true);
  277. }
  278. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement