готовые коды для java
Практические задачи по Java — для курсов и прочих занятий
Практические задачи по Java — для курсов и прочих занятий
Несколько вводных слов
Последние несколько лет я читаю курс по программированию на Java. Со временем он менялся — то добавлялись, то выкидывались разные части, менялась последовательность тем, менялся подход к построению плана самих занятий, и так далее. То есть, курс совершенствовался. Одной из основных проблем, возникших при подготовке курса — это задачи. О них и пойдёт речь.
Дело в том, что каждое моё занятие состоит из двух частей. На первой я выступаю в роли лектора — рассказываю с примерами кода о какой-то новой теме (классы, наследование, дженерики и так далее). Вторая часть — практическая. Очевидно, что нет смысла просто рассуждать о программировании, надо программировать. Приоритет на занятиях — решение задач, то есть программирование чего-то как-то. Программирование на занятиях отличается от программирования дома, так как на занятиях можно задать вопрос, показать код, получить быструю оценку кода, комментарии по улучшению, исправлению написанного. Очень легко было найти задачи для самых первых занятий. Задачи на циклы, условные операторы, и ООП (к примеру, написать класс «Собака» или класс «Вектор»). Сервисы вроде leetcode позволяют даже проверить правильность решения таких задач сразу, онлайн. Но какие задачи дать студентам на занятии, которое было посвящено коллекциям? Потокам? А аннотациям? За несколько лет я придумал, или переработал несколько таких задач, и эта статья, по сути, является сборником этих задач (к некоторым задачам прилагается решение).
Конечно, все задачи уже где-то появлялись. Однако, эта статья ориентирована на преподавателей курсов по программированию (для языков, похожих на Java, большинство задач подойдёт), или тех, кто преподаёт программирование частным образом. Эти задачи можно использовать «из коробки» на своих занятиях. Изучающие Java тоже могут попробовать решать их. Но такие решения требуют сторонней проверки и оценки.
Некоторые самые простые задачи, которые уже десятилетия все используют, я тоже включил в эту статью. Пожалуй, для того, чтобы не начинать сразу с абстрактных классов.
Пишем 2d-игру на Java
Доброго времени суток всем!
В этой статье будет описываться создание 2D игры на Java. Сразу предупреждаю, вы должны хотя бы базово знать язык Java, поскольку на подробное объяснение каждой строки у меня нету времени. И очень прошу вас, не списывать просто код, а пытаться понять что означает каждая строка, и писать со смыслом. И еще, я использую Eclipse, но вы можете использовать любой IDE.
Задача:
Я планирую создать игру, напоминающую шутер с видом от 3 лица.
Начало:
Для начала создадим проект. Назовем его «Just game». И сразу создаем класс Display.java. В него пишем:
Теперь разберемся, что мы сделали.
мы создаем рамку, которая и будет отображаться при запуске нашей игры
устанавливаем операцию, которая будет происходить при нажатии на крестик. EXIT_ON_CLOSE — выйти из программы
устанавливаем нашей рамке максимальные размеры, убираем декорации(кнопки свернуть, закрыть, уменьшить/увеличить и т.п.), т.е. делаем игру на весь экран. Если вы хотите, чтобы игра не была бы на весь экран, то используйте:
— делаем рамку видимой
Только не забудьте, все настройки рамки надо писать до того, как вы сделаете её видимой
Ну чтож, теперь нажимаем «Run» и пробуем запустить нашу игру. Если все написано правильно, у вас не должны возникать ошибки и должно появиться пустое, серое окно.
Серое окно… Как скучно… Давайте создадим что-нибудь поинтереснее.
Создадим новый класс, под названием «Main». Main класс у нас будет являться панелью, которую мы вставим в рамку, по этому он должен расширять JPanel. (Для тех, кто не знает, расширять пишется как extends после названия класса)
Возвращаемся в класс Display и после настроек рамки, но перед установлением её видимости, пишем:
Вы спросите — «Ну и зачем мы это сделали?». Представьте себе картину. Эта картина и является конечная наша игра. А теперь представьте рамку. Без ничего внутри, просто пустую рамку. На ней ничего нельзя нарисовать, она бесполезна. Для этого, мы вставили в картину пустой лист, на котором программа в дальнейшем может рисовать картину. На этом закончим наше лирическое отступление и вернемся к классу Main.
Нам нужно осуществить отрисовку, по этому мы должны добавить метод paint. Для этого пишем:
Ну и для начала, можем написать внутри этого метода отрисовку линии. Для этого пишем:
Теперь запускаем программу, и видим:
Давайте отрисуем какую-нибудь картинку. Например эту:
Для начала, нам нужно указать путь к картинке. Для этого не в методе paint, пишем:
(предварительно надо в наш проект скинуть картинку и назвать ее 2.png)
После этого удаляем строчку отрисовки линии, а вместо нее в метод paint пишем:
Разберемся поближе с методом drawImage, так как мы будем часто его затрагивать.
drawImage(картинка которую мы будем рисовать, которую мы объявили раннее, координата X с которой будет рисоваться картинка, координата Y с которой будет рисоваться картинка, paint);
Отдельно хочу поговорить о параметре paint. Лучше всего оставляйте его null. Я только однажды сталкивался, когда мне нужно было использовать paint. Это было когда я отрисовывал текст, и задавал ему размер шрифта. Но советую не лезть туда и использовать null.
Теперь запускаем программу, и видим:
Чего-то она маленькая, не правда ли? Давайте научимся увеличивать её размеры. Добавляем к drawImage() параметры так, чтобы вышло:
Что мы сейчас добавили? Эти два параметра растягивают картинку, до координат 1920 и 1080. Получается, что картинка на весь экран. Давайте запустим программу и это проверим.
Ну наконец-то. Теперь мы умеем любые картинки растягивать на весь экран. Но вот проблема. Метод paint вызывается только один раз. И как же его обновлять постоянно? Для этого существует очень полезная вещь — таймер. Давайте создадим его.
(20 это частота с которой обновляется таймер, this- где выполнять метод при обновлении таймера
Это мы должны вписать сразу после строки определения класса, т.е. после:
Также, надо дополнить строку определения класса таким образом:
После прописывания этой строки, у вас название класса должно подчеркнуться красным. Чтобы это исправить, в самом конце класса добавьте метод:
Этот метод будет выполняться при обновлении таймера. В него мы должны написать repaint(); чтобы при каждом обновлении таймера у нас все элементы бы стирались, и нарисовывались заново.
Дальше, мы должны запустить таймер. Для этого, создаем конструктор класса Main и в него пишем:
После этого, можете не запускать программу, ведь в ней ничего не изменится. Давайте заменим текстуру домика на нормальную текстуру карты. Её вы можете нарисовать сами, либо скопировать у меня пробную:
Размер картинки может быть любой, все равно её размер будет подгоняться прямо в программе. Ах да, разрешения компьютеров могут быть разные, так что добавим-ка в конструктор такие вещи:
И перед конструктором добавим:
И сходим еще в класс Display.java и там немного изменяем метод frame.add:
Таким образом, наша рамка будет передаваться в класс Main.java. Переходим в этот класс, и там где у нас метод paint() меняем строку drawImage() на:
Таким образом, теперь наша игра будет отрисовывать картинку на весь экран, в независимости от его разрешения. Запускаем:
На сегодня все. Оставляю код, для тех, кто запутался:
покажите полный код самой малой игры на java
FIELD_SIZE = 20;
SNAKE_SPEED = 100;
window.onload = startGame();
window.addEventListener(«keydown», changeDirection, false);
window.addEventListener(«touchstart», touchCatched, false);
window.addEventListener(«touchmove», touchEnded, false);
function touchCatched(event) <
touch = event;
>
var rule = new Object();
if (Math.abs(offsetX) > Math.abs(offsetY)) <
if (offsetX 2 года назад
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.Transparency;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
public class Game extends Canvas implements Runnable <
private static final long serialVersionUID = 1L;
private boolean running;
public static int WIDTH = 400;
public static int HEIGHT = 300;
public static String NAME = «TUTORIAL 1»;
public static Sprite hero;
public void start() <
running = true;
new Thread(this).start();
>
public void run() <
long lastTime = System.currentTimeMillis();
long delta;
public void init() <
hero = getSprite(«man.png»);
>
public void render() <
BufferStrategy bs = getBufferStrategy();
if (bs == null) <
createBufferStrategy(2);
requestFocus();
return;
>
Graphics g = bs.getDrawGraphics(); //получаем Graphics из созданной нами BufferStrategy
g.setColor(Color.black); //выбрать цвет
g.fillRect(0, 0, getWidth(), getHeight()); //заполнить прямоугольник
hero.draw(g, 20, 20);
g.dispose();
bs.show(); //показать
>
public void update(long delta) <
public Sprite getSprite(String path) <
BufferedImage sourceImage = null;
Простая программа на Java
Ключевой момент: Java программа выполняется с метода main в классе.
Давайте начнём с простой Java программы, которая показывает в консоли сообщение «Welcome to Java!». (Слово «консоль» – это старый компьютерный термин, который относится к устройству ввода и отображения текста на компьютере. Консольный вход означает получение ввода с клавиатуры, а выход консоли – отображение вывода на мониторе. В NetBeans вывод показывается в специальном окне:
Вне IDE консольные программы (т.е. без графического интерфейса) запускают в командной строке. О командной строке в следующем разделе «Создание, компиляция и выполнения Java программ».
Исходный код программы
Строка 1 определяет класс. Каждая Java программа должна иметь по крайней мере один класс. Каждый класс имеет имя. Принято, что имена классов начинаются с заглавной буквы. В этом примере класс назван Welcome.
Строка 2 определяет метод main. Программа начинает выполнение с метода main. Метод main – это точка входа, где программа начинает выполнение.
Метод – это конструкция, которая содержит инструкции. Метод main в этой программе содержит инструкцию System.out.println. Инструкция отображает в консоли строку «Welcome to Java!». Строка (String) – это термин в программировании, означающий последовательность символов. Строка должна быть заключена в двойные кавычки. Каждая инструкция в Java заканчивается точкой с запятой ( ; ), которая служит разделителем инструкций.
Зарезервированные слова, или как их ещё называют ключевые слова, имеют определённое значение для компилятора, и они не могут использоваться для других целей в программе. Например, когда компилятор видит слово class, он понимает, что слово после class – это имя класса. Другими зарезервированными словами в этой программе являются public, static и void.
Строка 3 – это комментарий, которая документирует действия программы и её устройство. Комментарии помогают программистам общаться и понимать программу. Они не являются программными инструкциями и, таким образом, игнорируются компилятором. В Java комментариям предшествуют два слеша на строке (//), которая так и называется – строка комментария. Комментарии могут располагаться между /* и */ на одной или нескольких строках, эти строки называются блоком комментариев или параграфом комментариев. Когда компилятор видит //, то он на этой строке игнорирует весь текст после //. Когда видит /*, он сканирует следующий */ и игнорирует любой текст между /* и */.
Несколько примеров комментариев:
Пара фигурных скобок в программе формирует блок, который группирует компоненты программы. В Java каждый блок начинается с открывающей фигурной скобки ( <)и заканчивается закрывающей фигурной скобкой. (>). Каждый класс имеет блок класса, который группирует данные и методы класса. Похожим образом каждый метод имеет блок метода, который группирует инструкции в методе. Блоки могут быть вложенными, это означает, что один блок может быть помещён внутри другого, как показано на следующем коде:
Подсказка: любой открывающей фигурной скобке должна соответствовать закрывающая. Каждый раз, когда вы напечатали открывающую фигурную скобку, сразу печатайте закрывающую, для предотвращения ошибок, вызванных отсутствие скобки. Большинство IDE для языка Java автоматически вставляют закрывающую фигурную скобку для каждой открывающей.
Внимание: исходный код программ Java чувствителен к регистру. Будет неправильным, например, заменить в программе main на Main.
Вы познакомились с несколькими специальными символами в программе (например, , //, ;). Они используются практически в каждой программе. Таблица обобщает их использование:
Символ | Имя | Описание |
---|---|---|
<> | Открывающая и закрывающая фигурная скобка | Обозначает блок для окружения инструкций. |
() | Открывающая и закрывающая круглая скобка | Используется с методами. |
[] | Открывающая и закрывающая квадратная скобка | Обозначает массив. |
// | Двойной слэш | Предшествует комментарию. |
» « | Открывающая и закрывающая кавычки | Окружает строку (т.е. последовательность символов). |
; | Точка с запятой | Обозначает конец инструкции. |
Самыми распространёнными ошибками, которые вы будете делать пока учите программировать, это синтаксические ошибки. Как любой язык программирования, Java имеет свой собственный синтаксис, и вам нужно писать код, который удовлетворяет правилам синтаксиса. Если ваша программа нарушает правило, например, если отсутствует точка с запятой, отсутствует фигурная скобка, отсутствует кавычка или неправильно написано слово – компилятор Java сообщит об ошибках синтаксиса.
Примечание: возможно вам интересно, почему метод main так определяется и почему для отображения сообщения в консоли используется System.out.println(…). На данный момент просто примите это как данность. В последующих главах на все ваши вопросы будут даны ответы.
Программа в начале выводит одно сообщение. Теперь, когда вы вникли в программу, легко её распространить для отображения большего числа сообщений. Например, вы можете перезаписать программу для отображения трёх сообщений:
В дальнейшем вы можете выполнять математические расчёты и отображать результаты в консоли. Пример вычисления
Для умножения в Java используется *. Как вы можете увидеть, это простой процесс для преобразования арифметический выражений в Java инструкции. Подробнее это будет рассмотрено в следующей главе.
10 главных конструкций языка Java
Простой и мощный язык.
Java — важный язык разработки во многих больших корпорациях. Мы уже рассказывали про то, как и где применяется Java, теперь настало время для практики.
Так как авторы языка Java при создании вдохновлялись языками C и C++, то в Java тоже появилось много похожих конструкций и команд. Если вы знаете C или C++, то освоить Java вам будет гораздо проще.
👉 В Java после каждой команды ставится точка с запятой.
Комментарии
Комментарии в Java точно такие же, как в C-подобных языках — есть однострочные, которые работают только для одной строки, и многострочные.
// Это однострочный комментарий
// Для каждой строки нужно добавлять его отдельно
/* А это — многострочный
его можно сделать любой длины,
если в начале и в конце поставить нужные символы */
Переменные и типы данных
Как и в C, в Java есть несколько типов данных с разным объёмом выделяемой памяти. Предполагается, что программист сам решит, какой тип использовать лучше всего в каждой ситуации и сам будет следить за тем, чтобы в переменную поместилось всё что нужно.
Присваивание и сравнение
// это присваивание
x = 10;
// а это — сравнение x и 10
// результат сравнения отправляется в переменную b
boolean bol;
b = (x == 10);
Структура программы
Разработчикам Java понравилось, что в C вся программа состоит из функций, среди которых есть одна обязательная — main, поэтому сделали точно так же. В классах эта функция называется методом.
Но есть одно важное отличие: каждая java-программа — это как бы один большой класс со своими разделами, которые должны быть у каждого класса. Благодаря этому большие программы легко собираются из маленьких java-кирпичиков и работают друг с другом как с классами, используя все их возможности.
Ввод и вывод
Для ввода и вывода используют системный класс System и два его объекта — in и out. Но на практике чаще всего вместо in используют объект Scanner, чтобы можно было более гибко управлять вводом данных.
Условные операторы if и switch
Работают так же, как в C и в любых современных языках высокого уровня. Главное здесь — следить за фигурными скобками и не перепутать, что к чему относится. Проще всего это регулировать отступами:
У оператора множественного выбора есть особенность: ему не нужны фигурные скобки для действий в каждом случае. Компьютер по синтаксису понимает, что к чему относится, и выбирает нужный вариант.
Циклы
В Java есть три основных вида циклов:
Ещё есть два полезных оператора:
Функции (они же методы)
Так как каждая программа — это описание какого-то класса, то функции в Java — это и есть методы этого класса. Функций (или методов) может быть сколько угодно, главное — соблюдать правила описания классов. Покажем на примере:
Классы
В Java всё построено на классах, от самой программы до реализаций различных функций. Конечно, можно не использовать классы и работать в чисто процедурном стиле, но в Java так не принято. Это ООП-язык с родной поддержкой классов на всех уровнях.
Сами классы объявляются и используются так же, как и в любом другом ООП-языке:
Объекты
Объекты в Java работают по тому же принципу, что и все объекты в ООП: можно создавать сколько угодно объектов на основе классов и делать их любой сложности.
Обычно используют классы, прописанные в том же файле, что и программа. Если нужно использовать класс из другой программы, её подключают отдельно. Вот самый простой способ сделать объект на основе предыдущего класса с заказом: