Разработка игры 'Морской бой'

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    442,71 Кб
  • Опубликовано:
    2014-02-04
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Разработка игры 'Морской бой'

ВВЕДЕНИЕ

Как известно, человек наделен интеллектом, а компьютер? Сейчас много говорят о так называемом искусственном интеллекте. У компьютера это, прежде всего память. Его оперативная память, предназначенная для быстрого использования, позволяет записывать и получать информацию за микросекунды.

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

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

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

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

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

Среди бесчисленного множества компьютерных игр существует, всем нам хорошо известный с детства, “Морской бой”. Эта игра была “придумана” в 1931 году Милтоном Брэдли. Идея пришла во время первой мировой войны, в которой было много морских сражений. Хотя есть данные, что игра существовала в “бумажном” варианте существенно раньше, еще до Первой мировой войны, и истинный автор неизвестен. Ну а теперь существует много компьютерных версий, различающихся в основном лишь по оформлению.

Цель: разработать программу, реализующую игру «Морской бой» в режиме пользователь - компьютер.

Задачей данной курсовой считаю: достичь реализации данной цели наиболее оптимальными методами с использованием основных свойств объектно-ориентированного программирования.

1. Описание алгоритма хода ЭВМ

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

Замечание: ЭВМ все равно “знает”, где расположены все корабли, так как они хранятся в памяти. К тому же для осуществления хода нужно видеть игровую ситуацию. ЭВМ в данной игре лишь “делает вид”, что не знает расположение кораблей.

Итак, сначала осуществляется проход по всем кораблям на поле. Если очередной корабль уже убит, осуществляется переход к следующему.

Для каждого “живого” корабля вычисляется диапазон его повреждений, то есть начальная и конечная клетки из подбитых. Если диапазон не найден, значит, корабль не подбит, следовательно, его не видно на поле и ЭВМ “делает вид”, что не знает, где этот корабль и переходит к следующему. Если же диапазон найден, то возможны два случая.

Первый случай - подбита лишь одна клетка. Сначала вычисляются координаты этой клетки. Затем перебираются возможные варианты выстрелов - левее, правее, выше и ниже этой клетки. Отбрасываются варианты выстрелов за пределы поля, а также выстрелы по клеткам, по которым уже был осуществлен выстрел. Осуществляется выстрел по последнему возможному варианту.

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

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

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

Во всех случаях метод возвращает результат выстрела, возвращаемый методом shot(int x, int y), который осуществляет выстрел по указанной клетке.

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

2. Описание классов

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

Public class GameFrame extends JFrame - класс, реализующий окно игры, в том числе меню. Это главный класс программы в нем содержится метод main - так называемая точка входа в программу. Именно с этого метода начинается выполнение программы. Класс, реализующий окно игры, в том числе меню.

Данный класс содержит поле private Seabattle game - одно из наиболее важных полей этого класса, является экземпляром класса Seabattle, то есть это и есть сама игра. Остальные поля данного класса отвечают в основном за интерфейс программы.

Public static void main(String[] args) - как говорилось выше, это главный метод класса.

Класс public class Seabattle extends JComponent реализует саму игру "Морской бой".

Поля данного класса:

-    private boolean settingShips - поле логического типа, определяющее режим игры. Значение true означает режим расстановки кораблей, значение false - режим боя.

-       private boolean gameOver - поле логического типа, определяющее, закончена ли игра (true) или нет (false).

-       private Field ownField - экземпляр класса Field (игровое поле), являющийся в данном классе полем игрока.

-       private Field enemyField - экземпляр класса Field (игровое поле), являющийся в данном классе вражеским полем.

-       private MouseAdapter mouseAdapter - слушатель событий мыши, отлавливающий щелчки мышью по полю и выполняющий нужные действия.

Public Seabattle(int fieldSize) - конструктор, создающий игровое поле определенного размера.

В данном классе описаны следующие методы:

-    public boolean allShipsArePlaced()- метод, определяющий, все ли корабли на поле игрока расставлены.

-       public void startGame()- метод, который инициирует начало боя.

-       public boolean randomizeOwnField()- метод, расставляющий корабли на поле игрока на случайные позиции.

-       public boolean randomizeEnemyField() - метод, расставляющий корабли на вражеском поле на случайные позиции.

-       public void reset() - метод сброса игры. Очищает поля и устанавливает режим расстановки кораблей.

-       public boolean gameIsOver() - метод, возвращающий значение поля gameOver, то есть определяющий, закончена ли игра.

-       public void paint(Graphics g) - метод, отвечающий за то, как будет отрисовываться игра.

Класс, реализующий игровое поле - public class Field.

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

-    private int size - размер поля в клетках.

-       private boolean[][] shots - массив выстрелов. Если значение shots[i][j] равно true, значит по клетке с координатами (i; j) в данной игре был сделан выстрел.

-       private int lastShotX, lastShotY - координаты последнего выстрела по полю.

-       private boolean isEnemyField - поле логического типа, определяющее, является ли поле вражеским.

-       private final int maxShipSize - константа, определяющая максимально возможную длину корабля.

Public Field(int size, boolean isEnemyField) - конструктор, создающий поле указанного размера. В зависимости от второго параметра поле будет либо вражеским, либо полем игрока.

В данном классе описаны следующие методы:

-    public boolean randomize() - метод, расставляющий корабли на поле случайным образом.

-       public int addShip(Ship ship) - метод, добавляющий на поле корабль. Возвращает значение типа int: -2, если была попытка разместить корабль слишком близко к другому, -1, если была попытка разместить корабль за пределы поля, 0, если кораблей данного размера слишком много, 1, если размещение успешно.

-       public void removeShip(Ship s) - метод, удаляющий указанный корабль с поля.

