Newcomposers.ru

IT Мир
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Морской бой java

Игра Морской бой советы в java

В настоящее время я пытаюсь создать игру линкор в java. Два игрока подключаются к серверу, размещают там корабли и начинают игру. Я создал сервер и клиент. Я не знаю, как передать координаты выстрела одного игрока от одного игрока к другому. Координаты судна хранятся в списке на стороне клиента. Какое решение лучше всего подходит для общения игроков? Может быть, координаты корабля игрока должны быть отправлены на сервер, и второй игрок проверит их на сервере? Или я должен остаться с идеей, что игрок отправляет другому игроку координаты и получает результат? Может быть, у кого-то будет идея получше.

3 Ответа

Если вы не хотите, чтобы люди обманывали, вы храните все данные о координатах на сервере. Клиенты запрашивают данные координат с сервера.

Ваши клиенты отправляют сообщения на сервер, и сервер предоставляет ответ. Это единственный способ, которым вы, как игрок, знаете, что сервер все еще подключен.

Содержание сообщений и содержание ответа зависит от вас.

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

Надеюсь, это поможет 🙂

PS: я бы использовал библиотеку KryoNet! https://code.google.com/p/kryonet/

Что вы используете для общения прямо сейчас? Поскольку вы связали свой вопрос с сокетом, я думаю, вы используете простые IP-сокеты. Может быть, вы посмотрите ar RMI . Его легко настроить, и вы можете использовать его почти как обычный вызов java.

Таким образом, обновление выстрела игрока-это просто вопрос вызова метода.

Похожие вопросы:

ок, вот первый раз нуб вопрос, Извините, если это глупо. Мне просто было интересно, для игры типа линкора, было бы пустой тратой памяти построить набор объектов для каждой ячейки (10X10=100), с.

Я создал поле боя с сеткой 10х10. Вертикальные и горизонтальные элементы имеют значения от 0-9. Компьютер имеет пять кораблей, и я хочу, чтобы компьютер произвольно разместил каждый из пяти кораблей.

Я делаю игру в морской бой для 2 игроков в python году. Я сделал так, чтобы каждый ‘game’ допускал в общей сложности 6 ходов (по 3 от каждого игрока), после чего появится сообщение о том, что.

Я пытаюсь написать игру в Морской бой. Сначала я создал класс под названием Tile , чтобы представить один блок массива 2D, который станет полем битвы.: public class Tile < public enum type

Я создаю игру линкор в python. Я создал доску, которая имеет размер 10X10 и выглядит как таковая. ————————————————- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |.

Я делаю игру в Морской бой, и мне нужно заменить переменную в массиве (Тильда

) на X, когда пользователь не угадывает правильно. Мне также нужно распечатать массив позже. EDIT: я использую Python.

Я создаю 15 игра-головоломка, в java. Я уже создал игровую панель и написал метод, который находит позицию пустого места (не JButton) на поле и метод, который контролирует, является ли это.

некоторое время назад я сделал трек Codecademy — Python и сделал простую игру battleship. Я изучал Ruby сейчас и хотел попробовать преобразовать игру из Python в Ruby. До сих пор я преуспевал в.

Итак, я работал над игрой в морской бой, но столкнулся с проблемой, которую не смог решить. Когда все 8 кораблей будут найдены, я хочу предупредить выигрышное сообщение, общее количество выстрелов.

Пишем свой Морской Бой , на пути к успешной курсовой. (часть1)

Здравствуйте уважаемые читатели !

Сегодня хотелось бы посвятить свой пост разработке классической ,уже ставшей символом школьной поры ,игры.
Речь у нас пойдет об игре «Морской бой». Разработку мы будем вести на языке C++ в среде Visual Studio. Сам я люблю писать на C# ,но в ТЗ к моей курсовой были указаны языки C/C++.
Графику прикрутим ближе к концу , так же постараемся реализовать ИИ.
Пост не следует рассматривать как руководство для совсем новичков, я буду стараться разжевывать все что делаю достаточно тщательно ,приводить блок схемы алгоритмов и основные формулы(если будет не лень),но эта серия постов выйдет скорее как дневник разработчика ,который чуть было не завалил сессию 🙂

Читать еще:  Как восстановить режим сенсорного экрана виндовс 10

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

