Created
January 17, 2015 21:55
Minesweeper on JavaFX with level selection
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
�PNG | |
IHDR szz�gAMA���a cHRMz&�����u0�`:�p��Q< pHYs��YiTXtXML:com.adobe.xmp<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.4.0"> | |
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> | |
<rdf:Description rdf:about="" | |
xmlns:tiff="http://ns.adobe.com/tiff/1.0/"> | |
<tiff:Orientation>1</tiff:Orientation> | |
</rdf:Description> | |
</rdf:RDF> | |
</x:xmpmeta> | |
L�'Y8IDATX �V[lTU����X1̀����@���L X�h�C�?E%>L�?FC2��&h� | |
|(կ&jcL��P����T�1��&йo3��y(I��I�=���ڏ��>��ΘCڨM�gs!��:D��R�����dR�����i����j��y��5Ly��,c��}ۑn(�9,��7u&�4u�i̓S���BL_��i^��:Y�x鲕�~����s��G��Wۆۨhj��8�e���T������gϞ{F���n��]M��c�y�`�S���X[�Z�rZ�ꄪi?)R�q,JY�����mB6&�e㣧�n�u-R�ɱ� �X�9摽�xx$�����T���i�(�� �q���]m���zY�-�`���G� | |
�A�Ub��x��&&�Tm��,�w�Ӂ��\�ã�0ȁ��[B�>EQȲ-GѵW�y��jB9˲��e�i�-���C�V�$�Y�����AF�}�2����R���V�u�3�@�^ch�W�h�B�U5u�i�8�y�/r��%���վ��T����C�x�6�ݜp�W@�PT��&�459E�f��ض�ϖ/^�vl��S�y���$��8�bm]�T�V�q�Ł"�ʄ1mx�~��Ƿ�yЩ ̄��HYD8��!A]��S��;?�x>fnƔEpC��Y�V96� �n`��K#cx�"i�K;)��(��4?� I��"3+����H�p�7��/���Ux�|���*q�%�'��9��yx��UU��w;���a�c�N��=$��2��u��S���mm���675���>IQ�Hv<|��������'h><��Ô�9Mc�t��Q�Ţ�{��t81��RT�oJt$2��mB��;��n�"�Rx��u���F�/�.����.�K۲)�9]���v�#��y���.y�M�(������#8|�2D�˯�F����v�mh$$b�� )a�s�.~�#����"(H��$<�OB�ݎ_�&!�ғi���-"/ �����$,�X(�jל�B��1p��M��2�dܺyv<�eX�o�)(�GA|�a��7{`�?��|�sՑ�@咪>$�(�,��C� ���k��%K����h���X��oD܄0��NQ =��XU���M� � =��������Vlٙ����W*�܈����z7 ��/���~�C��<(�����{3���1� K�*ID/��IӴ{͌yĵ�A� | |
Xƀ?�8�f�L�~�{l��rDW�(|�߄E�3�Ȁd��&�2�>���.-�ܯ��,���X��wѴ"���k��!�9��͌�-��e��(2 �����0�ù^ql�gڮI� | |
yp�s | |
xϽ�/'��8�*�%�{ ��g�>.Ày9����UP[[;OZ�X�����!�Jt%���*W2}�Ͽ~S48;4�3>gB͞SF���ׇ��� | |
X��(4L�%��d^�Z�>��O�����<^|b��J����%�����XE}U�¿hr�<%I�"����Kj�1�ax=�Y���1�3K�;b~� �W�Q�IEND�B`� |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package sample; | |
import javafx.event.EventHandler; | |
import javafx.fxml.FXML; | |
import javafx.scene.control.Button; | |
import javafx.scene.control.Label; | |
import javafx.scene.control.ToggleButton; | |
import javafx.scene.image.Image; | |
import javafx.scene.image.ImageView; | |
import javafx.scene.input.MouseButton; | |
import javafx.scene.input.MouseEvent; | |
import javafx.scene.layout.GridPane; | |
import javafx.scene.text.Font; | |
import java.util.Random; | |
public class Controller { //Это типа Main() | |
Image mineIcon = new Image(getClass().getResourceAsStream("32icon.png"));//Эта штука грабит картинку мины | |
Image flagIcon = new Image(getClass().getResourceAsStream("flagBig.png"));//А эта - флага | |
@FXML Label mineCountLabel=new Label(); //Надпись, которая показывает сколько мин осталось пометить | |
static boolean IsFirstButtonPressed = false; //Первая кнопка должна быть без мины | |
@FXML int dotsLeft=380, minesFlagged=100; //dotsLeft показывает, сколько еще кнопок должен нажать игрок, чтобы выиграть | |
//Когда он нажмет на все кнопки, кроме мин, тогда и победит. | |
//minesFlagged показывает юзеру, сколько мнимых мин осталось. Тоесть когда он поставит флажок, | |
//Кол-во оставшихся мин, которых он не отметил уменьшится на счетчике, чтобы не держать их в уме. | |
//На победу minesFlagged никак не влияет. | |
@FXML Button startButton;//Кнопка, запускающая и перезапускающая игру. | |
@FXML ToggleButton difficulty = new ToggleButton(); //Кнопка, которая определяет сложность. | |
@FXML //На это не обращай внимание, особенность десктопных приложений джавы | |
private GridPane mineFieldPane; //Как бы панелька с кучей ячеек внутри | |
public void setMineFieldPane(GridPane mineFieldPane, mineButton[][] mineField) { | |
this.mineFieldPane = mineFieldPane; | |
this.mineFieldPane.getChildren().clear(); | |
for(mineButton[] line : mineField){ | |
for(mineButton dot : line){ | |
mineFieldPane.add(dot,dot.x,dot.y); //Должны добавляться в GridPane кнопки из массива | |
} | |
} | |
} | |
//Снизу метод, который создает поле с нужными параметрами. | |
//Х - кнопки по горизонтали, у - кнопки по вертикали, mines - кол-во мин на поле. | |
private mineButton[][] CreateNewField(int x, int y, int mines){ | |
//Создается переменная field, это массив из объектов класса MineButton | |
mineButton[][] field = new mineButton[x][y]; | |
Random random = new Random(); | |
x=0; | |
y=0; | |
//Поле нужно рандомно заполнить. | |
while (mines>0){ //Пока нужно добавить на поле мины | |
for (mineButton[] line : field){ //Счетчик проходит по столбцам | |
for(mineButton dot : line){ //А здесь по строке столбца | |
// IF ниже проверяет, существует ли кнопка в массиве, так как хоть ты и создал массив, | |
// он все равно пуст и пока не содержит ни кнопок, вообще ничего, поэтому они создаются | |
// и заполняются здесь, снизу. | |
if (dot==null){ //Если кнопка не существует | |
dot = new mineButton(x,y,difficulty.isSelected()); //На её место призывается новая кнопка, которой дают собственные координаты | |
dot = SetMineButton(dot); //Здесь же настраивается её обработчик событий | |
dot.setDisable(false);//Настроенные кнопки должны быть активированы. | |
} | |
//Если кнопка не содержит мину и нужно накинуть на поле еще мин, то она добавляется | |
//Или не добавляется, как повезет | |
if ((!dot.isMineHere) && mines>0){ | |
if (random.nextInt(5)==3){ //Вместо шанса 50% теперь шанс 20% (Шанс того, что случайное число от 0 до 4 будет тройкой) | |
//Шанс пропорционален кол-ву мин и кнопок на поле. | |
dot.isMineHere = true; | |
mines--; //Кол-во мин, которое нужно добавить на поле уменьшается на 1 с каждой миной | |
} | |
} | |
field[y][x]=dot;//Кнопка ДОБАВЛЯЕТСЯ в возвращаемый массив | |
x++; | |
} | |
y++; | |
x=0; | |
} | |
y=0; | |
x=0; | |
} | |
return field; //Возвращается заполненый кнопками и минами массив. | |
} | |
public mineButton[][] field = CreateNewField(30, 16, 100); //Создается массив из кнопок с минами с помощью метода выше | |
@FXML | |
public void StartNewGame(){ //Эта штука вызывается при нажатии на самую большущую кнопку сверху, но вызов описан только в FXML-файле | |
if (difficulty.isSelected()){ | |
dotsLeft=380; //Обновляем dotsLeft | |
minesFlagged=100; //Обновляем minesFlagged | |
field = CreateNewField(16, 30, 100); //Переставляем мины | |
startButton.getScene().getWindow().setWidth(610); | |
mineIcon=new Image(getClass().getResourceAsStream("icon.png")); | |
flagIcon=new Image(getClass().getResourceAsStream("flag.png")); | |
} else{ | |
dotsLeft=80; | |
minesFlagged=20; | |
field = CreateNewField(10,10,20); | |
startButton.getScene().getWindow().setWidth(355); | |
mineIcon=new Image(getClass().getResourceAsStream("32icon.png")); | |
flagIcon=new Image(getClass().getResourceAsStream("flagBig.png")); | |
} | |
mineCountLabel.setText(Integer.toString(minesFlagged)); //Обновляем надпись, которая у нас играет роль счетчика для игрока | |
IsFirstButtonPressed = false; //Обновляем фактор первого нажатия на кнопку, чтобы не жахнуло на первом же ходе | |
setMineFieldPane(mineFieldPane, field); //Обновляем поле | |
startButton.setText("Заново"); | |
startButton.setLayoutX((startButton.getScene().getWindow().getWidth()/2)-(startButton.getPrefWidth()/2)); | |
} | |
private void CheckOtherButtons(mineButton thisButton){//Метод, который считает сколько мин в остальных кнопках. | |
{ | |
//код снизу проверяет все в массиве рядом с данной, если она конечно есть. | |
if (((thisButton.y - 1 >= 0 && thisButton.y - 1 < field.length) && (thisButton.x - 1 >= 0 && thisButton.x - 1 < field[0].length)) && (!field[thisButton.y - 1][thisButton.x - 1].isChecked)) CheckButton(field[thisButton.y - 1][thisButton.x - 1]); //Сверху слева | |
if (((thisButton.y - 1 >= 0 && thisButton.y - 1 < field.length) && (thisButton.x >= 0 && thisButton.x < field[0].length)) && (!field[thisButton.y - 1][thisButton.x].isChecked)) CheckButton(field[thisButton.y - 1][thisButton.x]); //Сверху | |
if (((thisButton.y - 1 >= 0 && thisButton.y - 1 < field.length) && (thisButton.x + 1 >= 0 && thisButton.x + 1 < field[0].length)) && (!field[thisButton.y - 1][thisButton.x + 1].isChecked)) CheckButton(field[thisButton.y - 1][thisButton.x+1]); //Сверху справа | |
if (((thisButton.y >= 0 && thisButton.y < field.length) && (thisButton.x - 1 >= 0 && thisButton.x - 1 < field[0].length)) && (!field[thisButton.y][thisButton.x - 1].isChecked)) CheckButton(field[thisButton.y][thisButton.x - 1]); //Слева | |
if (((thisButton.y >= 0 && thisButton.y < field.length) && (thisButton.x + 1 >= 0 && thisButton.x + 1 < field[0].length)) && (!field[thisButton.y][thisButton.x + 1].isChecked)) CheckButton(field[thisButton.y][thisButton.x + 1]); //Справа | |
if (((thisButton.y + 1 >= 0 && thisButton.y + 1 < field.length) && (thisButton.x - 1 >= 0 && thisButton.x - 1 < field[0].length)) && (!field[thisButton.y + 1][thisButton.x-1].isChecked)) CheckButton(field[thisButton.y + 1][thisButton.x - 1]); //Слева снизу | |
if (((thisButton.y + 1 >= 0 && thisButton.y + 1 < field.length) && (thisButton.x >= 0 && thisButton.x < field[0].length)) && (!field[thisButton.y + 1][thisButton.x].isChecked)) CheckButton(field[thisButton.y + 1][thisButton.x]); //Снизу | |
if (((thisButton.y + 1 >= 0 && thisButton.y + 1 < field.length) && (thisButton.x + 1 >= 0 && thisButton.x + 1 < field[0].length)) && (!field[thisButton.y + 1][thisButton.x + 1].isChecked)) CheckButton(field[thisButton.y + 1][thisButton.x + 1]); //Справа снизу | |
if (!thisButton.isMineHere) { //Если не жахнуло | |
thisButton.isChecked=true; | |
thisButton.setDisable(true); //Деактивируем кнопку. | |
if (thisButton.minesNearby > 0) { //Если рядом есть мины | |
thisButton.setText(Integer.toString(thisButton.minesNearby)); //То показываем прямо на кнопке сколько | |
} | |
} | |
} | |
//return thisButton; | |
} | |
private void CheckButton(mineButton thisButton){ | |
{ //Проверяем флагнута ли кнопка | |
if (thisButton.isMineHere) GameOver(); //Если мина есть - геймовер | |
//код снизу проверяет все в массиве рядом с данной, если она конечно есть. | |
if (((thisButton.y - 1 >= 0 && thisButton.y - 1 < field.length) && (thisButton.x - 1 >= 0 && thisButton.x - 1 < field[0].length)) && (field[thisButton.y - 1][thisButton.x - 1].isMineHere)) | |
thisButton.minesNearby++; //Сверху слева | |
if (((thisButton.y - 1 >= 0 && thisButton.y - 1 < field.length) && (thisButton.x >= 0 && thisButton.x < field[0].length)) && field[thisButton.y - 1][thisButton.x].isMineHere) | |
thisButton.minesNearby++; //Сверху | |
if (((thisButton.y - 1 >= 0 && thisButton.y - 1 < field.length) && (thisButton.x + 1 >= 0 && thisButton.x + 1 < field[0].length)) && field[thisButton.y - 1][thisButton.x + 1].isMineHere) | |
thisButton.minesNearby++; //Сверху справа | |
if (((thisButton.y >= 0 && thisButton.y < field.length) && (thisButton.x - 1 >= 0 && thisButton.x - 1 < field[0].length)) && field[thisButton.y][thisButton.x - 1].isMineHere) | |
thisButton.minesNearby++; //Слева | |
if (((thisButton.y >= 0 && thisButton.y < field.length) && (thisButton.x + 1 >= 0 && thisButton.x + 1 < field[0].length)) && field[thisButton.y][thisButton.x + 1].isMineHere) | |
thisButton.minesNearby++; //Справа | |
if (((thisButton.y + 1 >= 0 && thisButton.y + 1 < field.length) && (thisButton.x - 1 >= 0 && thisButton.x - 1 < field[0].length)) && field[thisButton.y + 1][thisButton.x - 1].isMineHere) | |
thisButton.minesNearby++; //Слева снизу | |
if (((thisButton.y + 1 >= 0 && thisButton.y + 1 < field.length) && (thisButton.x >= 0 && thisButton.x < field[0].length)) && field[thisButton.y + 1][thisButton.x].isMineHere) | |
thisButton.minesNearby++; //Снизу | |
if (((thisButton.y + 1 >= 0 && thisButton.y + 1 < field.length) && (thisButton.x + 1 >= 0 && thisButton.x + 1 < field[0].length)) && field[thisButton.y + 1][thisButton.x + 1].isMineHere) | |
thisButton.minesNearby++; //Справа снизу | |
if (!thisButton.isMineHere) { //Если не жахнуло | |
thisButton.isChecked=true; | |
thisButton.setDisable(true); //Деактивируем кнопку. | |
dotsLeft--; | |
if (thisButton.minesNearby > 0) { //Если рядом есть мины | |
thisButton.setText(Integer.toString(thisButton.minesNearby)); //То показываем прямо на кнопке сколько | |
} | |
else { // Ну а если нет | |
CheckOtherButtons(thisButton); //Этим методом проверяются остальные кнопки | |
} | |
if (dotsLeft<=0) startButton.setText("Ты подебил");//Типа победа. | |
} | |
} | |
} | |
public mineButton SetMineButton(final mineButton thisButton) { //Метод настраивает кнопку, получая саму кнопку | |
if (difficulty.isSelected()) thisButton.setFont(new Font(8)); | |
thisButton.setOnMouseClicked(new EventHandler<MouseEvent>() { //Если на кнопку кликнули мышкой | |
@Override //То событие ПРЕРЫВАЕТ естественный ход программы | |
public void handle(MouseEvent mouseEvent) { //И обрабатывает это событие. Обработчик получает данные о нажатии на кнопку, это переменная mouseEvent | |
if (mouseEvent.getButton()== MouseButton.SECONDARY){ //Если кнопка была нажата с ПКМ | |
if (!thisButton.isFlagged) { //А если она еще и не флагнута | |
thisButton.isFlagged = true; //То маркируем как флагнутую | |
thisButton.setGraphic(new ImageView(flagIcon)); //И заставляем её показывать нам флажок | |
minesFlagged--; //Увеличиваем кол-во флагнутых мин, тоесть как бы уменьшаем кол-во мин, которое НУЖНО флагнуть | |
mineCountLabel.setText(Integer.toString(minesFlagged)); // и выводим это кол-во на счетчик | |
} | |
else { //А если флагнута | |
thisButton.isFlagged = false; //То убираем флаг | |
thisButton.setGraphic(null); //И картинку | |
minesFlagged++; //И кол-во флагнутых мин уменьшаем... Ну ты понял | |
mineCountLabel.setText(Integer.toString(minesFlagged));//И даже показываем это игроку :| | |
} | |
} | |
else //А если не ПКМ | |
if (!thisButton.isFlagged) { //То проверяем флагнута ли кнопка | |
if (!IsFirstButtonPressed) { //Если это первая нажатая кнопка | |
if (thisButton.isMineHere) { //Если тут мина | |
thisButton.isMineHere = false; //То убираем с неё мину | |
minesFlagged--; //А еще придется показать игроку, что миной стало меньше | |
mineCountLabel.setText(Integer.toString(minesFlagged)); //Да-да, именно показать | |
dotsLeft++; //А еще ему придется нажать на кнопку больше взамен этой мины | |
} | |
IsFirstButtonPressed = true; //И говорим типа нажали. | |
} | |
if (thisButton.isMineHere) GameOver(); //Если мина есть - геймовер | |
else CheckButton(thisButton); | |
} | |
} | |
} | |
); | |
return thisButton; //Возвращает настроенную кнопку | |
} | |
@FXML | |
public void GameOver(){ | |
for(mineButton[] line : field){//Проходится по столбцу | |
for (mineButton dot : line){//Проходится по строке | |
dot.setText(""); //Очищает текст кнопки | |
dot.setGraphic(null); //Убирает флажок | |
if (dot.isMineHere) { | |
dot.setGraphic(new ImageView(mineIcon)); //Показывает есть ли мина, картинкой. | |
} | |
dot.setDisable(true); //Вырубает все кнопки. | |
} | |
} | |
startButton.setText("Ты проиграл"); | |
} | |
} | |
class mineButton extends Button { //Объявляешь новый класс, как число или строка, только кнопка | |
int x,y,minesNearby=0; // Координаты кнопки и кол-во мин рядом. | |
mineButton(int x, int y,boolean difficult){ //Билдер кнопки, если при создании кнопки переданы аргументы, здесь это координаты, | |
//То кнопки создадутся сразу с ними | |
this.x=x; | |
this.y=y; | |
this.setText(""); //Очищается текст кнопки при создании. | |
this.setDisabled(false);//Кнопка после создания активирована. | |
if (difficult){ | |
this.setMaxSize(35, 35); //Размеры кнопки | |
this.setMinSize(20, 20); | |
this.setPrefSize(20, 20); | |
this.setFont(new Font(8)); | |
} else { | |
this.setMaxSize(35,35); | |
this.setMinSize(33,33); | |
this.setPrefSize(34,34); | |
} | |
} | |
boolean isMineHere = false; //Наличие мины на кнопке. По умолчанию её нет. | |
boolean isFlagged = false; //Поставлен ли на мине флажок. | |
boolean isChecked = false; //костыль :| Проверяет была ли нажата кнопка, чтобы автоматика не проверяла её несколько раз и не выдавала STACK OVERFLOW | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
�PNG | |
IHDR��agAMA���a cHRMz&�����u0�`:�p��Q< pHYs��YiTXtXML:com.adobe.xmp<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.4.0"> | |
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> | |
<rdf:Description rdf:about="" | |
xmlns:tiff="http://ns.adobe.com/tiff/1.0/"> | |
<tiff:Orientation>1</tiff:Orientation> | |
</rdf:Description> | |
</rdf:RDF> | |
</x:xmpmeta> | |
L�'YIDAT8m��nA��þ���H��,RمRނ�!%5��T)B�)yZ�D�&� | |
d | |
�����;_~��Zg���vvf�����3���Z-K�Z���h4���]���2��*A"��t:*��juK߹V�*a�I"�u���K(D�T�<��n�7������x� w(1)� �`͂ ����)g�=���=������|��#X���Qv�&�#˲��r��$�r�c��`�����N9�}�&I���/D�cL�N&����Ӄ�N�3����� ��Ad �y��v�6�E�8I�3g �N���1��S�X^K���5�u | |
��q2����j6�����@�I"��"�Ƙ�KK$?X�.K�CR����e� ����dw9�_s�_���`�-�O�w��%� H6l�� | |
�_�p��)v��_��XdxA���`�z4y����p�c{ �����_6Y�Q=��:A�*�������wg��6���5t��b��r;d~�h� |P(�R�4���^�w�y��fSfz���(뇥>R�IEND�B`� |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
�PNG | |
IHDR��csRGB��� pHYs��YiTXtXML:com.adobe.xmp<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.4.0"> | |
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> | |
<rdf:Description rdf:about="" | |
xmlns:tiff="http://ns.adobe.com/tiff/1.0/"> | |
<tiff:Orientation>1</tiff:Orientation> | |
</rdf:Description> | |
</rdf:RDF> | |
</x:xmpmeta> | |
L�'Y�IDATH �V]H�Qv��:�?mӶQJ�p�n�n,b`��4��"�:�&��te�EEAt�E^t#y�Q�U��"Q4�"Sjl8ck?�������O����s�{�y����9�[]ݮ288h�idd���ގ��>�S0fBd�jEn`�1@[8�XU�mt���b���r� q���X,1��S�B����[WQBM�/ | |
RL�u��eh1/�(�:��J�Ax,�L��r�����ȤR�t8������d��������l6���I �)�])0�Yضr��4��Gf���k�����SdNZ��< �"P��w�u�s���&��=����*Q D �>��d�'!�v���k�����ހ��X���0���'����x<^s��N�-���N����`��bPz�͉!�a�������?����M�w��D��<Eww��������D����wD0��i�%�����Cr��fhg��$oP�$���`a������H�V|��N��{8�KX�'�O#$c4����"Pd��c����f�mnntvv:4��)�i�&��3mS�x(��?�g ��yQd�ה���6^>9F�,t�"|b��S]__�����G`�Ro�"�0]�q��L�i� | |
�V�5Dbǐ��*�]�J#B� | |
<"ħ8�?�a�M����H��)$��J��~"O���|��^�U���&vuV�W=/�|�����"Y���\X���� �Lk�zy��1�J%\���u�������d2����C��ګ��� �Y�B�#z���l�@�v<�� | |
���Ϋ.��V�.!<��bq!�������dL�t��0>FDZ��7��<�jW�����<���7�H�wGG�����������xʯ�XH�$��Ziӫ�_�5���*�IEND�B`� |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
�PNG | |
IHDR�� gAMA���a cHRMz&�����u0�`:�p��Q< pHYs��YiTXtXML:com.adobe.xmp<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.4.0"> | |
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> | |
<rdf:Description rdf:about="" | |
xmlns:tiff="http://ns.adobe.com/tiff/1.0/"> | |
<tiff:Orientation>1</tiff:Orientation> | |
</rdf:Description> | |
</rdf:RDF> | |
</x:xmpmeta> | |
L�'Y�IDAT8�TMhSA��4i��&4?Ol�Z�� �m�R�@�g��<yO��w��`=�s����J-Vc[��yIOR�$}?��,��K)˛ݙ���fg!�3 | |
i8�������i&��Ͳ�pD N�@?���k��s��ݖ>u��������yƿ�jt��a��s���۔��B��7��a��S8�uղ��OK�����J�x.�s!��v,+ �Xƕ��\k�^�� | |
�+R��hb��5B�P(�G%cI���(�%�u��tĪ���+��%��w07)'O�M�g��~(��oT���8�{�Q�(UX����@�QtyST� }Q^階W���#/7&%�Ά��2/��ト#+?VH��[���p�8Ϋ��/S:ب#J�dccc=���S����<�e��s�ų9� | |
d��ib�MZ��V�sF��RGS�b�XC.O2��$�m+��2���:�bZQ�%!���?K�$� �g.����$S��zayq�A��z��/ �ϫx4Y�T�\)�p��_��J�����o����XSR�����*�_ �Db����h�\���{h���������!�DJ�.�^1M,z5���>��LG(4�N\p6�F ���R�;B�iW�kH�Ģ�x%�Ȯ� | |
�z�g�9�ڎ]��؏�pi%*��KU�� | |
� | |
��Ģ�ۚ�Զ~ybbG�bk�'�n���DO�;��`��L���A��P��|$��_�'O���4IEND�B`� |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
�PNG | |
IHDR--:�gAMA���a cHRMz&�����u0�`:�p��Q< pHYs��YiTXtXML:com.adobe.xmp<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.4.0"> | |
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> | |
<rdf:Description rdf:about="" | |
xmlns:tiff="http://ns.adobe.com/tiff/1.0/"> | |
<tiff:Orientation>1</tiff:Orientation> | |
</rdf:Description> | |
</rdf:RDF> | |
</x:xmpmeta> | |
L�'Y �IDATX �X{l��f�g�l �Mc#�y���7uiR�@��jP���**����H�u�J)�UUR�*m���\B�G�@��<D< ��@� ؾ�����������3MP��<��ݙ����7��.�D�``��[b���]�%� �O�@C͢���͚o�}JsY�JVm�B:::H>'�vhW�+*"d�n�§#f�+���sT�9s��'\���U<d6o�R�p2����zFݜ�Eg.���2�3_?��L�Q�2;�y<�7�j~M���z���zv��}�1� -kh��m~�P �3`6 | |
b��X\<������z===��7n�}�ߗj���x���'QF� ������}��� Ջ����+.綦��v�4"�M]y;v�W��.��PQR��2�F�������������tVc�r�q���S�0�:����{G~� @���p��w�����J&�1l4��C����N|ގ�v9X���C���v]�5Ox��+MC����q@4A6m�Tk����>��e:EM�KP� �����9�z�g2�Nܤm����5��B�(F×�I�5:c��'�*�������3(KE�M=����WV)D�̓R��b ch� SU'c����f��D�GbŷR�ޓ�f�V�y���f'�B��+���4�9�s���@�z2i�����X��z�"�r9��p�̣pp��� ��̈́�x,R�8=�{ݬ����^9U��K�x./�<��H�eYC��LF8�Y&p�B$q$ � | |
�;�����Iw�4<4 p�\�z5��eU�e:��l�+))��-�y۲�B@w�r�?=�T�� | |
�����֩90C*��Q��H����%%�v��E滓�|����j�JĭŘ��z>�`�ef$�>�]�3��i�g�W���� �H�A;��s]o�|LӴ� | |
��Z��*/Ӹ���%5u���b�q8�x�w�2� �.t���u����-���W��[�Bu�l?H��-F �A��� Ɩ��ϳ�K��1m۶100�KKKWcZj%vP�� f�fa�u>?ڰA|���@���{��Qֺ�UL/-e;:wB��bw�pi��1�T.�ؕ�|�2?J�����C�:{�lR�V�K���L���~�_�ji�����[��?wJaR�ƣ�l��N���)���q��Eb�:�NzN�J�Lqf�4H���˚�njj�\.(f�&��p���je�N�����ҺF�����O�p��i�P�C�b]7��.�g���N]]�]_j\�<����e +Cfh�F��tq��f% | |
x)��D��`iE�Q����7��Mpl��T��EEQ�LS��eHVȚ�kYw�P6�R{���4�~$�s�h.� E�z7W|I����A(+/��œ�3DK�������b*�-#�e��Ck� �3��-��Ǐ��;;;�dVk!JcW�/��]�\i� | |
�H�T�ڙ:�vĒ�b�� V=���8t�� �����)��ᖇa��^o�#b�b�#\���'�}����ԑ!�He���,6�Ⱦ��f���Z�r0#��9�)S���7�ys�<�W,�X,&��3g6�ݳv��e�K0_'r1M�&����o����Q��9�����hM9�ШF�C>�h���M�Ka��a�O6a��/VU!8��?�_��6�Lv�=���J��R%G�\H��%����р'::bR�Q_z�䴠�>�S�� `�=�`2��dV��Q�Q�n���u$7l�[� | |
�@)`T0�^�u�ҵ��=Ja��0}��5���K$�4�$�dll�]U��h�?����Q��N�D ��4S�p��"dzy��+?�#�x' ��K | |
(1N�)d��:�S����p<7T�X�����ݯ�`�Qy | |
GZBOAކ�k띄�=���6��*����J�!KXe�Nw��%��N�g8I~7����+H�i\��2�q��s2l��+�n��F�� | |
F2�E�3��N�'�0�n��#�r[��h���6K�[�4M�]Ip�>��1��s�ʔm�'10vblR�'�%��4s!;�����o�a�6���FR�7��.u�˭�����U"u3(�!SdI2���9���TU�!v)�)M�/��(0ߨ��$�0fREG}y���T6�4V��>9� �Ǜ��r�rX�w9��/xv���cO|���+_ƅuj�~��λ 7q�q��6w֣�H��xY�W��t>���u�;"��~Q;��B�a���ɻg��O�<�n�:��;��w�jԘ�:r���"3q�h���mۖڰ|(x��5�+0�ε�w����/�n����pT?}ë�7������H�����sL :�^���'�����|V4˯����T�T���>K���1sꢈ�!A�3W?6�������msf+\�m�n�� �n�� {�_2�_��oT)�IEND�B`� |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package sample; | |
import javafx.application.Application; | |
import javafx.fxml.FXMLLoader; | |
import javafx.scene.Parent; | |
import javafx.scene.Scene; | |
import javafx.scene.image.Image; | |
import javafx.stage.Stage; | |
public class Main extends Application { | |
@Override | |
public void start(Stage primaryStage) throws Exception{ //Запуск формочки | |
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml")); //Файл с разметкой формочки | |
primaryStage.setTitle("Minesweeper"); //Установка тайтла, тоесть названия окошка | |
primaryStage.setScene(new Scene(root, 355, 405)); //Настройка размеров окошка | |
Image icon = new Image(getClass().getResourceAsStream("MainIcon.png"));//Иконка загружается в память | |
primaryStage.getIcons().add(icon); //И устанавливается как иконка окна | |
primaryStage.setResizable(false); //Размер окошка теперь не изменяется пользователем | |
primaryStage.show(); //Показываем окошко | |
} | |
public static void main(String[] args) { | |
launch(args); | |
} //Запуск. Дальше от этого модуля не шибко много зависит | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
�PNG | |
IHDR szz�gAMA���a cHRMz&�����u0�`:�p��Q< pHYs��YiTXtXML:com.adobe.xmp<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.4.0"> | |
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> | |
<rdf:Description rdf:about="" | |
xmlns:tiff="http://ns.adobe.com/tiff/1.0/"> | |
<tiff:Orientation>1</tiff:Orientation> | |
</rdf:Description> | |
</rdf:RDF> | |
</x:xmpmeta> | |
L�'Y8IDATX �V[lTU����X1̀����@���L X�h�C�?E%>L�?FC2��&h� | |
|(կ&jcL��P����T�1��&йo3��y(I��I�=���ڏ��>��ΘCڨM�gs!��:D��R�����dR�����i����j��y��5Ly��,c��}ۑn(�9,��7u&�4u�i̓S���BL_��i^��:Y�x鲕�~����s��G��Wۆۨhj��8�e���T������gϞ{F���n��]M��c�y�`�S���X[�Z�rZ�ꄪi?)R�q,JY�����mB6&�e㣧�n�u-R�ɱ� �X�9摽�xx$�����T���i�(�� �q���]m���zY�-�`���G� | |
�A�Ub��x��&&�Tm��,�w�Ӂ��\�ã�0ȁ��[B�>EQȲ-GѵW�y��jB9˲��e�i�-���C�V�$�Y�����AF�}�2����R���V�u�3�@�^ch�W�h�B�U5u�i�8�y�/r��%���վ��T����C�x�6�ݜp�W@�PT��&�459E�f��ض�ϖ/^�vl��S�y���$��8�bm]�T�V�q�Ł"�ʄ1mx�~��Ƿ�yЩ ̄��HYD8��!A]��S��;?�x>fnƔEpC��Y�V96� �n`��K#cx�"i�K;)��(��4?� I��"3+����H�p�7��/���Ux�|���*q�%�'��9��yx��UU��w;���a�c�N��=$��2��u��S���mm���675���>IQ�Hv<|��������'h><��Ô�9Mc�t��Q�Ţ�{��t81��RT�oJt$2��mB��;��n�"�Rx��u���F�/�.����.�K۲)�9]���v�#��y���.y�M�(������#8|�2D�˯�F����v�mh$$b�� )a�s�.~�#����"(H��$<�OB�ݎ_�&!�ғi���-"/ �����$,�X(�jל�B��1p��M��2�dܺyv<�eX�o�)(�GA|�a��7{`�?��|�sՑ�@咪>$�(�,��C� ���k��%K����h���X��oD܄0��NQ =��XU���M� � =��������Vlٙ����W*�܈����z7 ��/���~�C��<(�����{3���1� K�*ID/��IӴ{͌yĵ�A� | |
Xƀ?�8�f�L�~�{l��rDW�(|�߄E�3�Ȁd��&�2�>���.-�ܯ��,���X��wѴ"���k��!�9��͌�-��e��(2 �����0�ù^ql�gڮI� | |
yp�s | |
xϽ�/'��8�*�%�{ ��g�>.Ày9����UP[[;OZ�X�����!�Jt%���*W2}�Ͽ~S48;4�3>gB͞SF���ׇ��� | |
X��(4L�%��d^�Z�>��O�����<^|b��J����%�����XE}U�¿hr�<%I�"����Kj�1�ax=�Y���1�3K�;b~� �W�Q�IEND�B`� |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="UTF-8"?> | |
<?import javafx.geometry.*?> | |
<?import javafx.scene.text.*?> | |
<?import javafx.scene.effect.*?> | |
<?import javafx.scene.image.*?> | |
<?import javafx.scene.control.*?> | |
<?import java.lang.*?> | |
<?import javafx.scene.layout.*?> | |
<?import javafx.geometry.Insets?> | |
<?import javafx.scene.layout.GridPane?> | |
<?import javafx.scene.control.Button?> | |
<?import javafx.scene.control.Label?> | |
<SplitPane dividerPositions="0.4046434494195688" minHeight="-Infinity" minWidth="-Infinity" orientation="VERTICAL" pickOnBounds="false" prefHeight="405.0" prefWidth="355.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller"> | |
<items> | |
<AnchorPane maxHeight="-Infinity" minHeight="50.0" minWidth="50.0" pickOnBounds="false" prefHeight="50.0"> | |
<children> | |
<Button fx:id="startButton" alignment="CENTER" cancelButton="true" contentDisplay="CENTER" defaultButton="true" layoutX="107.0" layoutY="12.0" maxHeight="-Infinity" maxWidth="-Infinity" mnemonicParsing="false" onAction="#StartNewGame" prefHeight="26.0" prefWidth="139.0" text="Запускайся" textAlignment="CENTER" /> | |
<Pane layoutX="-2.0" layoutY="1.0" maxHeight="-Infinity" pickOnBounds="false" prefHeight="50.0" prefWidth="123.0" AnchorPane.leftAnchor="0.0"> | |
<children> | |
<Label fx:id="mineCountLabel" layoutX="45.0" layoutY="9.0" prefHeight="32.0" prefWidth="58.0"> | |
<font> | |
<Font size="22.0" /> | |
</font> | |
</Label> | |
<ImageView fitHeight="45.0" fitWidth="45.0" pickOnBounds="true" preserveRatio="true"> | |
<image> | |
<Image url="@icon45.png" /> | |
</image> | |
<effect> | |
<Glow level="0.35" /> | |
</effect> | |
</ImageView> | |
</children> | |
</Pane> | |
<ToggleButton fx:id="difficulty" layoutX="260.0" layoutY="12.0" mnemonicParsing="false" prefHeight="26.0" prefWidth="79.0" text="Сложнее" textAlignment="CENTER" AnchorPane.rightAnchor="14.0" /> | |
</children></AnchorPane> | |
<AnchorPane minHeight="-Infinity" minWidth="-Infinity" prefHeight="355.0" prefWidth="355.0"> | |
<children> | |
<GridPane fx:id="mineFieldPane" alignment="CENTER" layoutX="12.0" prefHeight="311.0" prefWidth="345.0" AnchorPane.bottomAnchor="5.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="5.0"> | |
<rowConstraints> | |
<RowConstraints minHeight="10.0" prefHeight="35.0" vgrow="ALWAYS" /> | |
<RowConstraints minHeight="10.0" prefHeight="35.0" vgrow="ALWAYS" /> | |
<RowConstraints minHeight="10.0" prefHeight="35.0" vgrow="ALWAYS" /> | |
<RowConstraints minHeight="10.0" prefHeight="35.0" vgrow="ALWAYS" /> | |
<RowConstraints minHeight="10.0" prefHeight="35.0" vgrow="ALWAYS" /> | |
<RowConstraints minHeight="10.0" prefHeight="35.0" vgrow="ALWAYS" /> | |
<RowConstraints minHeight="10.0" prefHeight="35.0" vgrow="ALWAYS" /> | |
<RowConstraints minHeight="10.0" prefHeight="35.0" vgrow="ALWAYS" /> | |
<RowConstraints minHeight="10.0" prefHeight="35.0" vgrow="ALWAYS" /> | |
<RowConstraints minHeight="10.0" prefHeight="35.0" vgrow="ALWAYS" /> | |
</rowConstraints> | |
<effect> | |
<Blend opacity="0.17" /> | |
</effect> | |
</GridPane> | |
</children> | |
<padding> | |
<Insets bottom="5.0" top="5.0" /> | |
</padding></AnchorPane> | |
</items> | |
</SplitPane> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment