Java — JavaРазрабМорской бойСравнение инф в многомерных массивах


Содержание

Руководство пользователя

Программа “Морской бой” обладает доступным, интуитивно понятным интерфейсом, который позволит пользоваться данным приложением неопытным пользователям.

На игровой площадке размером 10 на 10 клеток Игрок расставляет один корабль размером четыре клетки, два корабля размером три клетки, три корабля размером две клетки и четыре корабля размером в одну клетку (для облегчения корабли расставляются автоматически). При этом корабль представляет собой последовательность соседних клеток, стоящих на одной вертикали или на одной горизонтали. Соседние корабли не должны иметь общих точек. Противником Игрока является Компьютер, который автоматически расставляет корабли на своем поле по указанным выше правилам.

После расстановки начинается бой. Он представляет собой поочередные выстрелы Игрока и Компьютера. При попадании в корабль противника участник боя получает возможность проведения внеочередного выстрела. Игра заканчивается при уничтожении одним из участников всех кораблей противника.

Чтобы начать игру заново, необходимо нажать кнопку «Новая», расположенную в меню, в верхнем левом углу окна. Здесь же кнопка “Выход”.

ЗАКЛЮЧЕНИЕ

алгоритм игра java пользователь

В ходе выполнения курсовой работы были изучены основы программирования на языке Java. Написание программы способствовало закреплению теоретического материала на практике.

Используя среду программирования NetBeans IDE 7.3, мною было создано Java-приложение, реализующее игру “Морской бой”, с помощью данной программы пользователь может насладиться игрой в режиме пользователь — компьютер.

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

1. Дейтел, Х.М. Как программировать на Java [учеб. пособие] / Х.М. Дейтел, П.Дж. Дейтел ; пер. с англ. под ред. В.В. Тимофеева. -М. : Бином-Пресс, 2006. — 663 с.

2. Семочкин, А.Н. Язык программирования Java : учеб.пособие для вузов / А.Н. Семочкин ; М-во образования и науки РФ, Федеральное агентство по образованию [и др.]. — 2-е изд., перераб. И доп. — Благовещенск : Изд-во БГПУ, 2009. — 89 с.

3. Монахов, В.В. Язык программирования Java и среда NetBeans : [учеб. пособие] / В.В. Монахов. — 3-еизд., перераб. и доп. — СПб. : БХВ-Петербург, 2011. — 703 с.

Pro Java

Страницы

18 мая 2015 г.

Массивы. Часть 3 – многомерные массивы.

В Java многомерные массивы представляют собой массивы массивов .

При объявлении переменной многомерного массива для указания каждого дополнительного индекса используют отдельный набор квадратных скобок. Например, следующий код объявляет переменную двумерного массива twoD.

Этот оператор распределяет память для массива размерностью 4×5 и присваивает ссылку на него переменной twoD. Внутренне эта матрица реализована как массив массивов значений типа int. С точки зрения логической организации этот массив будет выглядеть так:

Это мы рассмотрели логическую организацию двумерного массива. Физическая же, или то, как распределяется память под массив несколько другая. Поэтому, прежде чем приступить к работе с многомерными массивами, нужно понять несколько дополнительных деталей.

Допустим, вы хотите представить таблицу умножения в виде многомерного массива:

Каждая пара квадратных скобок представляет одно измерение, поэтому данный массив является двухмерным. Чтобы получить доступ к одиночному элементу int двухмерного массива, нужно указать два значения индекса, по одному для каждого измерения. Если допустить, что данный массив был задан как таблица умножения, то значение int, находящееся в любом элементе, есть произведение этих индексов. Таким образом, значение products[2][4] равно 8, а значением products[3][7] будет 21.

Новый многомерный массив создается при помощи ключевого слова new с указанием размеров обоих измерений массива. Например:

int [][] multiplicationTable = new int [ 10 ][ 10 ] ;

В некоторых языках такой массив создается в виде единого блока из 100 значений int. Java поступает иначе. Эта строка кода выполняет три действия:

  • Объявляет переменную с именем multiplicationTable, которая содержит ссылку на массив ссылок, которые в свою очередь будут указывать на массивы int.
  • Создает массив из 10 элементов (первый индекс), который будет содержать ссылки на 10 одномерных массивов int. Вот от сюда собственно и понятие – массив массивов.
    На этой стадии создания массив ссылок заполняется значениями по умолчанию, то есть значениями null.
  • Создает еще 10 массивов, каждый из которых в свою очередь является массивом из 10 элементов int. Присваивает ссылки на каждый из этих 10 новых массивов элементам массива, созданного на втором шаге. По умолчанию каждый элемент int каждого из этих 10 новых массивов получает значение 0.

Другими словами, представленную выше строку кода, можно записать так:

int [][] multiplicationTable = new int [ 10 ][] ; // первый индекс содержит ссылки на массивы int
for ( int i = 0 ; i 10 ; i ++ )
multiplicationTable [ i ] = new int [ 10 ] ; // создаем 10 массивов int

Графически это можно изобразить так:

Очень важно понять, что каждый из массивов с элементами int, располагаются в памяти непрерывным куском, но где и как расположены каждый из них это определяет виртуальная машина java. Исходя из этого есть рекомендация, что наружные (левые) размерности массива лучше делать меньше, а самые больше размерности внутри (правее), поскольку это, во-первых, уменьшит фрагментацию памяти, а во вторых потребует гораздо меньше памяти для размещения массива. Возьмем к примеру вот такие два определения двумерных массивов:

В случае массива a, количество порождаемых в памяти объектов равно 11, а в случае массива b – 1001. Создание и обслуживание каждого объекта в памяти виртуальной машины имеет свои накладные расходы, так как виртуальная машина считает ссылки для каждого объекта, хранит его атрибуты и т.д. и т.п. Таким образом массив b может занимать в памяти в полтора, а то и в два раза больше места чем массив a.

Чтобы все еще стало понятней, лучше немного попрактиковаться

Данная программа генерирует следующий вывод:

По существу шаги 1 и 2 выполняются в 9 строке программы.

Строки 12-15 лишь выводят значения элементов первого индекса массива, где содержаться указатели на массивы значений int. Но на данный момент там еще значения null, так как им еще не были присвоены ссылки на массивы со значениями int.

После создания массивов int (строки 18-21), на третьем шаге мы видим что теперь в первом индексе, то есть в массиве содержащем ссылки на массивы int уже находятся ссылки на эти массивы.

И теперь если обратиться по обоим индексам массива multiplicationTable, то мы увидим что массивы int были заполнены значениями по умолчанию для данного типа, то есть нулями.

Ключевое слово new автоматически выполняет инициализацию элементов массива значениями по умолчанию.

Ну и затем мы просто присвоили значения каждому элементу массива, которое соответствует результату умножения индексов данного элемента и выводим их на консоль. Это можно сделать и более красиво отформатировав вывод, но это мы пока еще не изучали, поэтому вернемся к этому вопросу чуть позже.

При работе с многомерными массивами в Java очень важно понять, что первые индексы многомерных массивов содержат только массивы ссылок, и только последний (самый правый) индекс содержит непосредственно элемент данных типа объявленного для массива .

То есть в Java можно объявить и более чем двумерные массивы. Например:

И тут очень важно понимать, что первый индекс данного массива, содержит массив ссылок, на второй индекс данного массива, который в свою очередь тоже содержит массив ссылок на массивы значений int.

То есть если в данном случае мы попробуем вывести на консоль значение int[1][1], то мы получим адрес ссылки, то есть примерно то же, что и на шаге 3 в предыдущем примере. И только по полному индексу int[1][1][1] мы сможем получить значение элемента массива типа int.

Если так же рассмотреть предыдущий пример, то код приведенный ниже вызовет ошибку компиляции:

int [][] multiplicationTable = new int [ 10 ][] ;
multiplicationTable [ 0 ] = 10 ; // ошибка компиляции

Не смотря на то что 10 является значением int, данный код не будет скомпилирован и будет выдана ошибка: cannot convert from int to int[]. Это произошло потому, что ожидается, что данный элемент массива будет хранить ссылку на объект, а не сам объект. Строка 12 в следующем примере, как раз и демонстрирует этот момент, как сделать чтобы не было ошибки.

В тоже время нижеприведенный код не вызовет ошибки компиляции, но вызовет ошибку во время исполнения: NullPointerException.

int [][] multiplicationTable = new int [ 10 ][] ;
multiplicationTable [ 0 ][ 0 ] = 10 ; // ошибка во время исполнения

Это происходит потому, что не был создан объект, в данном случае массив int-ов. То есть мы создали массив хранящий ссылки, на массивы int-ов, но сами эти массивы мы еще не создали, поэтому обращение к несуществующему объекту вызывает данную ошибку. Строка 19 из предыдущего примера, как раз показывает пример правильного создания объектов (массивов), на которые ссылается первый индекс. Ключевое слово new, так же служит и для создания и инициализации вложенных массивов.

В последнем примере, мы создали массив ссылок, но не создали массив int-ов, поэтому к нему и не возможно обратиться. Это можно исправить следующим кодом:

int [][] multiplicationTable = new int [ 10 ][] ;
multiplicationTable [ 0 ] = new int [ 10 ] ;
multiplicationTable [ 0 ][ 0 ] = 10 ; // нет ошибки

Все правила создания массивов, которые мы рассматривали ранее, справедливы и для много мерных массивов, то есть должны присутствовать все стадии: объявление, создание и инициализация.

Как уже упоминалось в Java можно создавать массивы любой размерности:

float [][][] globalTemperatureData = new float [ 360 ][ 180 ][ 100 ] ;

Если вы создаете многомерные массивы, вам необязательно указывать все измерения массива – важно задать только крайнее слева измерение или измерения . Например, разрешены такие строки:

float [][][] globalTemperatureData = new float [ 360 ][][] ;
float [][][] globalTemperatureData = new float [ 360 ][ 180 ][] ;

Но такие варианты ошибочны:

float [][][] globalTemperatureData = new float [ 360 ][][ 100 ] ; // Ошибка!
float [][][] globalTemperatureData = new float [][ 180 ][ 100 ] ; // Ошибка!

Еще раз напомню, что очень важно понять, что первые индексы (измерения) массивов содержат только ссылки, и не могут содержать объекты объявленного для массива типа, их содержит только крайнее левое измерение (индекс).

Подобно одномерным массивам, многомерные массивы можно инициализировать при помощи массива-литерала. Нужно просто вложить массивы в другие массивы, применяя множество вложенных фигурных скобок. Пример ниже создает массив products[5][5]:

Напомню, что такой синтаксис инициализации, можно использовать только при объявлении массива или при использовании анонимного массива, то есть массива без имени:

Поскольку в Java многомерные массивы реализуются как массивы массивов, вы можете использовать не только прямоугольные массвы. Например:

Приведу еще одни пример небольшой магии с массивами в Java, чтобы углубить понимание данной темы.

Данная программа генерирует следующий вывод:

В строке 9 мы создаем и инициализируем одномерный массив. В 11 строке создаем двумерный массив. В 12 строке происходит магия. Если вы внимательно читали, все что было написано до сих пор то должны разобраться что произошло.

Поскольку, как я уже говорил, первые индексы многомерных массивов содержат ссылки на массивы, то в данном случае мы туда присвоили ссылку на одномерный массив oneD.

Если ли же что-то не понятно, то изучайте вывод данной программы, если вообще не понятно пишите комментарии к статье.

А пока добавлю еще немножко магии к предыдущей программе

Тут я добавил в строках 20 и 21 поясняющий вывод, что же сталось с массивами и как они выглядят после операции в строке 17.

Кроме этого были добавлены строки создания массива int-ов, для второго индекса массива twoD, то есть для индекса 1, а так же заполнения его значениями. Это строки 23-25.

Далее, строка 26, просто вывод массива twoD на консоль.

В 27 строке небольшая магия, мы присвоили ссылку на массив int-ов, которые только что создали в массиве twoD, массиву oneD.

Затем вывели содержимое массива oneD на консоль. И уже после этого адреса ссылок на массивы.

Цель этой программы продемонстрировать работу с массивами, и самое главное, понять разницу между объектом, в данном случае массивом, и ссылкой на объект.

Теперь наша программа генерирует следующий вывод:

А теперь поколдуем немножко с не прямоугольными массивами, дабы понять тему многомерных массивов в Java еще глубже.

Это пример работы с треугольным или ступенчатым массивом. На самом деле массивы int-ов могут быть произвольной длинны.

В 16 строке мы воспользовались стандартной библиотечным методом (Arrays.deepToString) SDK для вывода многомерных массивов на консоль, но как видно из вывода, данный метод выводит любой многомерный массив в строку, разделяя его размерности квадратными скобкам, что не очень наглядно.

Затем в цикле (строки 18-23) мы выводим треугольный массив более наглядным образом.

Следующий пример чуть интересней, будем превращать прямоугольный массив в треугольный.

В данной программе мы изначально имеем три массива: один одномерный и два двумерных, но с разным количеством элементов в строках – 2 и 3 соответственно.

Цукерберг рекомендует:  Аналитик больших данных пробуем на практике

Как видно на примере вывода данной программы справа, сперва мы выводим все три массива в их изначальном состоянии.

В строках 31 и 32 мы колдуем с массивом three и затем выводим результат нашего шаманства на консоль.

В результате, как-бы, получаем честный треугольный массив.

Как-бы, это потому, что на самом деле последние два индекса ссылаются массивы two и one.

А честный он потому, что нам придется с ним работать уже как с треугольным, так как, например, после магии мы уже не сможем обратиться к индексу three[2][2], поскольку получим ошибку во время исполнения программы ArrayIndexOutOfBoundsException. А как-бы он потому, что работая с индексами three[1] и three[2] мы на самом деле будем работать с массивами two и one соответственно.

Теперь рассмотрим простенький пример трехмерного массива. Следующая программа создает трехмерный массив размерности 3×4×5. Затем она инициализирует каждый элемент произведением его индексов и выводит все это дело на консоль.

Данная программа генерирует следующий вывод:

Вот такое у нас 3D

Ну и в завершение данного поста приведу программу сортировки двумерного массива пузырьком.


Первый алгоритм, это классика жанра, сортировка обычным пузырьком, второй алгоритм я написал забавы ради, что-бы показать как модифицированный алгоритм может повлиять на производительность и скорость вычислений.

Данная программа может принимать аргументы из командной строки и создавать двумерные массивы заданной размерности. Если аргументы не переданы то создается массив 10х10. Затем он заполняется случайными числами, копируется в массив который будет отсортирован первым алгоритмом, сортируется, выводится на консоль, затем несортированный снова копируется для сортировки, сортируется вторым алгоритмом и выводится на консоль.

Данная программа может сгенерировать следующие выводы:

Тут приведены примеры запусков без аргументов и с аргументами из командной строки.

Как видите разница между количеством итераций и перестановок в алгоритмах различается от двух и более раз.

Естественно при каждом запуске у данной программы будет разный вывод, так как числа хоть и псевдослучайные, но все же случайные.

Объяснять отличие работы второго алгоритма немного ленно. Постарайтесь разобраться сами.

Если не получится и если сильно интересно, пишите вопросы в комментариях, дабы мне не тратить понапрасну время на объяснения тут.

В следующем посте разберем некоторые методы работы с массивами из стандартной библиотеки.

Java — Java/Разраб/Морской бой/Сравнение инф в многомерных массивах