1.Для начала разберемся с основными правилами игры и вообще построим у себя в голове образ будущего творения.
О самой игре говорить много наверно не стоит ,каждый кто учился в школе так или иначе знает правила,но если кратко то : У нас есть 1 корабль который занимает четыре клетки
2 корабля которые занимают три клетки , 3 корабля на две клетки , и 4 лодки размером с одну клетку. корабли должны быть расставлены так чтобы между ними обязательно была одна пустая клетка.
вообще для прототипа игры я сделаю консольную версию приложения ,протестирую на ней механику а потом если успею прикручу графику (это я уже указывал строк на 20 выше)

Чтобы не сильно засыпать вас текстом , прилагаю картинку игрового поля

2. Создаем проект приложения win32 на C++ в Visual Studio

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

В следующем окне поставим галочку напротив MFC ,на тот случай если все таки дойдем до графического интерфейса 🙂

3. Проект создан ,выглядит он вот так(можно кликнуть на картинку и разглядеть получше,сравнить со своим результатом).

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

Теперь давайте создадим класс игрока , не будем сильно оригинальничать и назовем его Player, он будет описывать и игрока и компьютер и в нем будут методы расстановки кораблей и стрельбы ,но до стрельбы нужно дожить)

После этого у нас появились 2 новых файла в проекте ,они обведены красным

идем в главный класс и подключаем нужные нам библиотеки ,это будут clocale, conio.h, stdlib.h, iostream, ctime

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

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

Далее идем в наш Заголовочный файл и вставляем туды строчку с определением

направления нашего корабля,чтобы мы могли дальше использовать эти данные при обозначении методов класса Player

теперь идем в наш Player и создаем там основные методы которые нам пригодятся

метод «set» -устанавливает корабль ,от значения переданной ему переменной ,можно догадаться о количестве палуб

метод «ships_init» — собственно инициализирует массив с кораблями

методы «turn» — в зависимости от ссылки отвечают за ход компьютера или игрока

метод «place _ship» — вызывается из метода set и описывает направление и координаты нашего кораблика
далее мы размещаем нужные нам для фунциклирования переменные :

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

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

Создание проекта и файлов классов игры Морской бой

Дата добавления: 2015-06-12 ; просмотров: 3550 ; Нарушение авторских прав

Откроем среду разработки Eclipseдля Java и создадим новый проект Java. Для этого в меню выберем: File-New- Java Project (см. рис. 9)

Укажем название проекта:mb (см. рис. 10) и нажмем кнопку Finish (Готово).

В списке проектов добавится новый проект mb. Добавим к нему новыйкласс. Для этого нажмем на имя проекта левой клавиши мыши (выделим). Далее нажмем правую клавишу мыши, откроется дополнительное окно.Выберем New, Class(см. рис. 11).

Это будет главный класс нашего проекта,в нем будет находиться метод main(). Укажем название класса: mb (см. рис. 12) и поставим галочку public static void main(см.рис. 12)

Далее нажимаем кнопкуFinish (Готово). В результате появится программный код нового класса, содержащий метод main() (см. рис. 13)

Читать еще:  Загрузочный диск windows 10 для восстановления системы

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

Добавим следующий класс:okno. Для этого снова выделим заголовок проекта mb в списке проектов(см. рис. 14).

Важно. При добавлении нового класса к проекту – необходимо выделить именно заголовок проекта, а не какую-либо вложенную папку!

Далее нажмем правую клавишу мыши, откроется дополнительное окно. Выберем New-Class(см. рис. 15).

Это будет класс для окна нашего приложения. Укажем название класса: okno (см. рис. 16) и галочкуpublic static void main(см. рис. 16) в этот раз ставить не нужно!

Галочка public static void main нужна для автоматического создания метода main(), но метод main() уже определен в главном классе mb. Поэтому для всех остальных классов эта галочка не нужна! Аналогично классуoknoдобавим еще два класса: pole иgame. Классpole для игрового поля, класс game для реализации логики игры с использованием двухмерных массивов.

В результате в нашем проекте будет четыре файла –четыре класса

(см. рис. 17) Обратите внимание, что если все четыре файла добавлены к проекту правильно–они все должны располагаться внутри пакета по умолчанию (см. рис.18).

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