-       public void clearField() - метод, очищающий поле от кораблей и выстрелов.

-       public boolean hasShipAt(int x, int y) - метод, определяющий, есть ли корабль на поле по указанным координатам.

-       public boolean isShipDead(Ship ship) - метод, определяющий, убит ли указанный корабль.

-       public Ship getShipAt(int x, int y) - метод, возвращающий корабль, расположенный по указанным координатам. Если корабля там нет, то возвращает null.

-       public void setSizeOfShip(Ship ship, int newSize) - метод установки размера для указанного корабля.

-       public void rotateShip(Ship ship) - метод поворота указанного корабля.

-       public int shot(int x, int y) - метод выстрела по полю по указанным координатам. Возвращает значение типа int: -1, если выстрел был за пределы поля или в уже подстреленную клетку, 0, если было попадание в пустую клетку, 1, если было попадание в корабль.

-       public int smartShot() - метод, осуществляющий "умный" выстрел по полю, то есть выстрел, который пытается добить уже ранее подбитые корабли.

-       public boolean hasShotAt(int x, int y) - метод, определяющий, был ли в данной игре осуществлен выстрел по указанной клетке.

-       public int getLastShotX() - метод получения координаты x последнего выстрела по полю.

-       public int getLastShotY() - метод получения координаты y последнего выстрела по полю.

-       public boolean allShipsArePlaced() - метод, определяющий, все ли корабли на поле расставлены.

-       public boolean isDefeated() - метод, определяющий, "побеждено" ли поле, то есть все корабли на нем убиты.

-       public void paint(Graphics g, int x, int y) - метод, отвечающий за то, как будет отрисовываться поле.

-       public boolean isValid(Ship changedShip) - метод, определяющий, является ли поле действительным, т.е. в нем нет пересечений кораблей и все корабли находятся в пределах поля.

И последний класс, реализующий корабль - public class Ship.

-    private int xPos - координата x корабля на поле.

-       private int yPos - координата y корабля на поле.

-       private int size - длина корабля.

-       private boolean horizontal - поле логического типа, определяющее ориентацию корабля, то есть, является корабль горизонтальным или нет.

Public Ship(int xPos, int yPos, int size, boolean horizontal) - конструктор, создающий корабль с указанными координатами, размером и ориентацией.

Опишем методы класса:

-    public boolean contains(int x, int y) - метод, определяющий, стоит ли корабль на указанной клетке.

-       public boolean overlaps(Ship s) - метод, определяющий, правильно ли корабли стоят относительно друг друга, то есть не пересекаются и не соприкасаются.

-       public int getXPos() - метод, возвращающий координату x корабля.

-       public int getYPos() - метод, возвращающий координату y корабля.

-       public int getEndXPos() - метод, возвращающий координату x конечной клетки корабля.

-       public int getEndYPos() - метод, возвращающий координату y конечной клетки корабля.

-       public void setSize(int newSize) - метод установки размера корабля.

-       public void rotate() - метод поворота корабля.

-       public boolean isHorizontal() - метод, определяющий ориентацию корабля, то есть, является корабля горизонтальным или нет.

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

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


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


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


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


ЗАКЛЮЧЕНИЕ

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

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

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

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

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

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

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

ПРИЛОЖЕНИЕ

Класс Field

Метод, осуществляющий "умный" выстрел по полю, то есть выстрел, который пытается добить уже ранее подбитые корабли:

public int smartShot() {(Ship ship : ships) {(isShipDead(ship)) {;

}shipHitStartOffset = -1,= -1,= 0;x = ship.getXPos(),= ship.getYPos();(int i = x; i <= ship.getEndXPos() && shipHitEndOffset == -1; i++) {(int j = y; j <= ship.getEndYPos() && shipHitEndOffset == -1; j++) {(shots[i][j]) {(shipHitStartOffset == -1) {= posOnShip;

}

} else {(shipHitStartOffset > -1 && shipHitEndOffset == -1) {= posOnShip - 1;

}

}++;

}

}(shipHitStartOffset == -1 && shipHitEndOffset == -1) {;

}(shipHitStartOffset > -1 && shipHitEndOffset == -1) {= ship.isHorizontal() ? ship.getEndXPos() : ship.getEndYPos();

}(shipHitStartOffset == shipHitEndOffset) {shotX = (ship.isHorizontal() ? x + shipHitStartOffset : x);shotY = (ship.isHorizontal() ? y : y + shipHitStartOffset);[][] coordOffsets = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};optionX = 0, optionY = 0;optionalShotIsPossible = true;(int i = 0; i < 4; i++) {= true;= shotX + coordOffsets[i][0];= shotY + coordOffsets[i][1];(optionX < 0 || optionY < 0 || optionX >= size || optionY >= size

|| shots[optionX][optionY]) {= false;;

};

}(optionalShotIsPossible) {shot(optionX, optionY);

}

} else {startShotX = (ship.isHorizontal() ? x + shipHitStartOffset : x);startShotY = (ship.isHorizontal() ? y : y + shipHitStartOffset);endShotX = (ship.isHorizontal() ? x + shipHitEndOffset : x);endShotY = (ship.isHorizontal() ? y : y + shipHitEndOffset);(ship.isHorizontal()) {(startShotX > 0 && !shots[startShotX - 1][startShotY]) {shot(startShotX - 1, startShotY);

}(endShotX < size - 1 && !shots[endShotX + 1][endShotY]) {shot(endShotX + 1, endShotY);

}

} else {(startShotY > 0 && !shots[startShotX][startShotY - 1]) {shot(startShotX, startShotY - 1);

}(endShotY < size - 1 && !shots[endShotX][endShotY + 1]) {shot(endShotX, endShotY + 1);

}

}

}

}

Похожие работы на - Разработка игры 'Морской бой'

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!