программы с открытым кодом на java
Лучшие проекты для того, чтобы примкнуть к Open Source движению и развить свои навыки. Часть вторая. Java, C#
Лучшие проекты для того, чтобы примкнуть к Open Source движению и развить свои навыки. Часть вторая. Java, C#
Если вы интересуетесь жизнью Open Source сообщества и хотите к нему присоединиться, то эта серия подборок придётся вам как нельзя кстати, ведь в ней собраны лучшие проекты с открытым исходным кодом. Во второй части серии вы найдёте самые интересные Open Source проекты на Java и C#.
Druid — это распределённое хранилище данных, поддерживающее анализ в реальном времени, часто используемое в виде информационной панели.
Druid отлично подходит для хранения и обработки наборов данных размером до петабайта. Инструмент поддерживает различные фильтры, точные и приближённые вычисления, а также может быть интегрирован в Samza, Kafka, Storm, Spark и Hadoop.
libGDX — это кроссплатформенный Java-фреймворк для разработки игр, основанный на OpenGL (ES). Он работает на Windows, Linux, Mac OS X, Android, iOS и в браузерах с поддержкой WebGL.
DBeaver — кроссплатформенный инструмент для работы с базами данных. Поддерживает все популярные БД: MySQL / MariaDB, PostgreSQL, Greenplum, Oracle, DB2 LUW, Exasol, SQL Server, Sybase / SAP ASE, SQLite, Firebird, H2, HSQLDB, Derby, Teradata, Vertica, Netezza, Informix и др.
Имеет в себе множество функций, включая редактор метаданных, редактор SQL, импорт/экспорт/миграцию данных.
Mockito — среда тестирования для Java. Её основной целью является предоставление возможности писать чистые и легко читаемые модульные тесты, используя простой API.
Mockito позволяет создавать заглушки для тестирования, проверять вызовы методов и передаваемые им значения.
Spring Boot — это инструмент для Java-фреймворка Spring. Он избавляет разработчика от громоздкой конфигурации зависимостей при настройке Spring.
Основными особенностями этого инструмента является автоматическая конфигурация, управление зависимостями и наличие встроенных контейнеров сервлетов.
Roslyn предоставляет C#- и Visual Basic-компиляторы с API для анализа кода, аналогичными инструментам Visual Studio.
Cake (C# Make) — это система автоматизации сборки с C# DSL, предназначенная для компиляции кода, копирования файлов и папок, запуска юнит-тестов, сжатия файлов и сборки NuGet-пакетов.
OpenTK — это быстрая низкоуровневая C#-связка OpenGL, OpenGL ES и OpenAL. Она работает на всех основных платформах.
Dapper — это простой маппер объектов в виде NuGet-пакета, которые расширяет интерфейс IDbConnection.
AvaloniaUI — это кроссплатформенная среда пользовательского интерфейса на основе XAML. Она обеспечивает гибкую систему стилей и шаблонов. Среда доступна на таких операционных системах, как Windows, Linux и macOS.
Bot Framework — Open Source SDK для создания диалоговых ботов. Разработчики могут моделировать сложные и гибкие сценарии диалогов на C#, JS, Python и Java. Также доступна визуальная среда создания диалогов Bot Framework Composer.
PowerShell — инструмент для автоматизации и настройки с интерфейсом командной строки. Незаменимая вещь для администраторов.
Shadowsocks — это прокси-сервер на протоколе SOCKS5 с поддержкой HTTP и UDP. Лёгкий и гибкий в настройке, имеет большую пропускную способность.
Live-Charts — инструмент для простого создания интерактивных и гибких диаграмм. Поддерживает WPF, UWP и Winforms.
Хинт для программистов: если зарегистрируетесь на соревнования Huawei Cup, то бесплатно получите доступ к онлайн-школе для участников. Можно прокачаться по разным навыкам и выиграть призы в самом соревновании.
Перейти к регистрации
13 идей проектов на Java для оттачивания навыков
Хочешь больше книг по программированию?
Подпишись на наш канал и ознакамливайся бесплатно!
Перевод статьи «12+ Java Practice Projects to Improve Your Programming Career Prospects».
Итак, вы приступили к изучению Java и хотели бы ускорить процесс учебы и улучшить свои карьерные перспективы. Чтение книг и просмотр обучающих видео — отличный способ овладеть языком программирования, но такая учеба не будет эффективной без практики. Решение практических задач на Java позволит вам улучшить ваши навыки кодинга и приблизит вас еще на один шаг к работе мечты.
Чтобы сэкономить вам время, мы собрали идеи проектов, подходящих для Java-разработчиков.
Идеи проектов для начинающих
1. Воспроизведите и переделайте на свой вкус какую-нибудь классическую видеоигру
Как только освоите основы Java, можно браться за практику. Например, можно переосмыслить и сделать по-своему какую-то классическую игру.
Разработка игры это непростая задача, но в разделе Games на CodeGym можно найти полезные пошаговые руководства, которые вам помогут. Доступ к этому разделу бесплатный, а материалы разделены по уровням, так что вы сможете выбрать соответствующий вашему текущему уровню навыков.
Эти игры — не мелочевка. Это полнофункциональные проекты, каждый из которых разбит на 20 подзадач. Чтобы создать игру, вам придется решить все эти подзадачи одну за другой. CodeGym поможет вам создать вашу собственную версию «Сапера», «Змейки», «2048», «Гонщика» и других игр. Когда все будет готово, вы сможете поделиться ссылкой на опубликованную игру с вашими товарищами-программистами, чтобы они могли ее оценить и дать вам фидбэк.
2. Игра «Крестики-нолики»
Мне не случалось встретить игру проще, чем эта. Причем игра «Крестики-нолики» проста как для игроков, так и для программистов. Чтобы создать собственную версию этой игры, у вас должно быть хорошее понимание базового синтаксиса языка и доступ к рабочему редактору Java. Один из самых простых вариантов создания проекта — взять Java Class и привязать его к GUI или интегрировать прямо в консольное приложение. Код класса состоит из трех разделов, включающих функции панели, условия победы и функции игрока.
3. Система банкомата
Разработайте интерфейс банкомата на Java. Работая над проектом, вы создадите пять классов: для владельца счета, самого счета, транзакции, банка и банкомата.
После ввода идентификатора и пин-кода пользователи должны получить доступ к записям о каждой транзакции, а также получить возможность класть деньги на депозит, снимать средства и делать переводы.
4. Обменник валют
Обменник используется для конвертации валют. Пользователь может ввести сумму в одной валюте и узнать, сколько это будет в другой. Валюту выбирает сам пользователь.
Создавая это приложение, начинающие программисты могут поработать с классами, переменными, алгоритмами, циклами и прочими концепциями Java.
Идеи проектов для программистов среднего уровня
5. Система оценок
Создание системы оценивания поможет вам улучшить ваши навыки программирования на Java.
После получения очков викторин, экзаменов, тестов, заданий по разным предметам система выводит результаты в виде оценок. Важным моментом здесь является то, что пользователи могут добавлять столько предметов, сколько они посчитают нужным.
Вся необходимая информация о студентах, будь то номера или имена, должна иметь собственные поля в интерфейсе, а оценки студентов будут отображаться вместе с относительным рангом в их классах.
Этот проект вы создадите с помощью Netbeans (или другой IDE), при этом будете использовать JTextField, JTextArea, JButtons, JPanels, JLabels, JOPtionPane и другие визуальные компоненты.
6. Умная система для клиники
В условиях пандемии создание программы для больницы как никогда релевантно. Такая программа может помочь медикам определять болезнь, основываясь на симптомах, введенных в систему.
После регистрации врач вводит данные о здоровье пациента, включая личные данные, группу крови и уровень артериального давления, вес, результаты анализов и прочие детали. Получив все эти данные, умная система составляет предварительный отчет о состоянии здоровья пациента.
7. Счетчик слов
Когда вы отрабатываете работу со строками и файлами, проект типа «счетчик слов» — то, что надо.
Начинающие программисты, уже имеющие кое-какой опыт, могут создать интерфейс для написания контента со встроенным функционалом для подсчета слов.
Конечно, простой подсчет слов это скучновато, но ведь никто не запрещает проявить фантазию и сделать все по-своему! Вы вполне можете добавить дополнительный функционал, например, подсчет символов без пробелов.
8. Аптечная система
Следующий проект — аптечная система с простым GUI. Эта система должна позволять пользователю отслеживать информацию об аптеках, а также добавлять и удалять товары.
Идеи продвинутых проектов
9. Приложение для создания почтовых аккаунтов для сотрудников компании
Когда освоите среду разработки Java и познакомитесь с ООП, можно будет двигаться дальше и создавать более продвинутые проекты. Например, приложение для администрирования почтовых ящиков сотрудников компании. Этот проект позволит вам разобраться с методом Math.random, а также отточить свои навыки по части инкапсуляции — одной из фундаментальных идей объектно-ориентированного программирования.
Ваше готовое приложение должно «уметь»:
Видео поможет вам разобраться, как все это сделать.
10. Клон «Супербратьев Марио»
Вы играли в «Братьев Марио» в детстве и теперь скучаете по этой игре? У нас хорошие новости! Не так давно Android запустил клон этой игры на базе Java и фреймворка LibGDX.
LibGDX — проект с открытым исходным кодом, который программисты любят использовать при изучении геймдева.
Создавая собственный клон игры, вы получше разберетесь в циклах игры, спрайтах, карте текстур и прочих концепциях. В конечном итоге у вас должна получиться игра, прекрасно работающая на разных платформах, включая Android и iOS.
11. Программа для спортивного менеджмента
Суть этого проекта в разработке интерфейса для управления спортивными мероприятиями и планирования спортивных мероприятий для различных учебных заведений и организаций. Спортивный менеджмент предполагает также контроль за игроками и призами.
Администратор системы имеет право редактировать все данные, а пользователи могут смотреть информацию об игроках и подписываться на интересные для них события. Подписавшись, пользователи должны получать уведомления о предстоящих событиях по электронной почте.
12. Программа для бронирования авиабилетов
Скажем честно: онлайн-решения для бронирования билетов — не то, чем можно кого-то удивить. Но если у вас есть идеи, как сделать процедуру бронирования более эффективной, то почему бы не улучшить систему?
Ваша собственная система бронирования должна позволять пользователям просматривать записи о доступных местах и рейсах, а также совершать онлайн-платежи. И хотя проект, разобранный в видеоруководстве, не предусматривает функционала для обработки платежей и отмены бронирования, вы можете добавить это самостоятельно.
13. Система для управления библиотекой
Этот проект предназначен для оттачивания навыков работы с базами данных. Система управления библиотекой должна автоматизировать задачи, которые все еще выполняются вручную, а также хранить в цифровой базе данных сведения о книгах, их авторах и жанрах.
В такой системе вы можете создать столько функционала, сколько нужно для удобства читателей и библиотекарей. И те, и другие должны без проблем перемещаться по базе данных в поиске книг.
Итоги
Все проекты в нашем списке разбиты по категориям в соответствии с уровнем навыков. Конечно, можно ограничиться проектами для начинающих, но мы не советуем долго топтаться на одном месте. Разработка проектов с возрастающим уровнем сложности позволит вам развить ваши навыки и в итоге устроиться на хорошую работу.
ООП на Java примерах (OOP in Java examples)
У Вас уже должны быть установлены среда разработки приложений NetBeans и JDK (Java Development Kit).
Запустите NetBeans. В меню выберите File/NewProject/Java/ и введите pro1 в ответ на запрос имени проекта, а затем нажмите Finish. При этом будет создан файл Pro1.java с классом Pro1 и пустым методом main() в нем.
Добавим следующий код в этот метод:
Для запуска программы выберем в меню Run /Run Project. В нижней панели отобразится результат работы программы:
Простейшее оконное приложение
Построим изучение основ языка Java на аналогиях, сравнивая его с языком C++. В начале рассмотрим программы, подобные простейшим MFC приложениям.
Начнем с простого, создадим программу, которая показывает пустое окно.
Исходный код программы:
Последовательность выполнения (обозначена 1-4) практически та же, что и для простейшего оконного MFC приложения. При разработке Java приложения программист использует базовые классы, строит производные от них классы. Проект программы может содержать несколько классов. Один из классов проекта содержит функцию main, которая есть точкой входа в программу. Имя класса должно совпадать с именем файла, в котором класс описан.
Java – полностью объектно-ориентированный язык, даже в большей степени, чем C++. Функции и переменные, не привязанные к контексту какого-либо объекта, больше не присутствуют в системе. Примером есть функция main и объект приложения app, которые в Java приложении отнесены к создаваемому классу приложения. В MFC приложении отсутствует функция main (WinMain спрятана в MFC каркасе) и объект приложения создается как глобальная переменная.
Полностью исключена препроцессорная обработка. Операция включения в программу файлов-заголовков с описаниями классов (include) заменена на операцию import, которая читает подготовленные бинарные файлы с описанием классов. Для поддержки пользовательских интерфейсов язык Java содержит библиотеки AWT и Swing, позволяющие создавать и поддерживать окна, использовать элементы управления (кнопки, меню, полосы прокрутки и др.), применять инструменты для создания графических приложений.
В Java отсутствуют указатели, хотя все переменные объектного типа являются ссылками. Создаются такие переменные динамически – через оператор New. При этом исчезла необходимость явно управлять памятью вызовами функции free или оператором delete, поскольку в систему встроен автоматический «сборщик мусора». Он освобождает память, на которую больше нет ссылок.
Оконное приложение с обработкой событий
Теперь создадим форму для подсчета ворон на заборе. Для этого будем отображать текущее количество ворон и с помощью двух кнопок добавлять или вычитать по одной.
Вначале создадим метку (countLabel) а также две командные кнопки (addCrow и removeCrow) и разместим компоненты в окне:
Посмотрите, как выполнялась аналогичная задача в MFC приложении. Существенное отличие лишь в том, как созданные в окне компоненты удаляются. В MFC приложении они удаляются в деструкторе оператором delete. В Java приложении память, на которую больше нет ссылок, освобождается автоматически «сборщиком мусора».
Добавление событий
Пришло время добавить немного интерактивности. Нам нужно сделать 3 вещи:
Исходный код программы приводится ниже.
В MFC приложениях события идентифицировались именем константы в таблице-макросе, отнесенной к классу. Такое описание не имело ничего общего с ООП.
В Java для определения события используются три действующих лица – объект-источник события, объект-слушатель события и объект-событие.
Мы создаем сначала кнопку (объект-источник). При вызове метода addActionListener создается объект класса ActionListener (слушатель). При вызове обработчика события (метод actionPerformed) создается объект класса ActionEvent (событие), в котором объединены параметры события.
Объекты – источники событий должны быть объектами класса, который имеет методы для регистрации слушателя addXXXListener и отключения слушателя removeXXXListener. Здесь под XXX подразумевается некоторое имя события. Например, ActionListener или AWTEventListener, и т.д.
Один из подходов добавления событий состоит в том, чтобы создать для каждого компонента внутренний анонимный (без имени) класс непосредственно в методе addActionListener. Описание класса состоит только из определения метода actionPerformed. Синтаксис может показаться вам немного неуклюжим, но запомните его, в дальнейшем привыкните.
Создание картинки в окне
Для создания картинки необходимо в класс окна добавить панель – элемент класса, производный от класса Jpanel. Объектами на панели могут быть подгружаемые картинки, либо рисунки, выполненные инструментами Java 2D API.
Исходный код программы приводится ниже.
Анимация изображения
Анимация представляет отображение последовательности изображений, которые создают иллюзию движения. В рассматриваемой ниже программе реализуется анимация звезды в окне.
Исходный код программы приводится ниже. Файл рисунка «star.png» размещается в директории, где находятся файлы классов проекта.
В классе Board используется интерфейс ActionListener, реализованный в подключаемом библиотечном классе javax.swing.Timer. С помощью интерфейса к объекту класса Board (источнику события) подключается объект «таймер» (слушатель события). Функция actionPerformed (обработчик события) вызывается через каждые 25 мс. Промежуток времени устанавливается при создании объекта timer.
В этом приложении продемонстрировано подключение события непосредственно к классу, а не к объектам. Подключение событий к объектам было показано выше (см. Оконное приложение с обработкой событий).
Дополнительно к рассмотренной реализации класса Board ниже приводятся две альтернативные версии.
Board.java (2-я версия)
Board.java (3-я версия)
Анимация объектов с помощью потока (Thread) — самый точный способ анимации. Он реализуется через интерфейс Runnable. В предыдущих примерах мы выполнили задачу через определенные промежутки времени. В этом примере анимация будет проходить внутри потока.
Метод addNotify () вызывается после того, как панель была добавлена в JFrame компонент — add(new Board()). Этот метод часто используется для различных задач инициализации.
Метод run () вызывается только один раз — после создания объекта animator, при его запуске: animator.start(). Из этого метода в бесконечном цикле while вызываются методы cycle () и repaint (). Время выполнения этих методов может быть различным в каждом из while циклов. А мы хотим, чтобы анимация проходила на постоянной скорости. Поэтому вычисляем разницу timeDiff системного времени до и после запуска обоих методов. Эту разницу вычитаем из константы DELAY (50 мс), корректируя тем самым необходимую задержку (sleep) выполнения потока.
Ошибки, возникшие в программе во время её работы обрабатываются через исключения. Обработка исключений произведена в программе с помощью операторов try…catch.
Игровое приложение ”Snake”
Snake (Змея) – одна из старейших классических видеоигр. В этой игре голова змеи перемещается с помощью клавиш управления курсором, хвост следует за ней.
Цель состоит в том, чтобы съесть столько яблок, как это возможно. Первоначально тело змеи состоит из 2-х суставов. Каждый раз, когда змея ест яблоко, ее тело растет. Змея должна избегать стен и своего собственного тела, поскольку в этом случае игра заканчивается.
Исходный код программы приводится ниже. Файлы рисунка «1.png» и «2.png» размещается в директории, где находятся файлы классов проекта. Анимация реализуется через рассмотренный выше способ использования таймера (см. Анимация изображения).
Контрольные задания
Ознакомиться с программой “Snake” и последовательно модифицировать ее:
Сетевые приложения
Краткий обзор сетевых приложений
Ниже, на 3-х сетевых Java приложениях рассмотрено, как можно написать программы без знания всей глубины сетевых технологий (ресурсы операционной системы, маршрутизация между сетями, поиск адресов, физическая среда передачи и т.д.). Но все же вкратце рекомендуется ознакомиться с теоретическими основами разработки сетевых приложений на Java.
В приложениях используется клиент-серверная парадигма, которую примерно можно определить следующим образом:
Каждое из приложений демонстрирует решение определенной задачи:
– Приложение “A Date Server and Client” обеспечивает простую одностороннюю связь. Сервер отправляет данные только одному подключенному клиенту.
– Приложение “A capitalize server and client” демонстрирует двустороннюю связь сервера с множеством подключенных к нему клиентов.
– Игра для двух игроков “Крестики-нолики” показывает работу сервера, который должен следить за состоянием игры и информировать клиентов, чтобы каждый мог обновить свои данные в соответствии с изменениями у другого клиента. Т.е., сервер выступает в качестве посредника при общении 2-х клиентов между собой.
Приложение “Date Server and Client” с одним клиентом
Приложение состоит из 2-х программ, одна выполняется на стороне сервера, другая – на стороне клиента. При последовательном запуске программ в окне консоли появляется сообщение об активизации сервера и клиента.
Перед очередным запуском программ не забывайте закрывать программы, которые остались открытыми ( running… ) от предыдущих запусков (см. нижнюю строку окна «Output»).
При запуске программы-клиента также появляется окно “Input”. После ввода в текстовое окно IP-адреса сервера (localhost) появляется окно “Message” с данными от сервера (текущая дата и время).
Исходный код программы-сервера (файл DateServer.java):
Программа-сервер постоянно находится в состоянии ожидания, она прослушивает (listen) сеть, ожидая запросов от клиентов. Программа содержит класс DateServer с единственным методом main. Причем, этот метод объявляется так, что он может выбросить исключение (throws IOException).
В программе создаются сокеты. Сокет представляет собой программную конструкцию (объект), которая определяет конечную точку соединения. Вначале создается объект класса ServerSocket, затем — в бесконечном цикле ожидания while (true) объект класса Socket. Главное отличие ServerSocket от Socket, что объект первого класса (listener) заставляет программу ждать подключений. При подключении метод listener.accept() создает объект socket.
Затем создается объект out класса PrintWriter для вывода текста в поток. В параметрах конструктора указывается направление потока socket.getOutputStream() (выходной поток сокета) и задается автоматический сброс буфера (параметр autoFlush = true). Метод out.println (“текст”) обеспечивает запись текста в поток.
В бесконечном цикле while (true) можно передавать данные множеству подключаемых клиентов, если закомментировать break. Однако, при этом не предусмотрено закрытие объекта listener, оно возможно лишь через диспетчер задач (вызывается клавишами ctrl-alt-delete).
Исходный код программы-клиента (файл DateClient.java):
Вначале запускается dialog box с предложением ввести IP address сервера, затем клиент присоединяется к серверу (создается сокет s) и тот передает ему дату и время, которые отображаются в диалоговом окне.
Для получения данных от сервера открывается входной поток s.getInputStream(). А далее цепочка читателей: InputStreamReader читает байты из потока и преобразует их в символы; BufferedReader объединяет символы в строку. Строка отображается в диалоговом окне.
Приложение “Capitalization Server and Client” с несколькими клиентами
Это приложение, как и предыдущее, состоит из 2-х программ, одна выполняется на стороне сервера, другая – на стороне клиента. При последовательном запуске программ в окне консоли появляется сообщение об активизации сервера и клиента.
Сервер позволяет подключаться нескольким клиентам.
Когда один из клиентов посылает строку, содержащую точку «.», программа прекращает цикл и закрывается.
Исходный код программы-сервера и программы-клиента приводится ниже.
Программа-сервер (файл CapitalizeServer.java):
При соединении с клиентом объект socket передается на обслуживание создаваемого при этом побочного потока, а объект serversocket возвращается к прослушиванию других клиентов. При соединении с другим клиентом создается новый поток. Программа-сервер хранит номера клиентов, чтобы обрабатывать сообщения каждого потока.
В классе Capitalizer (производном от Thread) с интерфейсом Runnable определены все методы, необходимые для создания потоков. В рамках класса необходимо определить метод run. Он получает управление при запуске потока методом start.
В отличие от предыдущей программы в этой организовано два бесконечных цикла. Один работает в пределах главного потока, другой запускается в каждом побочном потоке при подключении новых клиентов.
Программа-клиент (файл CapitalizeClient.java):
Игра для двух игроков “Крестики-нолики”
Приложение «Tic Tac Toe game» (игра «Крестики-нолики») состоит из 2-х программ, одна выполняется на стороне сервера, другая – на стороне клиента. При последовательном запуске программ в окне консоли появляются сообщения об активизации сервера и клиента.
При запуске программы-клиента также появляется окно “Player X”, при повторном ее запуске – окно “ Player O”. Дальнейшее развитие и окончание игры видно из рисунка.
Исходный код программы-сервера и программы-клиента приводится ниже. Рисунки и размещается в директории, где находятся файлы классов проекта программы-клиента.
Программа-сервер (файл TicTacToeServer.java):
В функции main программы-сервера (файл TicTacToeServer.java) создается объект listener и запускается бесконечный цикл.
В начале цикла создается объект класса Game. В этом классе описаны данные и методы, которые позволяют следить за состоянием игры и информировать клиентов, чтобы каждый мог обновить свои данные в соответствии с изменениями у другого клиента. В классе Game также описан встроенный класс Player, производный от класса Thread.
Далее в цикле объект listener прослушивает и подключает 2-х игроков-клиентов. Каждый из игроков (player) передается на обслуживание побочных потоков, а в конструкторе создаются сокет, потоки ввода-вывода и клиентам передаются приветствие и метка (mark) – X или O. Метка служит для идентификации клиента.
Далее потоки переходят в состояние “ Running” запуском (через start) метода run(), который определен в классе Player. В методе run() клиенту с меткой X передается сообщение начать игру («MESSAGE Your move»).
Затем организован собственный бесконечный цикл внутри потока. Здесь происходит обработка данных. От клиента (текущего игрока) поступает номер указанного мышкой квадратика, он сохраняется в переменной location. Методы класса Game по значению этой переменной и наполненности игровой доски определяют текущее состояние игры. Наполненность доски фиксируется в массиве board ссылками на игроков, которые заполнили соответствующие квадраты. Заполняется доска в методе legalMove. В соответствии с текущим состоянием игры передаются сообщения клиентам.
Метод legalMove определен с ключевым словом synchronized. Такой метод запрещает нескольким потокам одновременный доступ к нему. Прежде, чем начать выполнять его, поток пытается заблокировать объект, у которого вызывается метод. При завершении исполнения (как успешном, так и в случае ошибок) производится операция unlock, чтобы освободить объект для других потоков.
Метод legalMove вызывается в потоке игрока, который пытается сделать ход и проверяет, или ход является правильным. То есть, игрок выполняющий ход, должен быть текущим игроком и квадрат, в котором он пытается сделать ход, не должен быть уже занятым. Если ход правильный, состояние игры обновляется (квадрат заполнен, следующий игрок становится текущим, и он уведомляется о своем ходе).
Программа-клиент (файл TicTacToeClient.java):
В функции main программы-клиента запускается бесконечный цикл. В нем создается объект client класса TicTacToeClient. При этом конструктор устанавливает связь с сервером, создает сокет, потоки ввода-вывода, панель с массивом квадратных ячеек board[i]. Объекту каждой ячейки добавляется событие mousePressed, при котором через поток вывода серверу передается номер выбранной ячейки.
При вызове метода client.play() от сервера поступает сообщение о начале игры и метка (X или O), присвоенная игроку. Затем создается внутренний бесконечный цикл. Здесь происходит обработка сообщений сервера, полученных в ответ на выполненный ход (указание мышкой квадратика).
Контрольные задания
С программным кодом выполнения последнего задания можете ознакомиться по ссылке (Snake_net). Разработал приложение студент специальности «Компьютерные науки и информационные технологии» Лаврентий Антон.