После реализации первого уровня сложности мы должны получить нарисованное игровое поле и элементы интерфейса (см. рис.19).

Начнем с класса mb. Перейдем в файлmb.java (см. рис. 20).Реализация класса mb будет самой простой, его задача только в одном запустить наше приложение и создать объект окна.

Программный код этого класса будет выглядеть так:

// Главный класс программы

public class mb

// Метод для запуска приложения

public static void main(String[] args)

// Создание объекта окна игрового поля

// Класс «okno» находится в файле»okno.java»

okno window = new okno();

В методе main() создается объект на основании класса okno. Класс okno будет реализован в файле okno.java. Данный программный код класса mbявляется окончательным для всех уровней сложности. Больше к этому классу мы возвращаться не будем!Это самый маленький и простой класс нашего проекта.

Теперь перейдем в классokno, в файлokno.java (см. рис. 21).

В этом классе нам необходимо реализовать окно, в котором будет находиться игровое поле. Само игровое поле будет реализовано в классеpole. Похожая схема классов была использована при создании игр «Новогодний дождь» и»Змейка». Программный код класса oknoбудет выглядеть так:

//Класс окна игрового поля

public class okno extends JFrame

//Создание объекта панели и подключения ее к окну

pole pan = new pole();

Container cont = getContentPane();

setTitle(«Игра «Морской бой»»);

//Границы окна: расположение и размеры

setBounds(0, 0, 900, 600);

//Операция при закрытии окна — завершение приложения

//Запрет изменения размеров окна

//Отображение (показ) окна

Данный программный код класса okno является окончательным для всех уровней сложности. Больше к этому классу мы возвращаться не будем!

Программный код этого класса практически ничем не отличается от программного кода для класса окна в игре»Змейка», есть лишь небольшие отличия:

setTitle(«Игра «Морской бой»»);

Заголовок окна теперь стал Морской бой, и несколько изменились размеры окна в соответствии с техническим заданием:

// Границы окна: расположение и размеры

setBounds(0, 0, 900, 600);

Класс наследуется от класса JFrame и его задача настроить свойства окна и показать его пользователю. Внутри классаokno создается объект игрового поля:

// Создание объекта панели и подключения ее к окну

pole pan = new pole();

Сам класс pole будет реализован в файле pole.java. На этом этапе классы mb и okno реализованы полностью. Так как к ним больше не придется возвращаться –можно закрыть закладки mb.java иokno.java (см. рис. 22).

В результате останутся два открытых файла pole.javaи game.java (см. рис.23). В этих двух классах будет основная часть программного кода!

На первом уровне сложности нам необходимо реализовать рисование игрового поля. При нажатии на кнопку Новая игра, пока, ничего происходить не будет.Это значит, что логику игры нам реализовывать не придется и класс game,пока,останется пустым (см.рис. 24).

Все действия для рисования игрового поля и реализации интерфейса будут происходить в классеpole. Перейдем в файл pole.java (см. рис. 25)и приступим к написанию программного кода. Класс poleбудет наследоваться от класса JPanel. Он будет представлять собой прямоугольную область,которая вложена в рамку окна. Первое, что мы сделаем –добавим необходимые библиотеки. Здесь нам понадобятся библиотеки для элементов интерфейса пользователя, рисования,обработки событий, работы с файлами,загрузки изображений.

Читать еще:  Как восстановить файл удаленный из сетевой папки

Все они нам знакомы,добавим их в самом верху класса:

// Для обработки событий

// Для работы с окнами

// Для работы с графикой

// Для работы с изображениями

// Для работы с файлами

Теперь выполним наследование от класса JPanel:

//Класс панели игрового поля

public class pole extends JPanel

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

// Для обработки событий

// Для работы с окнами

// Для работы с графикой

// Для работы с изображениями

// Для работы с файлами

//Класс панели игрового поля

public class pole extends JPanel

// Таймера отрисовки и изменения логики игры

private Timer tmDraw;

// Изображения, используемые в игре

private Image fon, paluba, ubit, ranen, end1, end2, bomba;

private JButton btn1,btn2;

Добавлен таймер для отрисовки:

//Таймер для отрисовки и изменения логики игры

private Timer tmDraw;

Добавлены семь переменных типа Image–для загрузки семи изображений.

