{"id":30483,"date":"2019-10-31T21:35:47","date_gmt":"2019-10-31T18:35:47","guid":{"rendered":"https:\/\/prohoster.info\/blog\/pyatnashka-na-java-kak-razrabotat-polnotsennuyu-igru\/"},"modified":"2019-10-31T21:35:47","modified_gmt":"2019-10-31T18:35:47","slug":"pyatnashka-na-java-kak-razrabotat-polnotsennuyu-igru","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/novosti-interneta\/pyatnashka-na-java-kak-razrabotat-polnotsennuyu-igru","title":{"rendered":"Das '15-Puzzle' in Java \u2013 so entwickeln Sie ein vollwertiges Spiel","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"&laquo;\u041f\u044f\u0442\u043d\u0430\u0448\u043a\u0430&raquo; \u043d\u0430 Java &mdash; \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0443\u044e \u0438\u0433\u0440\u0443\" src=\"\/wp-content\/uploads\/2019\/03\/c5655503059b3d58f8c1f19a88fdc5fd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>\u00ab\u041f\u044f\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u044c\u00bb, \u0438\u043b\u0438 \u00ab\u041f\u044f\u0442\u043d\u0430\u0448\u043a\u0430\u00bb<\/b> \u2014 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0438\u0433\u0440\u044b, \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0439 \u0432\u043e \u0432\u0441\u0435\u043c \u043c\u0438\u0440\u0435. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0443, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u043a\u0438 \u0441 \u0446\u0438\u0444\u0440\u0430\u043c\u0438 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443, \u043e\u0442 \u043c\u0435\u043d\u044c\u0448\u0435\u0433\u043e \u043a \u0431\u043e\u043b\u044c\u0448\u0435\u043c\u0443. \u042d\u0442\u043e \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e.<\/p>\n<p>\u0412 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0435\u043c \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u00ab\u041f\u044f\u0442\u043d\u0430\u0448\u043a\u0443\u00bb \u043d\u0430 Java 8 \u0441 Eclipse. \u0414\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 UI \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Swing API.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>\u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c:<\/b> <i>\u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u00ab\u0425\u0430\u0431\u0440\u0430\u00bb \u2014 \u0441\u043a\u0438\u0434\u043a\u0430 10 000 \u0440\u0443\u0431\u043b\u0435\u0439 \u043f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u043a\u0443\u0440\u0441 Skillbox \u043f\u043e \u043f\u0440\u043e\u043c\u043e\u043a\u043e\u0434\u0443 \u00ab\u0425\u0430\u0431\u0440\u00bb.<\/i><\/p>\n<p><b>Skillbox \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442:<\/b> \u041e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u043d\u043b\u0430\u0439\u043d-\u043a\u0443\u0440\u0441 <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/java\/?utm_source=skillbox.media&amp;utm_medium=habr.com&amp;utm_campaign=JAVDEV&amp;utm_content=articles&amp;utm_term=gameoffifteen\">\u00ab\u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u044f Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u00bb<\/a><\/noindex>.<\/p><\/blockquote>\n<p><\/p>\n<h3>\u041f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0433\u0440\u044b <\/h3>\n<p>\n\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430:<\/p>\n<ul>\n<li>Size \u2014 \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f;<\/li>\n<li>nbTiles \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u044f\u0442\u043d\u0430\u0448\u0435\u043a \u0432 \u043f\u043e\u043b\u0435. nbTiles = size*size \u2014 1;<\/li>\n<li>Tiles \u2014 \u043f\u044f\u0442\u043d\u0430\u0448\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043e\u0434\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b. \u041a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u043f\u044f\u0442\u043d\u0430\u0448\u0435\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 [0, nbTiles]. \u041d\u043e\u043b\u044c \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043f\u0443\u0441\u0442\u043e\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442;<\/li>\n<li>blankPos \u2014 \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430.<\/li>\n<\/ul>\n<p><\/p>\n<h3>\u041b\u043e\u0433\u0438\u043a\u0430 \u0438\u0433\u0440\u044b<\/h3>\n<p>\n\u041d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0441\u0431\u0440\u043e\u0441\u0430 (reset), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0434\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u043e\u0432\u043e\u0439 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438. \u0422\u0430\u043a \u043c\u044b \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u044f\u0442\u043d\u0430\u0448\u0435\u043a. \u041d\u0443 \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c blankPos \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043c\u0430\u0441\u0441\u0438\u0432\u0430.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u0435\u043d \u043c\u0435\u0442\u043e\u0434 shuffle \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043e\u0432\u043a\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u044f\u0442\u043d\u0430\u0448\u0435\u043a. \u041c\u044b \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u0443\u0441\u0442\u0443\u044e \u043f\u044f\u0442\u043d\u0430\u0448\u043a\u0443 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043e\u0432\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u0435 \u0432 \u043f\u0440\u0435\u0436\u043d\u0435\u043c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438. <\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0438 \u0438\u043c\u0435\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0440\u0430\u0441\u043a\u043b\u0430\u0434 \u0432\u043e\u043e\u0431\u0449\u0435 \u0440\u0435\u0448\u0430\u0435\u043c. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043c\u0435\u0442\u043e\u0434 isSolvable.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043f\u044f\u0442\u043d\u0430\u0448\u043a\u0435 \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u044f\u0442\u043d\u0430\u0448\u043a\u0430 \u0441 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c, \u044d\u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0435\u0439. \u041a\u043e\u0433\u0434\u0430 \u043f\u0443\u0441\u0442\u0430\u044f \u043f\u044f\u0442\u043d\u0430\u0448\u043a\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u0441\u0432\u043e\u0435\u043c \u043c\u0435\u0441\u0442\u0435, \u0447\u0438\u0441\u043b\u043e \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0439 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0447\u0435\u0442\u043d\u044b\u043c, \u0447\u0442\u043e\u0431\u044b \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0430 \u0431\u044b\u043b\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u043c\u043e\u0439. \u0418\u0442\u0430\u043a, \u043c\u044b \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0439 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c true, \u0435\u0441\u043b\u0438 \u0447\u0438\u0441\u043b\u043e \u0447\u0435\u0442\u043d\u043e\u0435.<\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u0432\u0430\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 isSolved, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0440\u0435\u0448\u0435\u043d \u043b\u0438 \u043d\u0430\u0448 \u0440\u0430\u0441\u043a\u043b\u0430\u0434 Game Of Fifteen. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0433\u0434\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0443\u0441\u0442\u0430\u044f \u043f\u044f\u0442\u043d\u0430\u0448\u043a\u0430. \u0415\u0441\u043b\u0438 \u0432 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438, \u0442\u043e \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0440\u0430\u0441\u043a\u043b\u0430\u0434 \u2014 \u043d\u043e\u0432\u044b\u0439, \u043d\u0435 \u0440\u0435\u0448\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u043d\u0435\u0435. \u0417\u0430\u0442\u0435\u043c \u043c\u044b \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u043b\u0438\u0442\u043a\u0438 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0438, \u0435\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u044f\u0442\u043d\u0430\u0448\u043a\u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430 +1, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c false. \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 \u043f\u043e\u0440\u0430 \u0432\u0435\u0440\u043d\u0443\u0442\u044c true, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0430 \u0443\u0436\u0435 \u0440\u0435\u0448\u0435\u043d\u0430.<\/p>\n<p>\u0415\u0449\u0435 \u043e\u0434\u0438\u043d \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u2014 newGame. \u041e\u043d \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0438\u0433\u0440\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0438\u0433\u0440\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435, \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0438\u0433\u0440\u043e\u0432\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u043c\u0430.<\/p>\n<p>\u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u0441 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u043f\u044f\u0442\u043d\u0430\u0448\u0435\u043a:<\/p>\n<pre><code class=\"java\">private void newGame() {\n  do {\n    reset(); \/\/ reset in initial state\n    shuffle(); \/\/ shuffle\n  } while(!isSolvable()); \/\/ make it until grid be solvable\n \n  gameOver = false;\n}\n \nprivate void reset() {\n  for (int i = 0; i &lt; tiles.length; i++) {\n    tiles[i] = (i + 1) % tiles.length;\n  }\n \n  \/\/ we set blank cell at the last\n  blankPos = tiles.length - 1;\n}\n \nprivate void shuffle() {\n  \/\/ don't include the blank tile in the shuffle, leave in the solved position\n  int n = nbTiles;\n \n  while (n &gt; 1) {\n    int r = RANDOM.nextInt(n--);\n    int tmp = tiles[r];\n    tiles[r] = tiles[n];\n    tiles[n] = tmp;\n  }\n}\n \n\/\/ Only half permutations of the puzzle are solvable\/\n\/\/ Whenever a tile is preceded by a tile with higher value it counts\n\/\/ as an inversion. In our case, with the blank tile in the solved position,\n\/\/ the number of inversions must be even for the puzzle to be solvable\nprivate boolean isSolvable() {\n  int countInversions = 0;\n \n  for (int i = 0; i &lt; nbTiles; i++) {\n    for (int j = 0; j &lt; i; j++) {\n      if (tiles[j] &gt; tiles[i])\n        countInversions++;\n    }\n  }\n \n  return countInversions % 2 == 0;\n}\n \nprivate boolean isSolved() {\n  if (tiles[tiles.length - 1] != 0) \/\/ if blank tile is not in the solved position ==&gt; not solved\n    return false;\n \n  for (int i = nbTiles - 1; i &gt;= 0; i--) {\n    if (tiles[i] != i + 1)\n      return false;\n  }\n \n  return true;\n}<\/code><\/pre>\n<p>\n\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u043f\u044f\u0442\u043d\u0430\u0448\u0435\u043a \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435. \u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0437\u0436\u0435 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 (callback), \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u043a\u0443\u0440\u0441\u043e\u0440\u0430. \u041d\u0430\u0448\u0430 \u0438\u0433\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0439 \u043f\u043b\u0438\u0442\u043e\u043a \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043c\u044b \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0432 \u043f\u044f\u0442\u043d\u0430\u0448\u043a\u0443, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043f\u0443\u0441\u0442\u043e\u0439 \u043f\u044f\u0442\u043d\u0430\u0448\u043a\u0438 \u0438 \u0438\u0449\u0435\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0435\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0439 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e.<\/p>\n<p>\u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430:<\/p>\n<pre><code class=\"java\">\/\/ get position of the click\nint ex = e.getX() - margin;\nint ey = e.getY() - margin;\n \n\/\/ click in the grid ?\nif (ex &lt; 0 || ex &gt; gridSize  || ey &lt; 0  || ey &gt; gridSize)\n  return;\n \n\/\/ get position in the grid\nint c1 = ex \/ tileSize;\nint r1 = ey \/ tileSize;\n \n\/\/ get position of the blank cell\nint c2 = blankPos % size;\nint r2 = blankPos \/ size;\n \n\/\/ we convert in the 1D coord\nint clickPos = r1 * size + c1;\n \nint dir = 0;\n \n\/\/ we search direction for multiple tile moves at once\nif (c1 == c2  &amp;&amp;  Math.abs(r1 - r2) &gt; 0)\n  dir = (r1 - r2) &gt; 0 ? size : -size;\nelse if (r1 == r2 &amp;&amp; Math.abs(c1 - c2) &gt; 0)\n  dir = (c1 - c2) &gt; 0 ? 1 : -1;\n \nif (dir != 0) {\n  \/\/ we move tiles in the direction\n  do {\n    int newBlankPos = blankPos + dir;\n    tiles[blankPos] = tiles[newBlankPos];\n    blankPos = newBlankPos;\n  } while(blankPos != clickPos);\n \ntiles[blankPos] = 0;<\/code><\/pre>\n<p><\/p>\n<h3>\u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c UI \u043d\u0430 Swing API<\/h3>\n<p>\n\u0421\u0430\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0431\u0435\u0440\u0435\u043c \u043a\u043b\u0430\u0441\u0441 Jpanel. \u041f\u043e\u0442\u043e\u043c \u043d\u0430 \u043f\u043e\u043b\u0435 \u0440\u0438\u0441\u0443\u0435\u043c \u043f\u044f\u0442\u043d\u0430\u0448\u043a\u0438 \u2014 \u0434\u043b\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0438\u0433\u0440\u044b:<\/p>\n<pre><code class=\"java\">gridSize = (dim\u200a - \u200a2 * margin);\ntileSize = gridSize \/ size;<\/code><\/pre>\n<p>\nMargin \u0442\u0430\u043a\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c, \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u0438\u0433\u0440\u044b.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 drawGrid \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0441\u0435\u0442\u043a\u0438 \u0438 \u043f\u044f\u0442\u043d\u0430\u0448\u0435\u043a \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. \u0410\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u044f\u0442\u043d\u0430\u0448\u0435\u043a \u0438 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. \u0417\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u0440\u0438\u0441\u0443\u0435\u043c \u043a\u0430\u0436\u0434\u0443\u044e \u043f\u044f\u0442\u043d\u0430\u0448\u043a\u0443 \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043d\u043e\u043c\u0435\u0440\u043e\u043c \u0432 \u0446\u0435\u043d\u0442\u0440\u0435:<\/p>\n<pre><code class=\"java\">private void drawGrid(Graphics2D g) {\n  for (int i = 0; i &lt; tiles.length; i++) {\n    \/\/ we convert 1D coords to 2D coords given the size of the 2D Array\n    int r = i \/ size;\n    int c = i % size;\n    \/\/ we convert in coords on the UI\n    int x = margin + c * tileSize;\n    int y = margin + r * tileSize;\n \n    \/\/ check special case for blank tile\n    if(tiles[i] == 0) {\n      if (gameOver) {\n        g.setColor(FOREGROUND_COLOR);\n        drawCenteredString(g, \"u2713\", x, y);\n      }\n \n      continue;\n    }\n \n    \/\/ for other tiles\n    g.setColor(getForeground());\n    g.fillRoundRect(x, y, tileSize, tileSize, 25, 25);\n    g.setColor(Color.BLACK);\n    g.drawRoundRect(x, y, tileSize, tileSize, 25, 25);\n    g.setColor(Color.WHITE);\n \n    drawCenteredString(g, String.valueOf(tiles[i]), x , y);\n  }\n}<\/code><\/pre>\n<p>\n\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043c\u0435\u0442\u043e\u0434 paintComponent, \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u0430 JPane. \u0417\u0430\u0442\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434 drawGrid, \u0430 \u043f\u043e\u0441\u043b\u0435 \u2014 \u043c\u0435\u0442\u043e\u0434 drawStartMessage \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0449\u0435\u0433\u043e \u043a\u043b\u0438\u043a\u043d\u0443\u0442\u044c \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438\u0433\u0440\u044b:<\/p>\n<pre><code class=\"java\">private void drawStartMessage(Graphics2D g) {\n  if (gameOver) {\n    g.setFont(getFont().deriveFont(Font.BOLD, 18));\n    g.setColor(FOREGROUND_COLOR);\n    String s = \"Click to start new game\";\n    g.drawString(s, (getWidth() - g.getFontMetrics().stringWidth(s)) \/ 2,\n        getHeight() - margin);\n  }\n}\n \nprivate void drawCenteredString(Graphics2D g, String s, int x, int y) {\n  \/\/ center string s for the given tile (x,y)\n  FontMetrics fm = g.getFontMetrics();\n  int asc = fm.getAscent();\n  int desc = fm.getDescent();\n  g.drawString(s,  x + (tileSize - fm.stringWidth(s)) \/ 2,\n      y + (asc + (tileSize - (asc + desc)) \/ 2));\n}\n \n@Override\nprotected void paintComponent(Graphics g) {\n  super.paintComponent(g);\n  Graphics2D g2D = (Graphics2D) g;\n  g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);\n  drawGrid(g2D);\n  drawStartMessage(g2D);\n}<\/code><\/pre>\n<p><\/p>\n<h3>\u0420\u0435\u0430\u0433\u0438\u0440\u0443\u0435\u043c \u043d\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 UI<\/h3>\n<p>\n\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0438\u0433\u0440\u0430 \u0448\u043b\u0430 \u0441\u0432\u043e\u0438\u043c \u0447\u0435\u0440\u0435\u0434\u043e\u043c, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 UI. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e MouseListener \u043d\u0430 Jpanel \u0438 \u043a\u043e\u0434 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u044f\u0442\u043d\u0430\u0448\u0435\u043a, \u0443\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435:<\/p>\n<pre><code class=\"java\">addMouseListener(new MouseAdapter() {\n  @Override\n  public void mousePressed(MouseEvent e) {\n    \/\/ used to let users to interact on the grid by clicking\n    \/\/ it's time to implement interaction with users to move tiles to solve the game !\n    if (gameOver) {\n      newGame();\n    } else {\n      \/\/ get position of the click\n      int ex = e.getX() - margin;\n      int ey = e.getY() - margin;\n \n      \/\/ click in the grid ?\n      if (ex &lt; 0 || ex &gt; gridSize  || ey &lt; 0  || ey &gt; gridSize)\n        return;\n \n      \/\/ get position in the grid\n      int c1 = ex \/ tileSize;\n      int r1 = ey \/ tileSize;\n \n      \/\/ get position of the blank cell\n      int c2 = blankPos % size;\n      int r2 = blankPos \/ size;\n \n      \/\/ we convert in the 1D coord\n      int clickPos = r1 * size + c1;\n \n      int dir = 0;\n \n      \/\/ we search direction for multiple tile moves at once\n      if (c1 == c2  &amp;&amp;  Math.abs(r1 - r2) &gt; 0)\n        dir = (r1 - r2) &gt; 0 ? size : -size;\n      else if (r1 == r2 &amp;&amp; Math.abs(c1 - c2) &gt; 0)\n        dir = (c1 - c2) &gt; 0 ? 1 : -1;\n \n      if (dir != 0) {\n        \/\/ we move tiles in the direction\n        do {\n          int newBlankPos = blankPos + dir;\n          tiles[blankPos] = tiles[newBlankPos];\n          blankPos = newBlankPos;\n        } while(blankPos != clickPos);\n \n        tiles[blankPos] = 0;\n      }\n \n      \/\/ we check if game is solved\n      gameOver = isSolved();\n    }\n \n    \/\/ we repaint panel\n    repaint();\n  }\n});<\/code><\/pre>\n<p>\n\u041a\u043e\u0434 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u043c \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 GameOfFifteen. \u0412 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u043d\u0446\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 newGame \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u043e\u0432\u043e\u0439 \u0438\u0433\u0440\u044b.<\/p>\n<h3>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438\u0433\u0440\u044b<\/h3>\n<p>\n\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0448\u0430\u0433, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0438\u0433\u0440\u0443 \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438, \u2014 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u0434\u0430 \u0432\u043c\u0435\u0441\u0442\u0435. \u0412\u043e\u0442 \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f:<\/p>\n<pre><code class=\"java\">import java.awt.BorderLayout;\nimport java.awt.Color;\nimport java.awt.Dimension;\nimport java.awt.Font;\nimport java.awt.FontMetrics;\nimport java.awt.Graphics;\nimport java.awt.Graphics2D;\nimport java.awt.RenderingHints;\nimport java.awt.event.MouseAdapter;\nimport java.awt.event.MouseEvent;\nimport java.util.Random;\n \nimport javax.swing.JFrame;\nimport javax.swing.JPanel;\nimport javax.swing.SwingUtilities;\n \n\/\/ We are going to create a Game of 15 Puzzle with Java 8 and Swing\n\/\/ If you have some questions, feel free to read comments ;)\npublic class GameOfFifteen extends JPanel { \/\/ our grid will be drawn in a dedicated Panel\n \n  \/\/ Size of our Game of Fifteen instance\n  private int size;\n  \/\/ Number of tiles\n  private int nbTiles;\n  \/\/ Grid UI Dimension\n  private int dimension;\n  \/\/ Foreground Color\n  private static final Color FOREGROUND_COLOR = new Color(239, 83, 80); \/\/ we use arbitrary color\n  \/\/ Random object to shuffle tiles\n  private static final Random RANDOM = new Random();\n  \/\/ Storing the tiles in a 1D Array of integers\n  private int[] tiles;\n  \/\/ Size of tile on UI\n  private int tileSize;\n  \/\/ Position of the blank tile\n  private int blankPos;\n  \/\/ Margin for the grid on the frame\n  private int margin;\n  \/\/ Grid UI Size\n  private int gridSize;\n  private boolean gameOver; \/\/ true if game over, false otherwise\n \n  public GameOfFifteen(int size, int dim, int mar) {\n    this.size = size;\n    dimension = dim;\n    margin = mar;\n    \n    \/\/ init tiles\n    nbTiles = size * size - 1; \/\/ -1 because we don't count blank tile\n    tiles = new int[size * size];\n    \n    \/\/ calculate grid size and tile size\n    gridSize = (dim - 2 * margin);\n    tileSize = gridSize \/ size;\n    \n    setPreferredSize(new Dimension(dimension, dimension + margin));\n    setBackground(Color.WHITE);\n    setForeground(FOREGROUND_COLOR);\n    setFont(new Font(\"SansSerif\", Font.BOLD, 60));\n    \n    gameOver = true;\n    \n    addMouseListener(new MouseAdapter() {\n      @Override\n      public void mousePressed(MouseEvent e) {\n        \/\/ used to let users to interact on the grid by clicking\n        \/\/ it's time to implement interaction with users to move tiles to solve the game !\n        if (gameOver) {\n          newGame();\n        } else {\n          \/\/ get position of the click\n          int ex = e.getX() - margin;\n          int ey = e.getY() - margin;\n          \n          \/\/ click in the grid ?\n          if (ex &lt; 0 || ex &gt; gridSize  || ey &lt; 0  || ey &gt; gridSize)\n            return;\n          \n          \/\/ get position in the grid\n          int c1 = ex \/ tileSize;\n          int r1 = ey \/ tileSize;\n          \n          \/\/ get position of the blank cell\n          int c2 = blankPos % size;\n          int r2 = blankPos \/ size;\n          \n          \/\/ we convert in the 1D coord\n          int clickPos = r1 * size + c1;\n          \n          int dir = 0;\n          \n          \/\/ we search direction for multiple tile moves at once\n          if (c1 == c2  &amp;&amp;  Math.abs(r1 - r2) &gt; 0)\n            dir = (r1 - r2) &gt; 0 ? size : -size;\n          else if (r1 == r2 &amp;&amp; Math.abs(c1 - c2) &gt; 0)\n            dir = (c1 - c2) &gt; 0 ? 1 : -1;\n            \n          if (dir != 0) {\n            \/\/ we move tiles in the direction\n            do {\n              int newBlankPos = blankPos + dir;\n              tiles[blankPos] = tiles[newBlankPos];\n              blankPos = newBlankPos;\n            } while(blankPos != clickPos);\n            \n            tiles[blankPos] = 0;\n          }\n          \n          \/\/ we check if game is solved\n          gameOver = isSolved();\n        }\n        \n        \/\/ we repaint panel\n        repaint();\n      }\n    });\n    \n    newGame();\n  }\n \n  private void newGame() {\n    do {\n      reset(); \/\/ reset in intial state\n      shuffle(); \/\/ shuffle\n    } while(!isSolvable()); \/\/ make it until grid be solvable\n    \n    gameOver = false;\n  }\n \n  private void reset() {\n    for (int i = 0; i &lt; tiles.length; i++) {\n      tiles[i] = (i + 1) % tiles.length;\n    }\n    \n    \/\/ we set blank cell at the last\n    blankPos = tiles.length - 1;\n  }\n \n  private void shuffle() {\n    \/\/ don't include the blank tile in the shuffle, leave in the solved position\n    int n = nbTiles;\n    \n    while (n &gt; 1) {\n      int r = RANDOM.nextInt(n--);\n      int tmp = tiles[r];\n      tiles[r] = tiles[n];\n      tiles[n] = tmp;\n    }\n  }\n \n  \/\/ Only half permutations of the puzzle are solvable.\n  \/\/ Whenever a tile is preceded by a tile with higher value it counts\n  \/\/ as an inversion. In our case, with the blank tile in the solved position,\n  \/\/ the number of inversions must be even for the puzzle to be solvable\n  private boolean isSolvable() {\n    int countInversions = 0;\n    \n    for (int i = 0; i &lt; nbTiles; i++) {\n      for (int j = 0; j &lt; i; j++) {\n        if (tiles[j] &gt; tiles[i])\n          countInversions++;\n      }\n    }\n    \n    return countInversions % 2 == 0;\n  }\n \n  private boolean isSolved() {\n    if (tiles[tiles.length - 1] != 0) \/\/ if blank tile is not in the solved position ==&gt; not solved\n      return false;\n    \n    for (int i = nbTiles - 1; i &gt;= 0; i--) {\n      if (tiles[i] != i + 1)\n        return false;      \n    }\n    \n    return true;\n  }\n \n  private void drawGrid(Graphics2D g) {\n    for (int i = 0; i &lt; tiles.length; i++) {\n      \/\/ we convert 1D coords to 2D coords given the size of the 2D Array\n      int r = i \/ size;\n      int c = i % size;\n      \/\/ we convert in coords on the UI\n      int x = margin + c * tileSize;\n      int y = margin + r * tileSize;\n      \n      \/\/ check special case for blank tile\n      if(tiles[i] == 0) {\n        if (gameOver) {\n          g.setColor(FOREGROUND_COLOR);\n          drawCenteredString(g, \"u2713\", x, y);\n        }\n        \n        continue;\n      }\n      \n      \/\/ for other tiles\n      g.setColor(getForeground());\n      g.fillRoundRect(x, y, tileSize, tileSize, 25, 25);\n      g.setColor(Color.BLACK);\n      g.drawRoundRect(x, y, tileSize, tileSize, 25, 25);\n      g.setColor(Color.WHITE);\n      \n      drawCenteredString(g, String.valueOf(tiles[i]), x , y);\n    }\n  }\n \n  private void drawStartMessage(Graphics2D g) {\n    if (gameOver) {\n      g.setFont(getFont().deriveFont(Font.BOLD, 18));\n      g.setColor(FOREGROUND_COLOR);\n      String s = \"Click to start new game\";\n      g.drawString(s, (getWidth() - g.getFontMetrics().stringWidth(s)) \/ 2,\n          getHeight() - margin);\n    }\n  }\n \n  private void drawCenteredString(Graphics2D g, String s, int x, int y) {\n    \/\/ center string s for the given tile (x,y)\n    FontMetrics fm = g.getFontMetrics();\n    int asc = fm.getAscent();\n    int desc = fm.getDescent();\n    g.drawString(s,  x + (tileSize - fm.stringWidth(s)) \/ 2,\n        y + (asc + (tileSize - (asc + desc)) \/ 2));\n  }\n \n  @Override\n  protected void paintComponent(Graphics g) {\n    super.paintComponent(g);\n    Graphics2D g2D = (Graphics2D) g;\n    g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);\n    drawGrid(g2D);\n    drawStartMessage(g2D);\n  }\n \n  public static void main(String[] args) {\n    SwingUtilities.invokeLater(() -&gt; {\n      JFrame frame = new JFrame();\n      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\n      frame.setTitle(\"Game of Fifteen\");\n      frame.setResizable(false);\n      frame.add(new GameOfFifteen(4, 550, 30), BorderLayout.CENTER);\n      frame.pack();\n      \/\/ center on the screen\n      frame.setLocationRelativeTo(null);\n      frame.setVisible(true);\n    });\n  }\n \n \n}<\/code><\/pre>\n<p><\/p>\n<h3>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0438\u0433\u0440\u0430\u0435\u043c!<\/h3>\n<p>\n\u0421\u0430\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0433\u0440\u0443 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0435\u0435 \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438. \u041f\u043e\u043b\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p><img decoding=\"async\" alt=\"&laquo;\u041f\u044f\u0442\u043d\u0430\u0448\u043a\u0430&raquo; \u043d\u0430 Java &mdash; \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0443\u044e \u0438\u0433\u0440\u0443\" src=\"\/wp-content\/uploads\/2019\/03\/d97529700efec29e7ffc1f6103a4fe0e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0435\u0448\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0443. \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u043e\u0448\u043b\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u043e\u0442 \u0447\u0442\u043e:<\/p>\n<p><img decoding=\"async\" alt=\"&laquo;\u041f\u044f\u0442\u043d\u0430\u0448\u043a\u0430&raquo; \u043d\u0430 Java &mdash; \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0443\u044e \u0438\u0433\u0440\u0443\" src=\"\/wp-content\/uploads\/2019\/03\/372e7d277f26991d5416edbf0b45b616.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n\u0412\u043e\u0442 \u0438 \u0432\u0441\u0451. \u0410 \u0432\u044b \u043e\u0436\u0438\u0434\u0430\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e? \ud83d\ude42<\/p>\n<blockquote><p><b>Skillbox \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442:<\/b><\/p>\n<ul>\n<li>\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u0443\u0440\u0441 <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/agima\/?utm_source=skillbox.media&amp;utm_medium=habr.com&amp;utm_campaign=AGIMA&amp;utm_content=articles&amp;utm_term=gameoffifteen\">\u00ab\u041c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a PRO\u00bb<\/a><\/noindex>.<\/li>\n<li>\u041f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0439 \u043e\u043d\u043b\u0430\u0439\u043d-\u043a\u0443\u0440\u0441 <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/python-data\/?utm_source=skillbox.media&amp;utm_medium=habr.com&amp;utm_campaign=PTNANA&amp;utm_content=articles&amp;utm_term=gameoffifteen\">\u00ab\u0410\u043d\u0430\u043b\u0438\u0442\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445 Python\u00bb<\/a><\/noindex>.<\/li>\n<li>\u0414\u0432\u0443\u0445\u043b\u0435\u0442\u043d\u0438\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u0443\u0440\u0441 <noindex><a rel=\"nofollow\" href=\"https:\/\/iamwebdev.skillbox.ru\/?utm_source=skillbox.media&amp;utm_medium=habr.com&amp;utm_campaign=WEBDEVPRO&amp;utm_content=articles&amp;utm_term=gameoffifteen\">\u00ab\u042f \u2014 \u0432\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a PRO\u00bb<\/a><\/noindex>.<\/li>\n<\/ul>\n<\/blockquote>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/skillbox\/blog\/445758\/\">habr.com<\/a><\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u00ab\u041f\u044f\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u044c\u00bb, \u0438\u043b\u0438 \u00ab\u041f\u044f\u0442\u043d\u0430\u0448\u043a\u0430\u00bb \u2014 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0438\u0433\u0440\u044b, \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0439 \u0432\u043e \u0432\u0441\u0435\u043c \u043c\u0438\u0440\u0435. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0443, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u043a\u0438 \u0441 \u0446\u0438\u0444\u0440\u0430\u043c\u0438 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443, \u043e\u0442 \u043c\u0435\u043d\u044c\u0448\u0435\u0433\u043e \u043a \u0431\u043e\u043b\u044c\u0448\u0435\u043c\u0443. \u042d\u0442\u043e \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e. \u0412 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0435\u043c \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u00ab\u041f\u044f\u0442\u043d\u0430\u0448\u043a\u0443\u00bb \u043d\u0430 Java 8 \u0441 Eclipse. \u0414\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 UI \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Swing API. \u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c: \u0434\u043b\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":22481,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[702],"tags":[],"class_list":["post-30483","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-novosti-interneta"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u00ab\u041f\u044f\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u044c\u00bb, \u0438\u043b\u0438 \u00ab\u041f\u044f\u0442\u043d\u0430\u0448\u043a\u0430\u00bb \u2014 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0438\u0433\u0440\u044b, \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0439 \u0432\u043e \u0432\u0441\u0435\u043c \u043c\u0438\u0440\u0435. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0443, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u043a\u0438 \u0441 \u0446\u0438\u0444\u0440\u0430\u043c\u0438 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443, \u043e\u0442 \u043c\u0435\u043d\u044c\u0448\u0435\u0433\u043e \u043a \u0431\u043e\u043b\u044c\u0448\u0435\u043c\u0443. \u042d\u0442\u043e \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e. \u0412 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0435\u043c \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u00ab\u041f\u044f\u0442\u043d\u0430\u0448\u043a\u0443\u00bb \u043d\u0430 Java 8 \u0441 Eclipse. \u0414\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 UI \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Swing API. \u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c: \u0434\u043b\u044f\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/novosti-interneta\/pyatnashka-na-java-kak-razrabotat-polnotsennuyu-igru\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u00ab\u041f\u044f\u0442\u043d\u0430\u0448\u043a\u0430\u00bb \u043d\u0430 Java \u2014 \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0443\u044e \u0438\u0433\u0440\u0443 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u00ab\u041f\u044f\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u044c\u00bb, \u0438\u043b\u0438 \u00ab\u041f\u044f\u0442\u043d\u0430\u0448\u043a\u0430\u00bb \u2014 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0438\u0433\u0440\u044b, \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0439 \u0432\u043e \u0432\u0441\u0435\u043c \u043c\u0438\u0440\u0435. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0443, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u043a\u0438 \u0441 \u0446\u0438\u0444\u0440\u0430\u043c\u0438 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443, \u043e\u0442 \u043c\u0435\u043d\u044c\u0448\u0435\u0433\u043e \u043a \u0431\u043e\u043b\u044c\u0448\u0435\u043c\u0443. \u042d\u0442\u043e \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e. \u0412 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0435\u043c \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u00ab\u041f\u044f\u0442\u043d\u0430\u0448\u043a\u0443\u00bb \u043d\u0430 Java 8 \u0441 Eclipse. \u0414\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 UI \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Swing API. \u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c: \u0434\u043b\u044f\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/novosti-interneta\/pyatnashka-na-java-kak-razrabotat-polnotsennuyu-igru\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:35:47+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:35:47+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47\u201e15-Puzzle\u201c in Java \u2013 So entwickeln Sie ein vollst\u00e4ndiges Spiel | ProHoster","description":"\u201eF\u00fcnfzehn\u201c oder \u201e15-Puzzle\u201c ist ein hervorragendes Beispiel f\u00fcr ein einfaches Logikspiel, das weltweit beliebt ist. Um das R\u00e4tsel zu l\u00f6sen, m\u00fcssen die quadratischen Platten mit den Zahlen in der Reihenfolge von klein nach gro\u00df angeordnet werden. Das ist nicht einfach, aber interessant. In diesem Tutorial zeigen wir, wie man das \u201e15-Puzzle\u201c in Java 8 mit Eclipse entwickelt. F\u00fcr die UI-Entwicklung verwenden wir das Swing API. Denken Sie daran, dass f\u00fcr","canonical_url":"https:\/\/prohoster.info\/de\/blog\/novosti-interneta\/pyatnashka-na-java-kak-razrabotat-polnotsennuyu-igru","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u00ab\u041f\u044f\u0442\u043d\u0430\u0448\u043a\u0430\u00bb \u043d\u0430 Java \u2014 \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0443\u044e \u0438\u0433\u0440\u0443 | ProHoster","og:description":"\u00ab\u041f\u044f\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u044c\u00bb, \u0438\u043b\u0438 \u00ab\u041f\u044f\u0442\u043d\u0430\u0448\u043a\u0430\u00bb \u2014 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0438\u0433\u0440\u044b, \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0439 \u0432\u043e \u0432\u0441\u0435\u043c \u043c\u0438\u0440\u0435. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0443, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u043a\u0438 \u0441 \u0446\u0438\u0444\u0440\u0430\u043c\u0438 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443, \u043e\u0442 \u043c\u0435\u043d\u044c\u0448\u0435\u0433\u043e \u043a \u0431\u043e\u043b\u044c\u0448\u0435\u043c\u0443. \u042d\u0442\u043e \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e. \u0412 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0435\u043c \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u00ab\u041f\u044f\u0442\u043d\u0430\u0448\u043a\u0443\u00bb \u043d\u0430 Java 8 \u0441 Eclipse. \u0414\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 UI \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Swing API. \u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c: \u0434\u043b\u044f","og:url":"https:\/\/prohoster.info\/de\/blog\/novosti-interneta\/pyatnashka-na-java-kak-razrabotat-polnotsennuyu-igru","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:35:47+00:00","article:modified_time":"2019-10-31T18:35:47+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"30483","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 01:25:57","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:34:26","updated":"2026-01-21 01:25:57"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/30483","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=30483"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/30483\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/22481"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=30483"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=30483"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=30483"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}