В уроке 10 мы научились создавать одномерные массивы. Подобным образом в Java можно создать двумерный, трехмерный, четырехмерный… иначе говоря, многомерные массивы. Многомерный массив в Java по сути является массивом из массивов.

Популярным примером использования такого рода массивов, являются матрицы, для представления которых, используются двумерные массивы. Итак, что же такое матрица и как ее представить с помощью двумерного массива в Java.

Матрицы и двумерные массивы в Java

Матрица это прямоугольная таблица, состоящая из строк и столбцов на пересечении которых находятся её элементы. Количество строк и столбцов матрицы задают ее размер.

Общий вид матрицы размером m x n ( m — количество строк, n — количество столбцов), выглядит следующим образом:

Каждый элемент матрицы имеет свой индекс, где первая цифра обозначает номер строки на которой находится элемент, а вторая — номер столбца.

Рассмотрим примеры конкретных матриц и создадим их с помощью Java.

Матрица A имеет размерность 2 на 3 (2 строки, 3 столбца). Создадим двухмерный массив этой размерности:

Мы объявили двумерный массив целых чисел (поскольку матрица в данном случае содержит целые числа) и зарезервировали для него память. Для этого мы использовали 2 индекса: первый индекс определяет строку и ее размер, второй индекс определяет столбец и его размер.

Далее будем инициализировать массив поэлементно. Запишем матрицу A в виде таблицы, чтобы было визуально понятно, какому индексу соответствует элемент.

Для доступа к элементам двумерного массива необходимо использовать 2 индекса: первый для строки, второй – для столбца. Как и в случае с одномерными массивами, индексы также начинаются с нуля. Поэтому нумерация строк и столбцов в таблице начинается с 0.

Для того, чтобы вывести матрицу на консоль, нужно пройти все элементы, используя два цикла. Количество циклов, при прохождении элементов массива, равно его размерности. В нашем случае первый цикл осуществляется по строкам, второй — по столбцам.

То есть, сначала выводим все элементы первой строки, отделяя их символом табуляции » \t», переносим строку и выводим все элементы второй строки.

Полностью код для матрицы А выглядит следующим образом:

Для матрицы B воспользуемся упрощенным способом инициализации — в момент объявления. По аналогии с одномерными массивами.

Каждую строку массива необходимо заключить в пару фигурных скобок и отделить друг от друга запятой.

Полностью код для матрицы B:

Рассмотрим инициализацию в цикле для двумерного массива на примере таблицы умножения.

Здесь инициализация элементов значениями таблицы умножения совмещена с их выводом на консоль в одном цикле.

Многомерные и несимметричные массивы.

Создаются многомерные массивы в Java аналогичным способом. Количество квадратных скобок указывает на размерность.
Примеры создания массивов фиксированной длины:

Однако, не обязательно изначально указывать размер на всех уровнях, можно указать размер только на первом уровне.

В данном случае, пока неизвестно сколько будет элементов в каждой строке, это можно определить позже, причем, массив может содержать в каждой строке разное количество элементов, то есть быть несимметричным. Определим количество элементов в каждой строке для массива a1

В результате, при выводе на экран,

массив будет иметь такой вид:

0
0 0
0 0 0
0 0 0 0
0 0 0 0 0

При создании массива его элементы автоматически инициализируются нулями, поэтому в это примере на экран выведены нули.

Повышение оригинальности

Предлагаем нашим посетителям воспользоваться бесплатным программным обеспечением «StudentHelp» , которое позволит вам всего за несколько минут, выполнить повышение оригинальности любого файла в формате MS Word. После такого повышения оригинальности, ваша работа легко пройдете проверку в системах антиплагиат вуз, antiplagiat.ru, РУКОНТЕКСТ, etxt.ru. Программа «StudentHelp» работает по уникальной технологии так, что на внешний вид, файл с повышенной оригинальностью не отличается от исходного.

Результат поиска


Реферат/Курсовая РАЗРАБОТКА ИГРЫ «МОРСКОЙ БОЙ» С AI
Тип работы: Реферат/Курсовая. Добавлен: 12.01.13. Год: 2012. Страниц: 37. Уникальность по antiplagiat.ru:


Министерство общего и профессионального образования
Российской Федерации
Государственное образовательное учреждение высшего профессионального образования
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ
МЕХАНИКИ И ОПТИКИ

ФАКУЛЬТЕТ СРЕДНЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

на тему: РАЗРАБОТКА ИГРЫ «МОРСКОЙ БОЙ» С AI

По дисциплине «Технология Разработки Программных Продуктов»

Специальность «Программное обеспечение вычислительной техники и автоматизированных систем» (230105)

    Преподаватель: «___»_________20__г. Выполнил: Индыков Максим Игоревич
    гр. 323 дневного отделения

АННОТАЦИЯ
Цель работы — создать игру «морской бой» с противником, обладающим искусственным интеллектом, запускаемую на ОС Android 2.2.
При разработке была поставлена задача создать противника совершающего логичные действия и стремящегося выиграть.
Выбор данной ОС обусловлен её актуальностью и доступностью инструментов для разработки. Разработка велась на языке программирования Java с использованием инструментария разработчика. Результатом разработки стал программный продукт, функционирующий на указанном в отчёте оборудовании и обладающий возможностью для улучшения и модификации.

СОДЕРЖАНИЕ
ВВЕДЕНИЕ 4
1 ОПРЕДЕЛЕНИЕ ТРЕБОВАНИЙ 4
1.1 Описание бизнес процесса 4
1.2 Сравнение аналогов 5
1.3 Моделирование требований 6
1.4 Выбор модели жизненного цикла 7
2 ПРОЕКТИРОВАНИЕ 9
2.1 Выбор модели системы 9
2.2 Проектирование структуры системы 9
2.3 Проектирование логики работы 10
2.4 Проектирование интерфейса 13
3 РАЗРАБОТКА ПРОГРАММНОГО КОДА 15
4 ВЕРИФИКАЦИЯ И АТТЕСТАЦИЯ 16
4.1 Выбор методов верификации и аттестации 16
4.2 Инспектирование 16
4.3 Тестирование 17
5 ПРОГРАММНАЯ ДОКУМЕНТАЦИЯ 18
5.1 Инструкция по установке 18
5.2 Инструкция пользователя 18
ЗАКЛЮЧЕНИЕ 19
СПИСОК ИСТОЧНИКОВ ИНФОРМАЦИИ 20
ПРИЛОЖЕНИЕ A ТЕХНИЧЕСКОЕ ЗАДАНИЕ 21
1НАЗНАЧЕНИЕ РАЗРАБОТКИ 21
2 ЦЕЛЬ И ЗАДАЧИ 21
3 ТРЕБОВАНИЯ К РАЗРАБОТКЕ 21
3.1Требованияк функциональным характеристикам 21
3.2 Описание входных и выходных данных 22
3.3 Модель работы продукта разработки 23
3.4 Требования к надежности 25
3.5 Эргономические и техникоэстетические требования 25
3.6 Требования к защите информации 26
3.7 Другие требования к разработке 26
3.8 Требования к аппаратно- программному комплексу. 26
3.9 Требования к технологиям разработки 26
3.10 Требования к составу технических средств при эксплуатации. 26
4 МЕТОДЫ ТЕСТИРОВАНИЯ СООТВЕТСТВИЯ РАЗРАБОТКИ ПРЕДЪЯВЛЕННЫМ ТРЕБОВАНИЯМ 26
ПРИЛОЖЕНИЕ Б ПРОГРАММНЫЙ КОД 27