//Изображения, используемые в игре

private Image fon, paluba, ubit, ranen, end1, end2, bomba;

Добавлены две кнопкиJButton–это кнопки Новая игра и Выход:

private JButton btn1,btn2;

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

//Попытка загрузки всех изображений для игры

fon = ImageIO.read(new File(«c:\fon.png»));

paluba = ImageIO.read(new File(«c:\paluba.png»));

ranen = ImageIO.read(new File(«c:\ranen.png»));

ubit = ImageIO.read(new File(«c:\ubit.png»));

end1 = ImageIO.read(new File(«c:\end1.png»));

end2 = ImageIO.read(new File(«c:\end2.png»));

bomba = ImageIO.read(new File(«c:\bomba.png»));

catch (Exception ex) <>

В процессе разработки все изображения находятся в корне дискаC:. При успешной загрузке изображений –они станут доступны в игре. После загрузки изображений создаем,настраиваем и запускаем таймер отрисовки игрового поля. Программный код для таймера будет также внутри конструктора, под загрузкой изображений:

//Создаем, настраиваем и запускаем таймер

//для отрисовки игрового поля

tmDraw = new Timer(50,new ActionListener() <

public void actionPerformed(ActionEvent arg0) <

// Вызываем перерисовку -paintComponent()

Отображение фона, сеток игровых полей из линий, выведение надписей мы будем выполнять в методе paintComponent(). Две кнопкиНовая игра и Выход добавим в конструкторе класса под кодом для таймера. Полный код конструктора класса pole будет выглядеть так:

//Попытка загрузки всех изображений для игры

fon = ImageIO.read(new File(«c:\fon.png»));

paluba = ImageIO.read(new File(«c:\paluba.png»));

ranen = ImageIO.read(new File(«c:\ranen.png»));

ubit = ImageIO.read(new File(«c:\ubit.png»));

end1 = ImageIO.read(new File(«c:\end1.png»));

end2 = ImageIO.read(new File(«c:\end2.png»));

bomba = ImageIO.read(new File(«c:\bomba.png»));

catch (Exception ex) <>

//Создаем, настраиваем и запускаем таймер

//для отрисовки игрового поля

tmDraw = new Timer(50,new ActionListener() <

public void actionPerformed(ActionEvent arg0) <

// Вызываем перерисовку -paintComponent()

// Включаем возможность произвольного размещения

//элементов интерфейса на панели

//Создаем кнопку Новая игра

btn1 = new JButton();

btn1.setBounds(130, 450, 200, 80);

// Обработчик события при нажатии на кнопку Новая игра

public void actionPerformed(ActionEvent arg0) <

//Создаем кнопку Выход

btn2 = new JButton();

btn2.setBounds(530, 450, 200, 80);

// Обработчик события при нажатии на кнопку Новая игра

public void actionPerformed(ActionEvent arg0) <

// Выход их игры -завершение работы приложения

Если выполнить запуск,то мы увидим следующее (см.рис. 26).

Добавление кнопок происходит привычным способом. Точно также были добавлены кнопки в игре «Змейка».Обработчик события для кнопки Новая игра на первом уровне сложности ничего не выполняет.

Остальные действия для рисования игрового поля мы выполним, как и обычно, в методе paintComponent(). Добавим его под конструктором класса.

public void paintComponent(Graphics gr)

//Очищение игрового поля

Выведем изображение фона и две надписи Компьютер, Игрок:

public void paintComponent(Graphics gr)

//Очищение игрового поля

gr.drawString(«Компьютер», 150, 50);

gr.drawString(«Игрок», 590, 50);

Запустим приложение на выполнение и увидим (см. рис.27).

Выведение текста происходит при помощи метода drawString():

gr.drawString(«Компьютер», 150, 50);

gr.drawString(«Игрок», 590, 50);

Перед выведением текста методом drawString() необходимо указать цвет и шрифт выводимой надписи. Координаты для вывода надписей можно для начала указать приблизительно, а потом при запуске смотреть расположение надписи и корректировать координаты в программном коде.

Далее в методе paintComponent() нам предстоит нарисовать сетку игрового поля.Программный код будет выглядеть так:

//Отрисовка сетки игрового поля из синих линий

Ссылка на основную публикацию
Adblock
detector