ВВЕДЕНИЕ
На данный период времени разработка является актуальной и имеет перспективы для улучшения. Актуальность темы разработки обусловлена малым количеством аналогов данного проекта представленных в данный период времени.
Данный документ содержит следующую информацию:

      в определении требований содержаться пункты, связанные с разработкой требований, сравнением аналогов, жизненным циклом, описанием технического задания;
      в проектировании содержатся пункты, описывающие архитектуру и логическое устройство программы;
      в разработке программного кода содержится краткий обзор разработанных функций;
      в верификации и аттестации описывается, как будет выполняться тестирование проекта;
      в программной документации содержатся такие подпункты как инструкция для пользователя и инструкция по установке.

1 ОПРЕДЕЛЕНИЕ ТРЕБОВАНИЙ
1.1 Описание бизнес процесса
Необходимо реализовать игру Морской бой между компьютером и человеком. Доказать то, что компьютер пытается выиграть.
Особенностью игры, будут являться более реалистичные правила игры (зона поражения для кораблей, шанс промахнуться), наличие различных видов кораблей с исторической справкой о них. Наличие системы повреждений корпуса. Бой должен вестись на общем для обоих игроков поле.
Игра проходит на поле размером 10 на 10 клеток.
На поле размещаются 10 кораблей (один 4-х палубный, два 3-х палубных, три 2-х палубных и один 1-палубный).
Корабли можно ставить вертикально или горизонтально, но нельзя ставить впритык друг к другу.
Различные корабли, имеют различный режим атаки и радиус.
Выстрелы делаются по-очереди. Если при выстреле произошло попадание в корабль, игроку предоставляется дополнительный выстрел.
Побеждает тот, кто первым потопит флот противника.
Так как на большинстве платформ уже имеется некоторое количество подобных проектов, разработка будет вестись для мобильных систем на базе ОС Android.

1.2 Сравнение аналогов
1.Морской бой на flash, официальный сайт:
http://www.flashzona.ru/ i3529
Подавляющее большинство всех подобных игр выпущено именно на этой платформе, однако, эта реализация неоптимальная для мобильных платформ.
2. Battle Ships, официальный сайт:
http://www. androidfreeware.net/download- battleships.html
Игра, разработка под Android 1.5.Не нужно ждать пока ваш противник сделает выстрел, вы просто делаете их подряд, наблюдая как ваш противник, ходит одновременно с вами. Что не очень привычно. Не нужно расставлять корабли вы просто выбираете одну из случайно предложенных расстановок кораблей. Так же автоматически закрываются ячейки, куда уже нельзя поставить корабли, что удобно для расчета спрятанных кораблей противника.
3. Sea Battle, официальный сайт:
http://android-apps.com/ featured/sea-battle/
Игра, разработка под Android. Предлагает пользователям два варианта игры, одиночный и мультиплеерный (bluetooth). Правила игры классические, но возможен выбор режима с уменьшенным количеством кораблей. Единственным недостатком игры являются слегка затянутые переходы между полями игроков, но это компенсируется заботливо продуманной разработчиками функцией сохранения.

Таблица 1 – Сравнение аналогов

Морской Бой на flash BattleShips

Sea Battle 1.03 Различные варианты игры — — + Игра по сети — — + Игра на мобильном телефоне +- + + Разработана специально для android — + +

В качестве прототипа для разработки проекта выбран Batttleship так как игра обладает похожим на заданный в проекте набором функций, что приведено в таблице 1.
1.3 Моделирование требований
Диаграмма IDEF0 построена для описания поведения приложения во время игры и определения последовательности действий во время игры. Данная последовательность определена правилами, описанными в п. 1.1.
Входными данными являются события созданные пользователем (такие как выбор пункта меню, выбор клетки).
За запуск игры отвечает виртуальная java-машина, т.к. она обеспечивает поддержку устройством приложений.
В конце хода или игры на основании определённых условий победы определяется результат.
Диаграмма Use Case представляет собой концептуальную модель системы и является основой для проектирования пользовательского интерфейса.
Блок «Регистрация» позволяет создать новый аккаунт для ведения статистики побед и поражений.
Блок «Начать бой» начинает игру с заданным набором кораблей.
«Выбрать стартовый набор кораблей» позволяет отойти от классических правил морского боя и определить своё собственное кол-во каждого вида корабля.
«Просмотр статистики» осуществляет вызов функции отвечающей за выборку данных для текущего аккаунта.

1.4 Выбор модели жизненного цикла
Таблица 2 – Сравнение моделей ЖЦ

Вид модели Качество данной модели
Каскадная +:Оптимальна, при максимальном выделении всех требований. -: Результат в самом конце разработки.
Прототипированная +Решение возникающих проблем на ранних стадиях. -: Малая вероятность, что будет сразу готов прототип системы.
Инкрементная +: Добавление функции с каждым инкрементом. -: Возможны ситуации, требующие добавления сразу нескольких взаимосвязанных функций.
На основе раннее созданных компонентов +: Снижает время разработки. -: Искажаются требования.
Спиральная +: Преимущества инкрементной и прототипированной модели. -: Усложнённая структура разработки.
V образная +: Обеспечивает максимальную надёжность. -: Невозможно изменение требований.

Из таблицы 2 видно, что наиболее подходящей моделью жизненного цикла является спиральная модель, так как в ходе проекта ожидается возможное изменение требований.

      Описание технического задания

Требования к функциональным характеристикам:
Главной функцией игры является игра с искусственным противником, поэтому необходимо реализовать выбор ИИ игроком клетки на основе логики.
Требования к надежности:
Так как ПО разрабатывается для мобильного устройства, необходимо обеспечить стабильность работы программы, уделив внимание таким событиям как входящий вызов, сообщение, сворачивание программы.
Эргономические и техникоэстетические требования:
Так как приложение должно гармонично выглядеть внутри системы, разработку пользовательского интерфейса необходимо производить согласно рекомендациям разработчиков Android SDK.
Требования к защите информации:
Требования безопасности к приложению не предъявляются, однако, необходимо защитить исходные коды программы т.к. приложение поставляется в apk файле являющимся обычным архивом.
Другие требования к разработке:
Не предъявляются.
Требования к аппаратно-программному комплексу:
Приложение не является кросс-платформенным, необходимо обеспечить работу приложения на последней стабильной версии ОС.
Требования к технологиям разработки:
Необходимо использовать среду разработки, обеспечивающее удобное написание Java-кода и стабильную работы плагинов для разработки приложений.
Требования к составу технических средств при эксплуатации:
Приложение пишется для самой последней версии ОС, следовательно, для эксплуатации необходимо устройство, удовлетворяющее определённым требованиям.


2 ПРОЕКТИРОВАНИЕ
2.1 Выбор модели системы
Игра разрабатывается по модели локального приложения. Все компоненты приложения будут объединены в один файл, устанавливаемый на устройство. Приложения будет взаимодействовать с необходимыми уровнями ОС. Использовать встроенные компоненты по работе с БД Sqlite. Следуя идеологии разработки с использованием предложенных компонентов, в приложении используются компоненты, такие как виджеты ввода и вывода данных на экран и пр.
2.2 Проектирование структуры системы
Основным и главным компонентом приложения является класс, содержащий в себе функцию, создающую активный процесс. Данный компонент использует необходимые для работы компоненты, включенные в готовый установочный файл, либо предлагаемый ОС.

Рисунок 1.Диаграмма компонентов

Как показано на рисунке 1, главный компонент программы обращается к файлам с изображениями, файлу manifest, в котором описаны разрешения при работе программы. Статистика и аккаунты хранятся в базе данных Sqlite.

Рисунок 2. Диаграмма классов

Для работы с базой данных используется SQLite. Это возможно благодаря классу SQliteOpenHelper и собственному классу DbOpenHelper. Main класс, в соответствие с рисунком 2, содержит необходимые методы для работы приложения в данной среде, такие как onCreate и onClick.
2.3 Проектирование логики работы
Большую часть времени система находиться в ожидании действия пользователя. Ожидание хода противника занимается небольшое количество времени, однако, ход не происходит мгновенно.
Для осуществления противником хода используется неслучайный алгоритм выбора клетки. Алгоритм основан на предполагаемом размещении кораблей игрока. Искусственный противник не имеет сведений о расположении кораблей игрока, благодаря чему оппоненты находятся в относительно одинаковых условиях.
При запуске, система находится в состоянии отображения меню, из которого возможен выход и дальнейшая работа с программой, что видно на рисунке 3. Выбор “начать игру” переводит систему в состояние самой игры, которое включает в себя такие состояния как: отображение игрового поля, расстановка кораблей, ожидание действия пользователя и прочее.

Рисунок 3. Диаграмма состояний

Рисунок 4. Диаграмма Activity
2.4 Проектирование интерфейса
Меню программы, рисунок 5.

Рисунок 5. Меню программы


    Выбор способа расстановки в виде диалога, рисунок 6.

Рисунок 6. Диалог расстановки

Игровое поле, рисунок 7. На нём отображаются атаки противника.

Рисунок 7. Игровое поле

Окончание игры, рисунок 8. Поле победитель динамическое и изменяется.

Рисунок 8. Поле окончания игры
3 РАЗРАБОТКА ПРОГРАММНОГО КОДА
По ходу разработки программного кода были изучены такие такие программные средства как AndroidSDK,программирование на языке Java. Получен опыт разработки приложения для мобильных устройств.
В приложении, учитывая необходимость обеспечения максимальной производительности программы, были применены следующие меры:

    динамическая отрисовка игрового поля;
    многопоточность (в разных потоках выполняются функции расстановки кораблей и выполнения атаки ИИ противником).

4 ВЕРИФИКАЦИЯ И АТТЕСТАЦИЯ
4.1 Выбор методов верификации и аттестации
При разработке ПО применяются следующие методы:

      основной метод тестирование: “Тестирование Белого Ящика”. Подразумевает тестирование программы с доступными исходными текстами;
      при разработке пользовательского интерфейса применяется тестирование “Чёрного Ящика”, т.к. конечный пользователь не знает о внутреннем устройстве программы.

Так как ПО создаётся в новой для разработчика среде и необходимо следить, чтобы внесённые в новый модуль изменения не повлияли на работу остальных модулей, выполняется регрессионное тестирование.
4.2 Инспектирование
Требования к разработке:

    Требования к функциональным характеристикам.

Меню приложения: требования невозможно идентифицировать, так как нет доступа к файлу, в котором описывается данная функция.
Игра: требование описано в Communication Diagramm, пункты на диаграмме – 6 и 7.
Расстановка кораблей ИИ: требование описано в Activity Diagramm – расстановка кораблей компонента, проверка на правильность расстановки – проверить на возможность расстановки корабля.
Определение набора кораблей: требование описано в Use Сase Diagramm – выбрать стартовый набор кораблей.
Просмотр статистики и регистрация: требование описано в Class Diagram – создание пользователя, работа с БД, Communication Diagramm – пункты 4 и 5.

    Требования к надежности.

Возможность сворачивания и разворачивание приложения обеспечивается методом onResume и onPause. События ОС обрабатываются при постановке приложения на паузу. Невозможно проверить данное требование так оно не отражается в диаграммах.

    Эргономические и техникоэстетические требования.

Дизайн меню и элементов управления должен соответствовать дизайну ОС. Использовать объекты (виджеты), представленные в Android SDK. Не перегружать пользовательский интерфейс излишними элементами. Основное меню должно быть выдержано в тёмных тонах с фоновым изображением на морскую тематику. Игровое поле должно целиком помещаться на экране в вертикальном режиме отображения. Невозможно проверить данное требование так как к диаграммам оно не относиться.

    Требование к защите информации.

Готовое приложение упаковано в apk файл. Защита от реверс-инжинеринга обеспечивается встроенной в среду разработки программой ProGuard. Невозможно проверить данное требование, так как оно не отражается в диаграммах.

    Другие требования к разработке.

Реализовать алгоритм выбора клетки для атаки на основе уже выбранных клеток. Требование описано в ActivityDiagram – ИИ выбирает клетку

    Требования к аппаратно-программному комплексу.

Разработка ориентирована на Android 2.3.4 API Level: 10. Работа возможна на устройствах с различным типом экрана. Поддержка мультитача не требуется. Требование невозможно проверить, так как оно не отражается в диаграммах.

    Требования к технологиям разработки.

Разработка ведётся с использованием среды разработки Eclipse 3.6 (Helios), с установленным ADK плагином, JDK и Android SDK. Требование невозможно проверить, так как оно не отражается в диаграммах.

    Требования к составу технических средств при эксплуатации.

Устройство с поддержкой необходимой версии Android и удовлетворяющее описанным характеристикам. Требование невозможно проверить, так как оно не отражается в диаграммах.
Итог: При инспектировании работы были проверены требования в соответствии с техническим заданием. Проверить удалось не все требования, так как не все требования описывались в диаграммах. Те требования, что описывались в диаграммах, были выполнены качественно. Диаграммы полностью отображали работу системы на программном уровне.

4.3 Тестирование
При тестировании белым ящиком данные для теста выбирались с расчётом на рабочие функции программы.
При тестировании чёрным ящиком данные для входных параметров функций генерировались случайно и основываясь на правилах игры. Учитывая, что все функции, отвечающие за игру противника, основаны на генераторе псевдослучайных чисел, необходимо было проводить достаточное количество тестов.

5 ПРОГРАММНАЯ ДОКУМЕНТАЦИЯ
5.1 Инструкция по установке
Приложение поставляется в виде apk файла. Рекомендуемые системные требования: Android 2.2. Размер экрана не имеет значения т.к. приложение автоматически подстраивается под нужное разрешение. Для установки необходимо разрешить установку пакетов из сторонних источников.
5.2 Инструкция пользователя
При запуске на экране отображается главное меню с выбором между началом игры и выходом.
При начале новой игры возможен выбор между ручной и автоматической расстановкой кораблей (в данной версии возможно только автоматическая расстановка). Для атаки игрок должен нажать на выбранную клетку. Цвет клетки сообщает игроку о результате атаки. Зелёный — неоткрытая клетка, жёлтый — промах, красный-попадание.
Во время хода противника, игрок касается экрана в любой точке, после чего противник атакует. По окончании игры определяется победитель.


ЗАКЛЮЧЕНИЕ
На данный момент времени разработаны следующие компоненты программы:

    главное меню и финальный экран (описаны в xml-файле, следовательно, возможно их свободное редактирование в ходе дальнейшей разработки);
    классы отображения игровых полей и ситуации на поле (все игровые элементы представляют собой графические примитивы, обеспечивающие оптимизированное использование ресурсов устройства);
    классы, обеспечивающие игровые функции (выбор клетки, определение типа клетки, определение результата атаки);
    классы, обеспечивающие запуск и смену Activity, получения контекста устройства, установка связей между видами.

СПИСОК ИСТОЧНИКОВ ИНФОРМАЦИИ

    Голощапов А.Л. Google Android. Программирование для мобильных устройств (Профессиональное программирование), 2011.
    Android Developers, официальный сайт:
    http://developer.android.com/ sdk/index.html

ПРИЛОЖЕНИЕ A ТЕХНИЧЕСКОЕ ЗАДАНИЕ
1НАЗНАЧЕНИЕ РАЗРАБОТКИ
Приложение разрабатывается для дальнейшей продажи при помощи Android Market.
2 ЦЕЛЬ И ЗАДАЧИ
Целью разработки является получение прибыли с продаж продукта.
Для достижения данной цели необходимо наиболее качественно организовать игровой процесс и создать простой, но эффектный пользовательский интерфейс.
Создание документации к проекту (пункты Определение требований, Проектирование и Техническое задание) необходимо закончить к 20 мая 2011 года.
Разработку программного кода необходимо закончить к концу июля 2011года.
3 ТРЕБОВАНИЯ К РАЗРАБОТКЕ
3.1Требованияк функциональным характеристикам
Функции:

    Меню приложения.

Часть меню описывается в xml-файле, создание системных сообщений обеспечивается в коде программы. В меню используются стандартные объекты(кнопки, поля ввода).

    Игра.

Выполняет вызов функции создания игрового поля. Обеспечивает возможность выбора клеток для атаки. Отображает результат хода.
Расстановка кораблей основывается на исходном выборе набора кораблей до начала игры.
Игрок, нажимая на клетку, передаёт координаты, которые сравниваются с координатами расположения кораблей противника. При совпадении засчитывается попадание и начинается новый ход.

    Расстановка кораблей.

Корабли расставляются на поле случайным образом.
Ограничения: минимальное расстояние между кораблями – 1 клетка. Части кораблей не должны выходить за пределы игрового поля.

    Определение набора кораблей.

Обеспечивает возможность пользователю составить список кораблей, которые будут использованы в бою.
Каждый корабль имеет свою цену. Цена определяется длиной корабля.
4-х трубный – цена 5
3х трубный – цена 4
2-х трубный – цена 2
1-х трубный – цена 3
Всего дано 35 очков.
Дальнейшее количество определяется победами и поражениями. Победа прибавляет одно очко, поражение – вычитает. Верхний и нижний пределы: +-50. Готовая конфигурация сохраняется в файл.

    Просмотр статистики и регистрация.

Осуществляют запись и выборку данных.При регистрации создаётся отдельная запись с пустой статистикой. Имя аккаунта необходимо для записи в таблицу рекордов. Статистика выводится в виде таблицы: имя – очки.
3.2 Описание входных и выходных данных
Таблица 1 – Описания входных и выходных данных.

Функция Входные параметры Выходные параметры
Меню приложения Выбранный пункт Отображение результата выбора
Игра Конфигурация кораблей, текущий ход (Игрок или ИИ) Результат хода/игры
Расстановка кораблей ИИ противником Конфигурация кораблей Координаты
Определение набора кораблей Имя пользователя, кол-во очков Конфигурация кораблей
Просмотр статистики и регистрация Имя пользователя Выборка данных

Вся система принимает данные от пользователя, и выводит данные при помощи экрана и динамиков.

3.3 Модель работы продукта разработки

Рисунок 2. Диаграмма IDEF0

Рисунок 3. Диаграмма IDEF0

3.4 Требования к надежности
Возможность сворачивания и разворачивание приложения обеспечивается методом onResume и onPause. События ОС обрабатываются при постановке приложения на паузу.
3.5 Эргономические и техникоэстетические требования

Рисунок 4. Use Case диаграмма

Как видно из рисунка 4, при запуске игры пользователь может создать новый аккаунт или войти с существующим. В главном меню есть просмотр статистики побед и поражений и выбор новой игры. Можно редактировать набор кораблей, имеющих различный вид и радиус поражения. Бой начинается после расстановки кораблей.
Дизайн меню и элементов управления должен соответствовать дизайну ОС.
Использовать объекты (виджеты), представленные в AndroidSDK. Не перегружать пользовательский интерфейс излишними элементами.
Основное меню должно быть выдержано в тёмных тонах с фоновым изображением на морскую тематику.
Игровое поле должно целиком помещаться на экране в вертикальном режиме отображения.

3.6 Требования к защите информации
Готовое приложение упаковано в apk файл.
Защита от реверс-инжинеринга обеспечивается встроенной в среду разработки программой ProGuard.
3.7 Другие требования к разработке
Реализовать алгоритм выбора клетки для атаки на основе уже выбранных клеток.
3.8 Требования к аппаратно- программному комплексу.
Разработка ориентирована на Android 2.2API Level: 9.Работа возможна на устройствах с различным типом экрана. Поддержка мультитача не требуется.
3.9 Требования к технологиям разработки
Разработка ведётся с использованием среды разработки Eclipse 3.6 (Helios) с установленным ADK плагином, JDK и Android SDK.
3.10 Требования к составу технических средств при эксплуатации.
Устройство с поддержкой необходимой версии Android и удовлетворяющее описанным характеристикам.
4 МЕТОДЫ ТЕСТИРОВАНИЯ СООТВЕТСТВИЯ РАЗРАБОТКИ ПРЕДЪЯВЛЕННЫМ ТРЕБОВАНИЯМ
Контроль качества продукта должен быть проведён на завершающей стадии разработки, когда будет реализованы все заявленные функции. Тестирование будет проводиться путём многократного использования приложения.

ПРИЛОЖЕНИЕ Б ПРОГРАММНЫЙ КОД
Battle.java
package ru.ship.game;
import java.util.Random;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
public class Battle extends Activity <
private static final String TAG = «BattleShip»;
public static final int HERE_SHIP_1=1;//здесь есть 1 корабль
public static final int HERE_SHIP_2=2;//здесь есть 2 корабль
public static final int HERE_SHIP_3=3;//здесь есть 3 корабль
public static final int HERE_SHIP_4=4;//здесь есть 4 корабль
public static final int HERE_NO_CHOOSE=5;//здесь уже ничего быть не может
public static final int BOMB_HERE=6;//клетка атакована
public static final int SHIP_ON_FIRE=7;
private int ships_count=0;
public static int[][] field_gamer=new int[11][11];//поля игрока и оппонента
public static int[][] field_opp=new int[11][11];
public static boolean comm_attack=true;
public static final int >
public static final int >
int opp=GameStats.total_ships_opp_ count;
protected void onCreate(Bundle savedInstanceState) <
super.onCreate( savedInstanceState);
new Thread(new Runnable() >). start();
Intent intent=new Intent();
intent.setClass( getApplicationContext(), GamerRound.class);
Intent intent_opp=new Intent();
intent_opp.setClass( getApplicationContext(), OppRound.class);
Intent finIntent=new Intent();
finIntent. setClass( getApplicationContext(), FinishSplash.class);
startActivity (finIntent);
opp=4;
do <
startActivity (intent_opp);
startActivity (intent);
opp-=1;
>while(opp== 0); >
@Override
protected void onResume() <
super. onResume();
opp= GameStats.total_ships_opp_ count; >
@Override
protected void onSaveInstanceState(Bundle savedInstanseState) <
super. onSaveInstanceState( savedInstanseState);
// savedInstanseState.putInt(key, value); >
public static int attack(int selX, int selY,int field_gamer[][]) <
if(field_gamer[selX][selY]> HERE_NO_CHOOSE) return -1;//не важно
if(field_ gamer[selX][selY]==0 || field_gamer[selX][selY]==HERE_ NO_CHOOSE) field_gamer[selX][selY]=BOMB_ HERE; return 0; >
if(field_ gamer[selX][selY]
if(field_ gamer[selX][selY]==HERE_SHIP_ 1) field_gamer[ selX][selY]=SHIP_ON_FIRE;
field_gamer[ selX+1][selY-1]=BOMB_HERE;
field_gamer[ selX+1][selY]=BOMB_HERE;
field_gamer[ selX+1][selY-1]=BOMB_HERE;
field_gamer[ selX][selY-1]=BOMB_HERE;
field_gamer[ selX][selY+1]=BOMB_HERE;
field_gamer[ selX-1][selY-1]=BOMB_HERE;
field_gamer[ selX-1][selY]=BOMB_HERE;
field_gamer[ selX-1][selY+1]=BOMB_HERE;
GameStats.total_ ships_opp_count-=1; >//вычёркиваем корабль у противника
if(field_gamer[ selX][selY]==HERE_SHIP_3) field_gamer[ selX][selY]=SHIP_ON_FIRE;
GameStats.ship_ 3_opp_heal-=1;
if(GameStats. ship_3_opp_heal==0) GameStats.total_ships_opp_ count-=1;
>
if(field_gamer[ selX][selY]==HERE_SHIP_4) <
field_gamer[ selX][selY]=SHIP_ON_FIRE;
GameStats.ship_ 4_opp_heal-=1;
if(GameStats. ship_4_opp_heal==0) GameStats.total_ships_opp_ count-=1;>
return 1; >//успешно
return 0; >//промах
private void autoPlacing(int field_gamer[][])

      Random generateRandom=new Random();

int gorizont=0;
int vertic=0;
int tmep_gorizont=0;
// расставляем 4х трубные
int choose=generateRandom.nextInt( 2);
switch( choose) <
case 0: //ставимпогоризонтали
tmep_gorizont=gorizont= generateRandom.nextInt(6)+1;// конец не включая
vertic=generateRandom.nextInt( 9)+1;//корабль нельзя начать на буферных полях 0,0 и 10,10
for(int i=0;i

field_gamer[tmep_gorizont][ vertic]=HERE_SHIP_4;
field_gamer[tmep_gorizont][ vertic-1]=HERE_NO_CHOOSE;
field_gamer[tmep_gorizont][ vertic+1]=HERE_NO_CHOOSE;
tmep_gorizont+=1; >//переходим на следующую клетку

Практические задачи по Java — для курсов и прочих занятий

Практические задачи по Java — для курсов и прочих занятий

Несколько вводных слов

Последние несколько лет я читаю курс по программированию на Java. Со временем он менялся — то добавлялись, то выкидывались разные части, менялась последовательность тем, менялся подход к построению плана самих занятий, и так далее. То есть, курс совершенствовался. Одной из основных проблем, возникших при подготовке курса — это задачи. О них и пойдёт речь.

Дело в том, что каждое моё занятие состоит из двух частей. На первой я выступаю в роли лектора — рассказываю с примерами кода о какой-то новой теме (классы, наследование, дженерики и так далее). Вторая часть — практическая. Очевидно, что нет смысла просто рассуждать о программировании, надо программировать. Приоритет на занятиях — решение задач, то есть программирование чего-то как-то. Программирование на занятиях отличается от программирования дома, так как на занятиях можно задать вопрос, показать код, получить быструю оценку кода, комментарии по улучшению, исправлению написанного. Очень легко было найти задачи для самых первых занятий. Задачи на циклы, условные операторы, и ООП (к примеру, написать класс «Собака» или класс «Вектор»). Сервисы вроде leetcode позволяют даже проверить правильность решения таких задач сразу, онлайн. Но какие задачи дать студентам на занятии, которое было посвящено коллекциям? Потокам? А аннотациям? За несколько лет я придумал, или переработал несколько таких задач, и эта статья, по сути, является сборником этих задач (к некоторым задачам прилагается решение).

Конечно, все задачи уже где-то появлялись. Однако, эта статья ориентирована на преподавателей курсов по программированию (для языков, похожих на Java, большинство задач подойдёт), или тех, кто преподаёт программирование частным образом. Эти задачи можно использовать «из коробки» на своих занятиях. Изучающие Java тоже могут попробовать решать их. Но такие решения требуют сторонней проверки и оценки.

Некоторые самые простые задачи, которые уже десятилетия все используют, я тоже включил в эту статью. Пожалуй, для того, чтобы не начинать сразу с абстрактных классов.

Массивы в Java. Одномерные и многомерные.

Начнем, пожалуй, последнюю не очень приятную и интересную, но очень важную и полезную тему в теории языка Java — массивы. Далее будет более интересный и увлекательный материал, который можно будет использовать для более практичных задач. Но, чтобы начать интересную часть явы нужно выучить неинтересную)) которая и является основой языка и без которой невозможно дальше учить программирование.

Все предыдущие темы, который мы рассматривали: Условные операторы, циклы являются основами программирования. С их изучения Вы будете начинать любой другой язык программирования. Массивы тоже относятся к такой теме. На чем бы Вы не решили начать программировать, Вы вряд ли сможете обойтись без массивов. Поэтому, я советую очень хорошо освоить данный и прошлый материал, если Вы хотите преуспеть в программировании.

Теперь перейдем к массивам.

Массив — это структура данных, которая предназначена для хранения однотипных данных.

Допустим, Вам нужно создать 5 целочисленных переменных и задать им некоторое значение. Как Вы это будете делать? Не зная массивов, Вы скорее всего начнете писать вот так: int a = 2, b = 3, c = 5, d = 21, e = 2;

Имея в арсенале такой тип данных как массивы, Вы можете писать так: int a = <2, 3, 5, 21, 2>;

Это очень удобно, когда имеет место обработка этих данных. Например, теперь Вам нужно к каждой переменной добавить 3. Если бы Вы использовали первый способ объявления, то такая операция заняла бы у Вас достаточно много времени. Тогда как имея в арсенале массивы и циклы, мы можем обрабатывать огромное количество данных не прибегая к монотонному коду.

Перед тем как использовать, массив нужно:

Запомните это порядок действий и никогда не нарушайте его.
Объявление массивов:
char s[];
String p[];
или
char [] s;
String [] p;
Создание массивов:
s = new char[20];
p = new String[100];

В квадратных скобках указано количество элементов массива. Это количество нельзя будет поменять потом.
Инициализация массивов:
после создания – поэлементно: int[] a = <1,2,3,4,5>;
при объявлении/создании – массив целиком: int b[] = new int[] <2, 4 ,6>;.

Если массив явно не проинициализирован, то после его создания все
элементы равны:
0 – в числовых массивах
false – в boolean-массивах
null – в массивах объектов

Границы массивов:
У всех массивов есть поле length – длина массива (в элементах)
Первый элемент всегда имеет индекс 0 (не путать со значением).
Последний элемент всегда имеет индекс length-1.

После такого количества теории, думаю, нужно немного практики:

Большая подборка полезных практических и обучающих материалов по Java

Java — язык программирования, который очень строго соответствует принципам объектно-ориентированного программирования. В этой статье вы найдете несколько полезных материалов, с которых стоит начать знакомство с языком.

Для начинающих

  • Отличная статья, в которой описано, как стоит подходить к изучению Java. После прочтения стоит заглянуть и в другие разделы сайта Skipy.ru, это уже будет полезно не только начинающим.
  • Study-Java — сайт, полностью состоящий из туториалов по Java, которые подскажут вам, в каком направлении стоит идти и какие навыки нужно вырабатывать в первую очередь.
  • Курс по основам языка Java.
  • Обширное руководство по многим темам с примерами кода.
  • Базовый курс по Java на ресурсе Stepik.
  • Более 350 вопросов с ответами для подготовки к интервью на позицию Junior Java Developer.
  • Наша подборка материалов для изучения языка Java.
  • Подборка полезных советов от Наньянского технологического университета — там есть аналогичные материалы и по другим темам.

Форумы, на которых вы можете задать возникшие вопросы:

Для продвинутых

  • Раздел Java на developer.com собрал в себе руководства как по целым пластам языка, вроде Enterprise Edition, так и разъяснения отдельных нюансов, вроде новомодных лямбда-выражений. Вот, например, статья, прочитав которую, вы разберётесь с тем, что такое аннотации, зачем они нужны и как правильно их использовать.
  • На сайте Tutorials Point есть раздел с исчерпывающим количеством туториалов по Java. Также там есть отдельный раздел для Java 8.
  • Java2S — коллекция примеров на все случаи жизни. Примечательно, что здесь есть не только чистая Java, но и работа с разными библиотеками, например JUnit. Хорошо описаны и нововведения Java 8 — Date-Time API, лямбды, потоки (streams).
  • Oskar Veerhoek — канал на YouTube, посвящённый OpenGL. Если вы собираетесь связать свою жизнь с программированием, маловероятно, что вам никогда не придётся работать с графикой. В течение курса из 41 видео автор расскажет вам, как работать с OpenGL в Java. Курс начинается с самых основ и написания 2D Minecraft’а, а заканчивается шейдерами, освещением и созданием 3D комнаты.

Для всех

  • Java-Tips — сборник готовых рецептов, шпаргалок, туториалов и полезных библиотек… Сайт будет незаменим для любого Java-программиста, особенно если вы только начинаете изучать язык. Отдельное спасибо стоит сказать тому, кто сортировал это всё — вам не составит труда найти здесь то, что вам нужно. Присутствуют материалы как по Java SE, так и по Enterprise и Micro версиям.
  • Регулярно обновляемый список вопросов и ответов.
  • Примеры решённых практических задач.
  • Структурированный справочник по языку.
  • Подробное руководство с примерами по каждой теме.
  • Обучающий материал от w3resource.
  • Подборка различных материалов для изучения языка.
  • Учебное пособие от Oracle, создателей языка.
  • Помните, что официальная документация — это источник самой достоверной и качественной информации.
  • Напоминаем, что на нашем сайте тоже есть порядочное количество статей по этому языку.

Практика

  • Бесплатные задачи, отсортированные по категориям на Codingbat;
  • Cписок задач от автора блога eax.me;
  • Олимпиадные задачи с ACMP;
  • Олимпиадные задачи с Codeforces;
  • Задачи с ответами на Codewars.

Полезные библиотеки

  • JUnit
    Любой код должен сопровождаться тестированием. Многие очень напрасно об этом забывают. Эта библиотека предназначена для автоматизации модульного тестирования. Еще несколько инструментов для тестирования в Java, вы найдете в нашей подборке.
  • HttpClient
    Библиотека для работы с HTTP ресурсами.
  • CommonsLang
    То, что «забыли» включить в JDK.
  • CommonsMath
    Отличное дополнение к java.math .
  • CommonsLogging
    Если вы используете для логирования System.out.println() , то вам стоит отрубить себе рук лучше воспользуйтесь этой библиотекой, так будет правильнее.
  • CommonsNet
    Логическое продолжение java.net , множество классов для работы с сетевыми протоколами.
  • CommonsVFS
    Библиотека, которая поможет вам абстрагироваться от способа хранения файлов — вы сможете достаточно обобщённо иметь к ним доступ по FTP, SFTP, WEBDAV, (G)ZIP и т.д.
  • CommonsIO
    С ней работать с вводом-выводом станет значительно проще.

Java 9

О том, какие изменения появились в Java 9, читайте в нашем обзоре с примерами.

Статьи

  • Подробный гайд по Java 9;
  • Знакомство с Project Jigsaw;
  • Java 9 Stream API: введение и материал по коллекторам;
  • Java 9 Process API;
  • Улучшения в Java Time (JSR-310);
  • Конкурентность;
  • Новое в Optional;
  • Разбираемся с Stack-Walking API;
  • Коллекции;
  • «Applying @Deprecated Enhancements»;
  • Используем sun.misc.Unsafe ;
  • Variable Handles;
  • Рефлексия vs Инкапсуляция;
  • Создание multi-release JAR-файлов при помощи Maven: о формате JAR, и о формате JAR с использованием Maven;
  • Ограничения памяти и Docker;
  • Введение в JShell.

Больше статей можно найти на этом сайте.

Блоги

  • Oracle (нет тега Java 9);
  • SitePoint;
  • Voxxed (выделим отличный цикл);
  • Baeldung;
  • Iteratr Learning (нет тега Java 9);
  • CodeFX;
  • Joda.

Книги и курсы

  • Курс «Java 9 Modularity: First Look»;
  • Книга «Java 9 Modularity»;
  • Книга «Mastering Java 9»;
  • Книга «Modular Programming in Java 9»;
  • Книга «Java 9 with JShell»;
  • Книга «Java 9 Module System».

В комментариях пишите, какие ресурсы были полезны для вас при изучении Java, самое интересное добавим в статью.

Java — Java/Разраб/Морской бой/Сравнение инф в многомерных массивах

Может быть, кто-нибудь может поделиться готовым классом, в котором совместно работают ViewPager и PhotoView? Ps

Ошибка в Selenium: java.lang.NoSuchMethodError: com.google.common.base

Появляется ошибка при запуске: Exception in thread «main» javalang

Как создать библиотеку?

У меня есть три «куска» кода — интерфейс, абстрактный класс и классКласс наследует абстрактный класс, а абстрактный класс наследует интерфейс

Не работает position:fixed

Столкнулся с тем что не работает position: fixed, перепробовал уже все, вот код в чем может быть проблема?

Руководство пользователя

Программа “Морской бой” обладает доступным, интуитивно понятным интерфейсом, который позволит пользоваться данным приложением неопытным пользователям.

На игровой площадке размером 10 на 10 клеток Игрок расставляет один корабль размером четыре клетки, два корабля размером три клетки, три корабля размером две клетки и четыре корабля размером в одну клетку (для облегчения корабли расставляются автоматически). При этом корабль представляет собой последовательность соседних клеток, стоящих на одной вертикали или на одной горизонтали. Соседние корабли не должны иметь общих точек. Противником Игрока является Компьютер, который автоматически расставляет корабли на своем поле по указанным выше правилам.

После расстановки начинается бой. Он представляет собой поочередные выстрелы Игрока и Компьютера. При попадании в корабль противника участник боя получает возможность проведения внеочередного выстрела. Игра заканчивается при уничтожении одним из участников всех кораблей противника.

Чтобы начать игру заново, необходимо нажать кнопку «Новая», расположенную в меню, в верхнем левом углу окна. Здесь же кнопка “Выход”.

ЗАКЛЮЧЕНИЕ

алгоритм игра java пользователь

В ходе выполнения курсовой работы были изучены основы программирования на языке Java. Написание программы способствовало закреплению теоретического материала на практике.

Используя среду программирования NetBeans IDE 7.3, мною было создано Java-приложение, реализующее игру “Морской бой”, с помощью данной программы пользователь может насладиться игрой в режиме пользователь — компьютер.

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

1. Дейтел, Х.М. Как программировать на Java [учеб. пособие] / Х.М. Дейтел, П.Дж. Дейтел ; пер. с англ. под ред. В.В. Тимофеева. -М. : Бином-Пресс, 2006. — 663 с.

2. Семочкин, А.Н. Язык программирования Java : учеб.пособие для вузов / А.Н. Семочкин ; М-во образования и науки РФ, Федеральное агентство по образованию [и др.]. — 2-е изд., перераб. И доп. — Благовещенск : Изд-во БГПУ, 2009. — 89 с.

3. Монахов, В.В. Язык программирования Java и среда NetBeans : [учеб. пособие] / В.В. Монахов. — 3-еизд., перераб. и доп. — СПб. : БХВ-Петербург, 2011. — 703 с.

Двумерные массивы в Java

Массив представляет собой объект-контейнер, который может содержать определенное количество объектов одного типа. Объекты могут быть примитивными типами: int, float, long или это могут быть объекты: String, Integer и т.д. К элементам массива получают доступ с помощью индексов.

Двумерный массив

Двумерный массив также известный как «массив массивов«. Например String [4] [5] — пример массива массивов с 4 строками и 5 столбцами. Когда мы вызываем функцию длины массива, то она возвращает количество строк в массиве.

Когда мы инициализируем массив, нужно указать его размер. Давайте посмотрим пример двумерного массива в простой Java программе. Когда мы инициализируем многомерные массивы, нам не нужно указывать размер для всех размеров, требуется только «левое измерение» (строки).

Цукерберг рекомендует:  Стартапы - Приглашаю в стартап. Сайт для GPS-маяков.
Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих