python — Не правильно работает определение корабля в морском бое
Ваша проблема заключалась в том, что вы нигде не храните знания о кораблях. Занятые ячейки поля, что вы храните в players[].board
— этой информации не достаточно. Потому что, допустим, вы попадаете трехпалубнику в середину, и в результате в players[].board
он, по сути, «разваливается» на два однопалубника. Отсюда и получается полное потопление при попадании в любую из этих частей-однопалубников.
Итак, во-первых я замучился задавать корабли через ввод координат (честно говоря на третьем корабле). Поэтому я переделал так, что надо выделить нужное количество ячеек таблицы и нажать на кнопку «Поставить корабль». Заодно совместил задание однопалубника и остальных (не понял зачем его отдельно обрабатывали). Кнопки теперь эквивалентные, но мне было лень переделывать. Так что сами, к примеру, на их место поставьте счётчики оставшихся кораблей (что сейчас во всплывающих подсказках) и сделаете одну общую кнопку.
Я добавил в ваш класс
ещё и данные о кораблях `ships’. Этот массив содержит все корабли с координатами всех их частей и длиной. При попадании, у соответствующего корабля уменьшается длина, и корабль считается убитым при достижении нулевой длины.
Ну и схлопнул в циклы кучу однотипных строчек. Хотя в этом направлении ещё работать и работать. Подсказка: чтобы не плодить кучу однотипных простых переменных и писать кучи похожих строк кода — чаще используйте списки и словари, по которым потом можно итерироваться в циклах или адресоваться по индексу безо всяких if
.
import sys import re from random import randrange import sqlite3 from PyQt5.QtGui import QPixmap, QIcon from PyQt5.QtCore import QBasicTimer, QCoreApplication from PyQt5.QtWidgets import QApplication, QMainWindow, \ QStackedWidget, QMessageBox, QInputDialog, QTableWidgetItem, QAction from PyQt5 import QtCore, QtGui from PyQt5 import QtWidgets def natural_key(string_): return [int(s) if s. isdigit() else s for s in re.split(r'(\d+)', string_)] class Ui_MainWindow_ready(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(960, 540) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.gridLayout = QtWidgets.QGridLayout(self.centralwidget) self.gridLayout.setObjectName("gridLayout") self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.playerLabel = QtWidgets.QLabel(self.centralwidget) font = QtGui.QFont() font.setPointSize(16) self.playerLabel.setFont(font) self.playerLabel.setObjectName("playerLabel") self.horizontalLayout_2.addWidget(self.playerLabel) self.gridLayout.addLayout(self.horizontalLayout_2, 0, 0, 1, 1) self.readyButton = QtWidgets.QPushButton(self.centralwidget) font = QtGui.QFont() font.setPointSize(24) self.readyButton.setFont(font) self.readyButton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) self.readyButton.setObjectName("readyButton") self.gridLayout.addWidget(self.readyButton, 0, 2, 1, 2) self.verticalLayout_2 = QtWidgets.QVBoxLayout() self.verticalLayout_2.setObjectName("verticalLayout_2") self.linkorButton = QtWidgets.QPushButton(self.centralwidget) font = QtGui.QFont() font.setPointSize(10) font.setItalic(False) font.setStrikeOut(False) self.linkorButton.setFont(font) self.linkorButton.setObjectName("linkorButton") self.verticalLayout_2.addWidget(self.linkorButton) self.kreyserButton = QtWidgets.QPushButton(self.centralwidget) self.kreyserButton.setFont(font) self.kreyserButton.setObjectName("kreyserButton") self.verticalLayout_2.addWidget(self.kreyserButton) self.esminecButton = QtWidgets. QPushButton(self.centralwidget) self.esminecButton.setFont(font) self.esminecButton.setObjectName("esminecButton") self.verticalLayout_2.addWidget(self.esminecButton) self.torpedButton = QtWidgets.QPushButton(self.centralwidget) self.torpedButton.setFont(font) self.torpedButton.setObjectName("torpedButton") self.verticalLayout_2.addWidget(self.torpedButton) self.gridLayout.addLayout(self.verticalLayout_2, 1, 3, 1, 1) self.boardMap = QtWidgets.QTableWidget(self.centralwidget) font = QtGui.QFont() font.setPointSize(10) font.setBold(True) font.setWeight(75) self.boardMap.setFont(font) self.boardMap.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded) self.boardMap.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustIgnored) self.boardMap.setObjectName("boardMap") self.boardMap.setColumnCount(10) self.boardMap.setRowCount(10) for i in range(10): item = QtWidgets. QTableWidgetItem() self.boardMap.setVerticalHeaderItem(i, item) item = QtWidgets.QTableWidgetItem() self.boardMap.setHorizontalHeaderItem(i, item) self.gridLayout.addWidget(self.boardMap, 1, 0, 1, 1) self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout.setObjectName("verticalLayout") self.linkorImage = QtWidgets.QLabel(self.centralwidget) self.linkorImage.setText("") self.linkorImage.setObjectName("linkorImage") self.verticalLayout.addWidget(self.linkorImage) self.kreyserImage = QtWidgets.QLabel(self.centralwidget) self.kreyserImage.setText("") self.kreyserImage.setObjectName("kreyserImage") self.verticalLayout.addWidget(self.kreyserImage) self.esminecImage = QtWidgets.QLabel(self.centralwidget) self.esminecImage.setText("") self.esminecImage.setObjectName("esminecImage") self.verticalLayout.addWidget(self.esminecImage) self. torpedImage = QtWidgets.QLabel(self.centralwidget) self.torpedImage.setText("") self.torpedImage.setObjectName("torpedImage") self.verticalLayout.addWidget(self.torpedImage) self.gridLayout.addLayout(self.verticalLayout, 1, 2, 1, 1) self.verticalLayout_3 = QtWidgets.QVBoxLayout() self.verticalLayout_3.setObjectName("verticalLayout_3") self.lcdNumber = [] for i in range(4, 0, -1): self.lcdNumber.append(QtWidgets.QLCDNumber(self.centralwidget)) self.lcdNumber[-1].setProperty("intValue", i) self.lcdNumber[-1].setObjectName(f"lcdNumber_{4-i}") self.verticalLayout_3.addWidget(self.lcdNumber[-1]) self.gridLayout.addLayout(self.verticalLayout_3, 1, 1, 1, 1) self.label = QtWidgets.QLabel(self.centralwidget) font = QtGui.QFont() font.setPointSize(8) self.label.setFont(font) self.label.setObjectName("label") self.gridLayout.addWidget(self. label, 0, 1, 1, 1) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 960, 26)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.playerLabel.setText(_translate("MainWindow", "Игрок1")) self.readyButton.setText(_translate("MainWindow", "Я готов")) for w in [self.linkorButton, self.kreyserButton, self.esminecButton, self.torpedButton]: w.setText(_translate("MainWindow", "Поставить корабль")) for i in range(10): item = self.boardMap.verticalHeaderItem(i) item.setText(_translate("MainWindow", str(i+1))) for i, c in enumerate("ABCDEFGHIJ"): item = self. boardMap.horizontalHeaderItem(i) item.setText(_translate("MainWindow", c)) self.label.setText(_translate("MainWindow", "Количество ячеек.")) class Ui_MainWindow_pvp(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(960, 577) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.gridLayout = QtWidgets.QGridLayout(self.centralwidget) self.gridLayout.setObjectName("gridLayout") self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.board1Label = QtWidgets.QLabel(self.centralwidget) font = QtGui.QFont() font.setPointSize(16) self.board1Label.setFont(font) self.board1Label.setObjectName("board1Label") self.horizontalLayout.addWidget(self.board1Label) self.linkorP1 = QtWidgets.QLabel(self.centralwidget) self.linkorP1.setText("") self.linkorP1.setObjectName("linkorP1") self.horizontalLayout.addWidget(self.linkorP1) self.kreyserP1 = QtWidgets.QLabel(self.centralwidget) self.kreyserP1.setText("") self.kreyserP1.setObjectName("kreyserP1") self.horizontalLayout.addWidget(self.kreyserP1) self.esminecP1 = QtWidgets.QLabel(self.centralwidget) self.esminecP1.setText("") self.esminecP1.setObjectName("esminecP1") self.horizontalLayout.addWidget(self.esminecP1) self.torpedP1 = QtWidgets.QLabel(self.centralwidget) self.torpedP1.setText("") self.torpedP1.setObjectName("torpedP1") self.horizontalLayout.addWidget(self.torpedP1) self.gridLayout.addLayout(self.horizontalLayout, 0, 0, 1, 1) self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.linkorP2 = QtWidgets.QLabel(self.centralwidget) self.linkorP2. setText("") self.linkorP2.setObjectName("linkorP2") self.horizontalLayout_2.addWidget(self.linkorP2) self.kreyserP2 = QtWidgets.QLabel(self.centralwidget) self.kreyserP2.setText("") self.kreyserP2.setObjectName("kreyserP2") self.horizontalLayout_2.addWidget(self.kreyserP2) self.esminecP2 = QtWidgets.QLabel(self.centralwidget) self.esminecP2.setText("") self.esminecP2.setObjectName("esminecP2") self.horizontalLayout_2.addWidget(self.esminecP2) self.torpedP2 = QtWidgets.QLabel(self.centralwidget) self.torpedP2.setText("") self.torpedP2.setObjectName("torpedP2") self.horizontalLayout_2.addWidget(self.torpedP2) self.board2Label = QtWidgets.QLabel(self.centralwidget) font = QtGui.QFont() font.setPointSize(16) self.board2Label.setFont(font) self.board2Label.setObjectName("board2Label") self.horizontalLayout_2.addWidget(self.board2Label) self. gridLayout.addLayout(self.horizontalLayout_2, 0, 5, 1, 1) self.tableWidget = QtWidgets.QTableWidget(self.centralwidget) self.tableWidget.setMinimumSize(QtCore.QSize(441, 461)) self.tableWidget.setObjectName("tableWidget") self.tableWidget.setColumnCount(10) self.tableWidget.setRowCount(10) for i in range(10): item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(i, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setHorizontalHeaderItem(i, item) self.gridLayout.addWidget(self.tableWidget, 1, 0, 1, 3) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout.addItem(spacerItem, 0, 1, 1, 1) self.vsLable = QtWidgets.QLabel(self.centralwidget) font = QtGui.QFont() font.setFamily("Digital Counter 7") font.setPointSize(36) self.vsLable.setFont(font) self. vsLable.setText("") self.vsLable.setObjectName("vsLable") self.gridLayout.addWidget(self.vsLable, 0, 2, 1, 2) self.tableWidget_2 = QtWidgets.QTableWidget(self.centralwidget) self.tableWidget_2.setMinimumSize(QtCore.QSize(441, 461)) self.tableWidget_2.setObjectName("tableWidget_2") self.tableWidget_2.setColumnCount(10) self.tableWidget_2.setRowCount(10) for i in range(10): item = QtWidgets.QTableWidgetItem() self.tableWidget_2.setVerticalHeaderItem(i, item) item = QtWidgets.QTableWidgetItem() self.tableWidget_2.setHorizontalHeaderItem(i, item) self.gridLayout.addWidget(self.tableWidget_2, 1, 3, 1, 3) spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout.addItem(spacerItem1, 0, 4, 1, 1) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self. menubar.setGeometry(QtCore.QRect(0, 0, 960, 26)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "Game PVP")) for i in range(10): item = self.tableWidget.verticalHeaderItem(i) item.setText(_translate("MainWindow", str(i+1))) item = self.tableWidget_2.verticalHeaderItem(i) item.setText(_translate("MainWindow", str(i+1))) for i, c in enumerate("ABCDEFGHIJ"): item = self.tableWidget.horizontalHeaderItem(i) item.setText(_translate("MainWindow", c)) item = self.tableWidget_2.horizontalHeaderItem(i) item.setText(_translate("MainWindow", c)) COORDS = dict(("ABCDEFGHIJ"[x]+str(y+1), (y, x)) for x in range(10) for y in range(10)) players = [] def new_cell_mul(): # Когда ставлю звёздочку в QTableWidget cell_mul = QTableWidgetItem("*") cell_mul. setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) return cell_mul def new_cell_x(): # Когда ставлю крестик в QTableWidget cell_x = QTableWidgetItem("X") cell_x.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) return cell_x def new_cell_dot(): # Когда ставлю точку в QTableWidget cell_dot = QTableWidgetItem(".") cell_dot.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) return cell_dot class ReadyMain(QMainWindow, Ui_MainWindow_ready): """Меню подготовления к самой игре""" def __init__(self, parent=None): super(ReadyMain, self).__init__(parent) self.setupUi(self) self.map = SeaMap(self.boardMap) self.new_count() # Обновление переменных-счётчиков self.new_map() # Обновление карты self.initUI() def initUI(self): # Задаю цвет и форму кнопкам for w in [self.linkorButton, self.kreyserButton, self.esminecButton, self.torpedButton]: w. setStyleSheet("color: white; background-color: #b6afa9;" "border-radius: 10px;") w.clicked.connect(self.setShip) self.readyButton.setStyleSheet("color: white; background-color: #b6afa9;" "border-radius: 10px;") self.readyButton.clicked.connect(self.start) def new_map(self): # Метод создаёт(обновляет) карту for i in range(self.boardMap.columnCount()): for j in range(self.boardMap.rowCount()): self.boardMap.setItem(i, j, new_cell_dot()) self.boardMap.resizeColumnsToContents() self.boardMap.resizeRowsToContents() self.boardMap.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch) self.boardMap.verticalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch) def new_db(self, who): # Занесения данных в базу данных self.con = sqlite3.connect("Players.db") self.cur = self.con.cursor() for i, j in COORDS. items(): self.cur.execute(f"""UPDATE {who} SET {i[0]} = '{str(self.boardMap.item(*COORDS[i]).text())}' WHERE id={int(i[1:])}""") self.con.commit() def start(self): """Если Игрок1 нажал кнопку, то Игрок2 начинает заполнять данные. Иначе начинает игру""" # Проверка, все ли корабли поставлены if any(self.count.values()): self.error("Вы не поставили все корабли") return if self.sender().text() == 'Я готов': self.new_db("Player1") players.append(Player('Player1', self.boardMap, self.ships)) # Добавление в список игрока players self.readyButton.setText("Я готов") self.playerLabel.setText("Игрок 2") self.new_count() # Обновление переменных-счётчиков self.new_map() # Обновление карты else: self.new_db("Player2") players.append(Player('Player2', self.boardMap, self. ships)) # Добавление в список игрока windows.setCurrentIndex(1) def new_count(self): # Создание(обновление) переменных-счётчиков self.count = { 'L': 1, 'K': 2, 'E': 3, 'T': 4} self.ships = { 'L': [], 'K': [], 'E': [], 'T': []} for who in "TEKL": {'L': self.linkorButton, 'K': self.kreyserButton, 'E': self.esminecButton, 'T': self.torpedButton}[who].setToolTip(f"{self.count[who]} left") def coords_is_right(self, new_coords, num, mode='dual'): # проверка на правильность введённых координат new_coords[0] = new_coords[0].upper() new_coords[1] = new_coords[1].upper() if mode != 'v': return (COORDS[new_coords[1]][0] - COORDS[new_coords[0]][0] == 0 and COORDS[new_coords[1]][1] - COORDS[new_coords[0]][1] == num) or \ (COORDS[new_coords[1]][0] - COORDS[new_coords[0]][0] == num and COORDS[new_coords[1]][1] - COORDS[new_coords[0]][1] == 0) return (COORDS[new_coords[1]][0] - COORDS[new_coords[0]][0] == num and COORDS[new_coords[1]][1] - COORDS[new_coords[0]][1] == 0) def check(self, c1, c2, i, num): # Проверка, если в координатах есть * или X, if num == 1: return (str(self. boardMap.item(c1 + i, c2).text()) == "*" or str(self.boardMap.item(c1 + i, c2).text()) == "X") return (str(self.boardMap.item(c1, c2 + i).text()) == "*" or str(self.boardMap.item(c1, c2 + i).text()) == "X") def error(self, text="Недопустимый размер или форма корабля."): # Вызов ошибки QMessageBox.critical(self, 'Ошибка!', text) def setShipByType(self, coords, num, who): # Создание любого корабля на поле error = False new_coords = coords.split('-') if self.coords_is_right(new_coords, num): vertical = self.coords_is_right(new_coords, num, 'v') c1, c2 = COORDS[new_coords[0]][0], COORDS[new_coords[0]][1] for i in range(num + 1): if self.check(c1, c2, i, 1 if vertical else 2): self.error("Сюда нельзя поставить корабль") return coords_as_num = [] for i in range(num + 1): if not vertical: self. boardMap.setItem(c1, c2 + i, new_cell_x()) coords_as_num.append((c1, c2 + i)) if i == num: self.map.shoot(c1, c2 + i, "sink") else: self.boardMap.setItem(c1 + i, c2, new_cell_x()) coords_as_num.append((c1 + i, c2)) if i == num: self.map.shoot(c1 + i, c2, 'sink') self.count[who] -= 1 self.ships[who].append([coords_as_num, {'L': 4, 'K': 3, 'E': 2, 'T': 1}[who]]) {'L': self.linkorButton, 'K': self.kreyserButton, 'E': self.esminecButton, 'T': self.torpedButton}[who].setToolTip(f"{self.count[who]} left") else: self.error() def setShip(self): # Создание корабля items = sorted(["ABCDEFGHIJ"[item.column()]+str(item.row()+1) for item in self.boardMap.selectedItems()], key=natural_key) n = len(items) if 1 <= n <= 4: if self. count[' TEKL'[n]] == 0: self.error("Все корабли этого типа поставлены") return try: self.setShipByType(f"{items[0]}-{items[-1]}", n-1, " TEKL"[n]) except BaseException: self.error() else: self.error() class PVPMain(QMainWindow, Ui_MainWindow_pvp): def __init__(self, parent=None): super(PVPMain, self).__init__(parent) self.setupUi(self) self.turn = "Игрок1" # Очередь первого игрока self.map = [] self.map.append(SeaMap(self.tableWidget)) self.map.append(SeaMap(self.tableWidget_2)) self.new_boards() # Создание игрового поля self.initUI() def initUI(self): self.tableWidget.cellClicked[int, int].connect(self.course1) self.tableWidget_2.cellClicked[int, int].connect(self.course2) self.board1Label.setText("Игрок 1") self.board2Label.setText("Игрок 2") self.board1Label.setStyleSheet("background-color: #B22222") self. board2Label.setStyleSheet("background-color: #1E90FF") self.tableWidget.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch) self.tableWidget.verticalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch) self.tableWidget_2.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch) self.tableWidget_2.verticalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch) def new_boards(self): for i in range(self.tableWidget.columnCount()): for j in range(self.tableWidget.rowCount()): self.tableWidget.setItem(i, j, new_cell_dot()) for i in range(self.tableWidget_2.columnCount()): for j in range(self.tableWidget_2.rowCount()): self.tableWidget_2.setItem(i, j, new_cell_dot()) self.tableWidget.resizeColumnsToContents() self.tableWidget.resizeRowsToContents() self.tableWidget_2.resizeColumnsToContents() self.tableWidget_2. resizeRowsToContents() def change_of_course(self): # Смена хода if self.turn == "Игрок1": self.turn = "Игрок2" self.board2Label.setStyleSheet("background-color: #B22222") self.board1Label.setStyleSheet("background-color: #1E90FF") players[0], players[1] = players[1], players[0] elif self.turn == "Игрок2": self.turn = "Игрок1" self.board1Label.setStyleSheet("background-color: #B22222") self.board2Label.setStyleSheet("background-color: #1E90FF") players[0], players[1] = players[1], players[0] def info(self, text="Координаты правильные"): # Информационное табло QMessageBox.information(self, "INFO", text) def error(self, text="Вы уже стреляли в эту клетку."): # Вызов ошибки QMessageBox.critical(self, 'Ошибка!', text) def check(self): if all(players[1].board[i][j] == 0 for i in range(10) for j in range(10)): self.info(f"Выиграл {self. turn}!") windows.setCurrentIndex(5) return def course1(self, c1, c2): self.course(c1, c2, 1) def course2(self, c1, c2): self.course(c1, c2, 2) def course(self, r, c, num): # Ход if self.turn[-1] == '1' and num == 2 or self.turn[-1] == '2' and num == 1: flag = True coord = (r, c) else: flag = False if num == 1: if str(self.tableWidget.item(r, c).text()) == "*" or str(self.tableWidget.item(r, c).text()) == "X" : self.error() return else: if str(self.tableWidget_2.item(r, c).text()) == "*" or str(self.tableWidget_2.item(r, c).text()) == "X" : self.error() return if flag: if self.dot_or_notdot((r, c)): dead = self.shootAndCheckIfShipIsDead((r, c)) what = 'sink' if dead else 'hit' pl = 1 if self.turn[-1] == '1' else 0 self. map[pl].shoot(r, c, what) players[1].board[r][c] = 0 self.info("Корабль потоплен!" if dead else "Попадание!") self.check() else: pl = 1 if self.turn[-1] == '1' else 0 self.map[pl].shoot(r, c, 'miss') self.info("Промах!") self.change_of_course() else: QMessageBox.critical(self, "Ошибка!", "Не ваша очередь!") def dot_or_notdot(self, coord): # Проверка попал, не попал new_coord = None for key, value in COORDS.items(): if value == coord: new_coord = (key, value) break con = sqlite3.connect("Players.db") cur = con.cursor() result = cur.execute( f"""SELECT {new_coord[0][0]} FROM Player{players[1].who[-1]} WHERE id={new_coord[1][0] + 1}""").fetchone() if result[0] == "." or result[0] == "*": return False return True def shootAndCheckIfShipIsDead(self, pos): # Стреляем по кораблю и проверяем, потопил или ранил x, y = pos if 0 <= x < 10 and 0 <= y < 10: if players[1]. board[x][y] == 1: for who in "TEKL": for ship in players[1].ships[who]: if pos in ship[0]: ship[1] -= 1 return ship[1] == 0 return False class Player: def __init__(self, who, map, ships): self.who = who self.board = [] self.ships = ships for i in range(10): self.board.append([]) for j in range(10): self.board[i].append(0) for i in range(10): for j in range(10): if str(map.item(i, j).text()) == 'X': self.board[i][j] = 1 class SeaMap: def __init__(self, board): self.map = board def shoot(self, row, col, result): if result == 'miss': self.map.setItem(row, col, new_cell_mul()) elif result == 'hit': self.map.setItem(row, col, new_cell_x()) elif result == 'sink': for i in range(row - 1, row + 2): for j in range(col - 1, col + 2): if 0 <= i < 10 and 0 <= j < 10: if str(self. map.item(i, j).text()) == '.': self.map.setItem(i, j, new_cell_mul()) self.map.setItem(row, col, new_cell_x()) for j in range(10): if str(self.map.item(row, j).text()) == 'X': col = j for i in range(row - 1, row + 2): for u in range(col - 1, col + 2): if 0 <= i < 10 and 0 <= u < 10: if str(self.map.item(i, u).text()) == '.': self.map.setItem(i, u, new_cell_mul()) for v in range(10): if str(self.map.item(v, col).text()) == 'X': row = v for v in range(row - 1, row + 2): for u in range(col - 1, col + 2): if 0 <= v < 10 and 0 <= u < 10: if str(self.map.item(v, u).text()) == '.': self. map.setItem(v, u, new_cell_mul()) if __name__ == '__main__': app = QApplication(sys.argv) ready_window = ReadyMain() pvp_window = PVPMain() windows = QStackedWidget() windows.addWidget(ready_window) # 0 windows.addWidget(pvp_window) # 1 windows.setWindowTitle("Морской бой") windows.show() sys.exit(app.exec())
Игра «Морской бой».
Актуальность: эта игра помогает развить логическое и стратегическое мышление, интуицию и память для победы, когда стараешься предугадать ходы противника, чтобы достаточно нелегко, правильно рассчитываешь свои ходы, рационально расставляешь корабли. Данная игра очень актуальна на сегодняшний день.
Цель: минимизировать количество переходов ходов на основе разработки стратегии расстановки своих кораблей и ведения огня по кораблям противника.
Задача: Научиться обосновывать выбор стратегии игры. Даже в такой игре он не должен носить исключительно интуитивный характер, а должен строиться на предписаниях теории.
Правила игры: В практической части будем рассматривать наиболее распространённый вариант со следующим набором кораблей: Все перечисленные корабли должны быть размещены на квадратном поле 10 на 10 клеток, при этом корабли не могут соприкасаться ни углами, ни сторонами. Строки игрового поля нумеруются сверху вниз, а вертикальные ряды помечаются русскими буквами от «А» до «К» (при этом буквы «Ё» и «Й» пропускают).
Рядом рисуется вражеское поле аналогичного размера. При удачном выстреле по кораблю противника на соответствующей клетке вражеского поля ставится крестик и производится повторный выстрел, при неудачном выстреле в соответствующей клетке ставится точка, и ход переходит к противнику.
В игру «морской бой» играют два человека, которые по очереди называют координаты кораблей на карте противника. Если на поле с указанными координатами располагается корабль, то этот корабль или часть его «топится», а попавший имеет право сделать ещё один ход.
При размещении корабли не могут касаться друг друга углами. Палубы кораблей надо строить «в линейку», а не изгибами. Главное: нельзя строить палубы одного корабля по диагонали. Перед началом боевых действий игроки бросают жребий или договариваются, кто будет ходить первым. В игре морской бой всегда есть элемент случайности, но его можно свести к минимуму.
Стратегия состоит из 2-х частей. 1) Правильная стрельба по противнику. 2) Правильная расстановка кораблей. Принципы рациональной стратегии стрельбы
Первым и самым очевидным правилом оптимальной стрельбы является следующее правило: не стрелять по клеткам непосредственно окружающим уничтоженный корабль противника.
Из первого правила сразу вытекает второе: если вам удалось подбить вражеский корабль, необходимо сразу же его добить, чтобы как можно раньше получить список гарантировано свободных клеток.
Третье правило вытекает из первых двух: необходимо в первую очередь пытаться подбить самые крупные корабли противника. Это обосновывается тем что, уничтожив вражеский линкор, мы в лучшем случае получим информацию сразу о 14 гарантировано свободных клетках, а уничтожив крейсер, всего о 12.
Таким образом, оптимальную стратегию стрельбы можно свести к целенаправленному поиску и уничтожению самых крупных кораблей противника. К сожалению, сформулировать стратегию мало, необходимо предложить способ (тактику) её реализации.
Для начала давайте рассмотрим участок игрового поля размером 4 на 4 клетки. Если в рассматриваемом участке есть вражеский линкор, то его гарантировано можно подбить не более чем за 4 выстрела. Для этого надо стрелять так, чтобы на каждой горизонтали и вертикали было ровно по одной проверенной клетке. Ниже представлены все варианты такой стрельбы (без учёта отражений и поворотов).
Среди всех этих вариантов, оптимальными на поле 10 на 10 клеток являются только первые два варианта, гарантирующие попадание в линкор максимум за 24 выстрела.
После того, как уничтожен вражеский линкор, необходимо начинать поиск крейсеров, а затем и эсминцев. При этом, как вы уже догадались, можно воспользоваться аналогичной методикой. Только теперь необходимо разбивать поле на квадраты со стороной в 3 и 2 клетки соответственно.
Если при поиске линкора вы использовали вторую стратегию, то для поиска крейсеров и эсминцев вам необходимо стрелять по следующим полям (зелёным отмечены поля, по которым вы уже стреляли при поиске линкора):
Для поиска катеров оптимальной стратегии не существует, поэтому в конце игры приходится опираться в основном на удачу.
Последовательность лучших ходов для начала игры.
Если обратиться к математической теории, то можно построить карту вероятности размещения кораблей:
Исходя из этой карты, последовательность «лучших ходов» при постоянных промахах выглядит так (см. рисунок):
C1, J8, A8, h2, A4, J4, D10, G10, E1, D2, B3, A2, C9, B10, H9, I10, I7, J6, I5, H6, J2, I3, h5, G5, G2, F3, E4, B7, A6, B5, C6, C3, D4, D5, F6.
Как расставить «свои» корабли
Оптимальная стратегия размещения кораблей в некотором смысле обратна оптимальной стратегии стрельбы. При стрельбе, мы пытались найти самые крупные корабли, чтобы сократить количество клеток, которые нужно проверять на основе гарантировано свободных клеток. Значит, при размещении корабли надо ставить таким образом, чтобы в случае их потери минимизировать количество гарантировано свободных клеток. Как вы помните, линкор в центре поля открывает для противника сразу 14 полей, но линкор, стоящий в углу, открывает для противника всего 6 полей:
Аналогично, крейсер, стоящий в углу, вместо 12 полей открывает всего 6. Таким образом, разместив крупные корабли вдоль границы поля, вы оставляете больший простор для катеров. Т.к. стратегии для поиска катеров нет, противнику придётся стрелять наугад, и чем больше свободных полей у вас останется к моменту ловли катеров, тем тяжелее будет выиграть противнику.
Ниже представлено три способа размещения крупных кораблей, которые оставляют большой простор для катеров (отмечено синим цветом):
Каждая из приведённых расстановок оставляет для катеров ровно 60 свободных клеток, а это значит, что вероятность случайно попасть в катер составляет 0,066. Для сравнения стоит привести случайную расстановку кораблей:
При такой расстановке для катеров остаётся всего 21 клетка, а это значит, что вероятность попадания по катеру составляет уже 0,19, т.е. почти в 3 раза выше.
Вывод: Выгодная расстановка кораблей в соответствии с тактикой действительно позволяет выигрывать. При хорошем анализе и продуманной тактике, полагаться на интуицию и удачу нет необходимости, но все же учитывать случайности стоит.
Морские сражения в войне 1812 года
Война 1812 года | Статья
Четыре ключевых сражения войны
Военный корабль США » Конституция» побеждает HMS Guerriere в войне 1812 года. Командование истории и наследия ВМС СШАМорские сражения в эпоху парусного спорта, длившуюся с 16 по середину 19 века, могут показаться современному глазу странными. Парусные корабли были фактически плавучими деревнями, причем самые большие линейные корабли были вооружены большим количеством артиллерии, чем некоторые армии. Из-за зависимости корабля от ветра в качестве движущей силы бой часто напоминал смертельный танец между сражающимися, который мог превратиться в кровавую драку на близком расстоянии.
Важно понимать различные типы военных кораблей, которые бороздили волны в этот период, что относится как к американской революции, так и к войне 1812 года. Крупнейшими военно-морскими кораблями были линейные корабли, которые часто классифицируются по британской рейтинговой системе. : первосортные, второсортные и третьесортные. Эти медленные и хорошо вооруженные корабли составляли ядро боевой линии и вели перестрелку со своими противниками такого же размера.
Третий ранг составлял костяк многих флотов, особенно британских, и обычно имел семьдесят четыре орудия на трех палубах с экипажем до 700 человек. Самые большие, первоклассные, были огромными по размеру и огневой мощи. Самый известный пример, HMS 9.0011 Victory , флагман адмирала Нельсона в Трафальгаре, имел 104 пушки, стрелял бортовым весом 1148 фунтов и нуждался в экипаже из 800 человек, чтобы сражаться и плавать.
Во время Американской революции и войны 1812 года крупные сражения флота в Европе были редкостью, а бои между меньшими фрегатами, шлюпами и бригами были гораздо более частыми. Эти корабли не предназначались для боя на линии, а использовались как «крейсеры» из-за их скорости, маневренности и дальности хода. Им часто разрешалось путешествовать самостоятельно в поисках подходящих целей противника или прикрепляться к большим флотам в качестве разведчиков, пикетов и курьеров. Многие из самых известных действий обеих войн были дуэлями между этими меньшими, но смертоносными кораблями.
USS Конституция против HMS Guerriere , 19 августа 1812 года, 400 миль к юго-востоку от Галифакса, Новая Шотландия.
USS «Конституция» был одним из «первоначальных шести» фрегатов, заказанных в 1794 году. Зная, что молодой флот США не может сравниться с европейскими державами на воде, эти корабли были спроектированы так, чтобы быть быстрее, выносливее и вести более тяжелый залп. чем их европейские аналоги; позволяя им побеждать корабли аналогичного размера и уклоняться от более крупных линейных кораблей. «Конституция» считалась тяжелым фрегатом с сорока четырьмя орудиями и экипажем из 450 человек. HMS Guerriere , захваченный у французов в 1806 году, был британским фрегатом пятого ранга с тридцатью восемью орудиями и экипажем из 272 человек. под командованием капитана Исаака Халла заметил на горизонте неизвестный корабль и решил провести расследование. Ранее Конституция столкнулась с большим британским флотом, включая Герьер и ее капитана Джеймса Ричарда Дакреса, но сумела сбежать. Оба корабля одновременно узнали друг друга и расчистили свои палубы для боя.
Первоначально Guerriere выпустил бортовой залп, который не промахнулся, развернулся против ветра и побежал, время от времени рыская, чтобы выстрелить бортовым залпом в преследующую Конституцию . Во время этой сорокапятиминутной погони пушечное ядро безвредно отскочило от Конституции, за что она получила устойчивое прозвище «Старая Железнобокая». Когда Конституция сократила разрыв до нескольких сотен ярдов, капитан Халл приказал поднять дополнительные паруса, чтобы быстро преодолеть последнее расстояние. Guerriere не повторил этот маневр, и оба корабля сблизились на «полупистолетный выстрел», в упор, и начали обмениваться бортовыми залпами.
В течение пятнадцати минут оба корабля колотили друг друга, но более тяжелые орудия и более прочный корпус Конституции оказались очень эффективными. Guerriere потеряла свою бизань-мачту, которая упала за борт и действовала как большой руль, поворачивая корабль. Воспользовавшись неподвижностью Герьер , Конституция пересекла уязвимую переднюю часть вражеского корабля и нанесла карающий залп, пронесший Герьер от носа до кормы, в результате чего Грот-мачта Guerriere также упадет. «Конституция » снова нанесла удар по противнику, но во время этого маневра оба корабля запутались. На обоих кораблях были сформированы абордажные группы, но они не смогли пересечь запутанный такелаж и бушприт в сильном волнении.
Корабли оставались запутанными, обмениваясь пушечным и мушкетным огнем, пока они не развернулись и не вырвались на свободу. Guerriere попытался поднять паруса и бежать, но его мачты и такелаж были настолько сильно повреждены, что это оказалось невозможным. Конституция сумела ненадолго выйти из зацепления и отремонтировать такелаж, прежде чем снова атаковать Герьер . Чувствуя, что его корабль не выдержит еще одной атаки, капитан Дакрес, раненный мушкетной пулей, дал сигнал о своей капитуляции, приказав выстрелить из пушки в направлении, противоположном Конституции . Халл приказал лейтенанту отправиться на вражеский корабль для расследования, который спросил, сдается ли Guerriere , на что Дакрес ответил: «Ну, сэр, я не знаю. Нашей бизань-мачты больше нет, нашей фок- и грот-мачты нет — в целом, я думаю, можно сказать, что мы сбили наш флаг».
С американской стороны потери и повреждения были небольшими: семь убитых и семь раненых. Однако британцы сильно пострадали: пятнадцать человек были убиты, семьдесят восемь ранены, а остальные 257 взяты в плен. Капитан Халл отказался принять капитуляционный меч Дакре, отдавая дань уважения его храбрости и хорошо проведенному сражению.
Халл попытался спасти Guerriere и отбуксировать его в порт, но, несмотря на всю ночь работы по спасению корабля, повреждения были слишком значительными, и вместо этого он приказал сжечь тонущий корабль. Желая поднять боевой дух американцев, Халл отплыл в Бостон, чтобы сообщить новости, которые были восприняты с большим энтузиазмом.
USS США против HMS Македонии , 25 октября 1812 года, недалеко от Мадейры.
USS Соединенные Штаты был первым из «первоначальных шести», введенных в эксплуатацию в соответствии с Законом о военно-морском флоте 1794 года. Это был тяжелый фрегат с сорока четырьмя орудиями и экипажем из 450 человек. HMS «Македонский » был новым дополнением к Королевский флот , введен в строй в 1810 году. Это был 38-пушечный фрегат пятого ранга, его численность составляла 306 человек.
США под командованием капитана Стивена Декейтера отплыл из Бостона в начале октября в длительный круиз по Атлантике в поисках британских торговых судов и военных кораблей. На рассвете 25 октября недалеко от острова Мадейра у побережья Северной Африки Соединенные Штаты заметили корабль и идентифицировали его как «Македонский » под командованием капитана Джона Сурмана Кардена, направлявшегося к своей станции в Вест-Индии. Оба корабля подготовились к бою и сократили дистанцию. Декейтер хотел держать британский военный корабль на расстоянии, используя свои более тяжелые двадцать четыре фунта, чтобы вывести из строя корабль, прежде чем закрыться, чтобы закончить работу.
Около 9 часов утра после обмена начальными бортовыми залпами второй залп Соединенных Штатов уничтожил бизань-стеньгу македонца и дал американскому фрегату преимущество в маневре. Соединенные Штаты заняли позицию в задней части Македонского , очень уязвимом месте для британского корабля, и приступили к нанесению ударов по несчастному судну. К полудню Соединенных Штатов превратил Македонский в плавучий корпус без мачты. Когда Декейтер закрылся для еще одного бортового залпа, Карден ударил по своим цветам и сдался.
Последствия показали одностороннее сражение, в котором более тяжелые орудия и большая дальность действия американского фрегата оказались разрушительными. Македонский имел более 100 выстрелов, застрявших только в его корпусе, и потерял сорок три человека убитыми и семьдесят один раненым: тридцать процентов потерь. У Соединенных Штатов было семь убитых и пять раненых. Соединенные Штаты произвели семьдесят бортовых залпов, а Македонский ответил только тридцатью.
Двое бывших бойцов пролежали рядом две недели так, что Македония можно было отремонтировать до парусного состояния. Декейтер отплыл обратно в Соединенные Штаты со своим призом, прибыв в Ньюпорт, штат Род-Айленд, 4 декабря. Затем HMS «Македонский » был куплен и введен в эксплуатацию ВМС США под номером USS «Македонский ». Декейтер и его команда получили высокую оценку за впечатляющую победу, а также общественность, конгресс и президент Мэдисон.
USS Chesapeake против HMS Shannon , 1 июня 1813 года, Бостонская гавань.
Во второй год войны 1812 года Соединенные Штаты одержали ряд морских побед, серьезно подорвав боевой дух британцев и их предполагаемое военно-морское превосходство. Имея это в виду, капитан Джеймс Лоуренс закончил переоборудование USS Chesapeake в Бостонской гавани и очень хотел выйти в море и вступить в бой с британцами. Chesapeake был меньше своих сестер Конституция и США , оценивался как 38-пушечный фрегат с экипажем из 379 человек.. Шэннон под командованием капитана Филлипа Брока был того же размера и вооружения, но его экипаж сократился до 330 человек после захвата нескольких торговых судов.
Экипаж Королевского флота пострадал во время наполеоновских войн и не был того же качества, что и раньше, с учетом этого Лоуренс рассчитывал превзойти Shannon , несмотря на их одинаковый размер и вооружение. Однако команда Shannon и капитан не были обычными британскими моряками. Брок был превосходным офицером и мастером морского артиллерийского дела, который выдрессировал свой экипаж до отличной силы. С другой стороны, у Лоуренса было несколько опытных членов экипажа, но многие из них раньше не сражались вместе или на борту Чесапика.
Чесапик отплыл навстречу Шэннон 1 июня 1813 года и заметил своего противника около пяти часов вечера. Когда на них надвигался Chesapeake , Броук предложил своей команде свою простую артиллерийскую философию: «Никаких выстрелов. Цель каждого. Сохранять хладнокровие. Работайте стабильно. . . . Не пытайтесь разоблачить ее. Убей людей, и корабль твой». После нескольких месяцев в море, Shannon был потрепан по сравнению с недавно переоборудованным Chesapeake , что придало Лоуренсу еще больше уверенности в своей атаке.
Два капитана решили не стрелять до тех пор, пока не обменялись бортовыми залпами, превратив бой в дуэль между джентльменами и дуэлью между военными кораблями. В шесть вечера с дистанции тридцать пять метров обе стороны открыли огонь. Сразу же методичный и точный огонь британского экипажа сказался на американском корабле, и его передовые артиллерийские расчеты сильно пострадали. Однако американцы вели устойчивый ответный огонь и нанесли некоторый урон.
Понимая, что его корабль движется слишком быстро и настигнет Шеннон Лоуренс приказал снизить скорость. Во время этого маневра точный британский огонь охватил квартердек Chesapeake , убив рулевых и выведя из строя штурвал. Chesapeake смог нанести дополнительные удары по Shannon и обстрелял ее полубак карронадным огнем. Наконец, выстрел унес фал марселя Chesapeake , в результате чего она потеряла всю поступательную скорость и осталась мертвой в воде.
9Задняя левая четверть 0011 Chesapeake была поймана якорем Shannon , и британцы привязали свой корабль к противнику и приготовились к абордажу. Пойманный под углом, при котором ее орудия не могли стрелять по британскому кораблю, а Shannon мог выстрелить в ее уязвимую корму и обстрелять корабль, Chesapeake оказался в серьезной опасности. Почувствовав слабость своего противника, Брок приказал своим людям подняться на абордаж. В это же время Лоуренс тоже решил взять на абордаж своего противника, но его приказ затерялся в водовороте и лишь несколько американцев последовали за своим капитаном.
Прежде чем Лоуренс смог повести своих людей на вражеский корабль, он был смертельно ранен мушкетной пулей. Когда его несли вниз, он крикнул теперь уже знаменитому: «Скажите людям стрелять быстрее! Не отдавайте корабль!» Поскольку все американские офицеры, кроме одного, были ранены, британцы столкнулись с небольшим организованным сопротивлением, когда Брок привел на борт свою высокоорганизованную команду. Пока американцы сопротивлялись и даже в какой-то момент сумели отбросить британцев, надежды было мало. Несмотря на то, что сам Брок был тяжело ранен абордажной саблей в голову, а британский абордаж застрял, когда два корабля разделились, американское сопротивление фактически прекратилось. Ближний и жестокий бой длился всего пятнадцать минут.
Обе стороны сильно пострадали, Чесапик потерял сорок восемь человек убитыми, девяносто девять ранеными, остальные взяты в плен, Шэннон двадцать три человека убитыми и пятьдесят шесть ранеными. Что касается артиллерийских орудий, Chesapeake был сильно побежден. Британцы отплыли в Галифакс со своим первым крупным военным призом и были встречены с ликованием. USS Chesapeake был повторно введен в эксплуатацию HMS Chesapeake . Капитан Лоуренс был похоронен со всеми воинскими почестями, а шесть офицеров Королевского флота несли гроб. Брок, хотя изначально не ожидалось, что он выживет после ранения, вернулся в Британию героем, получил баронет и был посвящен в рыцари. Несмотря на инвалидность, он продолжил свою карьеру инструктором по стрельбе.
С точки зрения потерь по сравнению с числом бойцов бой между Чесапик и Шэннон был не только самым кровавым в войне 1812 года, но и одним из самых кровавых за всю Эпоху Паруса. Для сравнения, Chesapeake и Shannon за пятнадцать минут потеряли больше, чем HMS Victory за всю Трафальгарскую битву.
Захват авианосца USS President , 15 января 1815 г., гавань Нью-Йорка
По мере развития войны 1812 года и осознания англичанами опасности американских тяжелых фрегатов они направляли все больше и больше военно-морских сил на блокаду американского побережья. Кроме того, англичане категорически запрещали своим кораблям бросать вызов американским фрегатам один на один. После многочисленных попыток прорвать британскую блокаду коммодор Стивен Декейтер передал свое командование Президенту , одному из сорокачетырехпушечных тяжелых фрегатов, который был захвачен в Нью-Йорке британской эскадрой из четырех кораблей под командованием коммодора Джона Хейса.
13 января, во время бушующей метели, сорвавшей британские корабли с их стоянки, Декейтер решил вырваться из нью-йоркской гавани. К сожалению, портовый канал не был хорошо отмечен, и Президент приземлился на бар. В течение двух часов, при сильном ветре и сильном море, «Президент » боролся за бар, получив тяжелые повреждения корпуса и такелажа. Ветер помешал Декейтеру вернуться в порт, заставив поврежденный «Президент » уйти в море.
900:02 После того, как шторм прошел, британцы, поняв, что американцы, возможно, попытались прорваться, заняли позиции для перехвата любых американских кораблей. На рассвете 14 января британские корабли заметили President и немедленно двинулись в бой. Декейтер развернул свой корабль по ветру в попытке спастись, даже облегчив Президента , выбросив ненужные предметы за борт, но ущерб, нанесенный в гавани, оказался катастрофическим.С британскими фрегатами Majestic , Endymion , Tenedos и Pomone бросились в погоню, завязалась непрерывная битва, в которой обе стороны обменивались огнем, а британцы неуклонно приближались. К ночи Эндимион смог закрыть брешь и обрушил разрушительный огонь на уязвимый тыл Президента . Быстрый маневр Декейтера поставил оба корабля рядом друг с другом, обменявшись залпами. Американцы нацелились на британский такелаж, чтобы ускорить отход от оставшихся британских судов, в то время как британские артиллеристы обстреляли 9Корпус 0011 Президента .
В 20:00 Декейтер ударил по своим цветам, и Эндимион остановился, чтобы поспешно починить такелаж. Увидев, что британцы остановились, но не спустили ни одной лодки, поскольку ни одна из них не была мореходной, Декейтер поднял паруса и попытался уйти в 8:30. Endymion был в пути к 9, а Pomone и Tenedos догнали его. Два быстрых бортовых залпа из Pomone окончательно решили вопрос, и Декейтер снова ударил по своим цветам.
В бою «Президент» потерял 24 человека убитыми, 55 ранеными и остальную часть экипажа из 447 человек взял в плен, в то время как «Эндимион », единственное британское судно, понесшее потери, потеряло 11 человек убитыми и 14 ранеными. Вскоре после боя закончилась война 1812 года, положившая конец фрегатным дуэлям в Атлантике.
Битва в Коралловом море
Роберта Льюиса
Краткое изложение
Битва в Коралловом море представляла собой серию морских сражений у северо-восточного побережья Австралии между 4 и 8 мая 1942. Авиация союзников (США и Австралии) и Японии сражалась против четырех различных основных групп военных кораблей.
Некоторые из задействованных самолетов были наземного базирования, но большинство были с авианосцев противника.
Это был первый в истории авианосный бой и первое морское сражение, в котором противоборствующие силы надводных кораблей ни на одном этапе не видели и не стреляли друг в друга. Все атаки проводились с самолетов. Это также крупнейшее морское сражение, которое когда-либо происходило у берегов Австралии.
Битва была важной по двум основным причинам:
- это был первый раз во время Второй мировой войны, когда японцы потерпели неудачу в крупной операции; и
- битва остановила японское морское вторжение в Порт-Морсби.
Для многих это была «битва, которая спасла Австралию». Это преувеличенное утверждение, но в нем есть доля правды. Битва определенно казалась в то время более значимой, чем ее оценивают современные книги по истории.
Спустя шестьдесят лет легко увидеть кажущуюся неизбежность того, что произошло на самом деле. Но нам нужно попытаться понять, на что это было похоже в то время, и оценить большое разнообразие факторов, которые способствовали результату, включая плохую связь и разведку, создающие неопределенность, переменчивые погодные условия, уязвимость и неповоротливость массивных кораблей, человеческие слабости и сильные стороны экипажа и пилотов, ограниченность технологий и оборудования, а также храбрость или ее отсутствие у вовлеченных людей.
Где была битва?
Битва произошла в Коралловом море, в районе, разделяющем Соломоновы острова, восточную оконечность Новой Гвинеи и северо-восточное побережье Австралии от Таунсвилля до острова Хорн. Карта этой области появляется позже как часть описания битвы.
Он охватывает территорию в несколько тысяч квадратных километров, и большую часть времени противоборствующие силы не знали, где находится противник. Каждая авианосная группа отправляла самолеты на поиски друг друга, но из-за ограниченного радиуса действия самолетов, ограниченных навыков многих летных экипажей в опознании кораблей, зачастую плохой погоды и обширных территорий, задействованных в операции, самолетам было очень трудно найти их. найти свои цели.
Кто был вовлечен?
Четыре основные группы кораблей участвовали в различных частях боевых действий в течение четырех дней.
- Японская группа вторжения в Порт-Морсби с группой поддержки (Марушигэ) и группой прикрытия (Гото), в которую входили небольшой авианосец Шохо и несколько крейсеров.
- Оперативная группа союзников 44 состояла из группы боевых кораблей союзников, включая два австралийских корабля, тяжелый крейсер HMAS Australia и легкий крейсер HMAS Hobart. Их послали найти и атаковать группу вторжения в Порт-Морсби. Этими силами командовал австралийский контр-адмирал Крейс.
- Были также вторые силы союзников, состоявшие из двух авианосцев, USS Lexington (под командованием контр-адмирала Фитча) и USS Yorktown (под командованием контр-адмирала Флетчера), вместе с защитными крейсерами и эсминцами. Их задачей было остановить вторжение, а для этого им предстояло заняться сопровождающими и охраняющими его японскими авианосцами.
- Главной целью авианосцев союзников была японская авианосная ударная группа с авианосцами «Дзуйкаку» и «Сёкаку» и прикрывающими крейсерами и эсминцами под командованием адмирала Такаги.
Как правило, чем больше корабль, тем больше у него орудий, чем тяжелее броня для защиты, тем он тяжелее и медленнее становится. Единственным исключением были авианосцы, которые были большими, но вытесняли относительно мало воды, потому что они были легко вооружены — их роль заключалась в том, чтобы обеспечить стартовую площадку для самолетов, а не стрелять по другим кораблям. Следовательно, в бою все остальные корабли должны были защищать уязвимые, но необходимые авианосцы. Они сделали это, сформировав защитный экран вокруг носителя.
Боевой флот
Боевые корабли в это время были:
- авианосцы
- линкоры
- крейсера (тяжелые или легкие)
- эсминцы.
Основными переменными между ними были:
- их длина
- их вес (измеряемый количеством вытесненной ими воды)
- их вооружение (количество и размер их орудий)
- их скорость.
В порядке размера:
- линкоры
- авианосцы
- крейсера
- эсминцы.
Почему в это время в этом месте произошла битва?
В битве участвовали союзные войска, пытавшиеся остановить продолжающуюся экспансию Японии и контроль над ней в районе Тихого океана, который был установлен в период с декабря 1941 по май 1942 года. Японский план расширить свой контроль над Тихим океаном заключался в создании базы в Тулаги на Соломоновых островах для самолетов-амфибий дальнего действия. В то же время они возьмут Порт-Морсби.
Контроль над портом и аэродромом в Порт-Морсби будет означать, что удерживаемые японцами острова будут защищены от наземных воздушных атак, а японские ВВС смогут свободно атаковать порты и аэродромы Квинсленда на острове Хорн, Куктауне, Коэне и Таунсвилл.
Это также прервало бы морское сообщение между Австралией и Соединенными Штатами, остановив передвижение припасов и войск, фактически лишив японцев возможности бросить вызов в Тихоокеанском регионе.
Затем японцы предпримут сокрушительную атаку на главный американский флот на Мидуэе, между Перл-Харбором и Японией, уничтожив его и вынудив Америку выйти из Тихоокеанской войны.
Для этого японцы сначала захватят Тулаги на Соломоновых островах. Затем транспорты с солдатами в сопровождении авианосца «Шохо» и других военных кораблей должны были покинуть Рабаул и направиться вокруг оконечности Новой Гвинеи в Порт-Морсби. Их будут защищать два других авианосца, «Дзуйкаку» и «Сёкаку», при поддержке крейсеров и эсминцев. План состоял в том, чтобы эти японские авианосцы перехватили американские военно-морские силы с двух сторон, когда они вошли в Коралловое море в ответ на японское вторжение.
Три японских авианосца с их защитными «экранами» военных кораблей вошли в Коралловое море в начале мая, чтобы поддержать этот флот вторжения. Американская разведка знала, что вот-вот должна произойти операция в Коралловом море — они взломали японские секретные военно-морские коды и смогли перебросить корабли в этот район, чтобы противостоять врагу. Но знать, что происходит, и быть достаточно сильным, чтобы остановить это — две разные вещи.
Каково было участвовать в Битве?
Обычный образ морских сражений — корабли, стреляющие друг в друга. В битве в Коралловом море этого не произошло. Единственным наиболее важным элементом, необходимым для понимания того сражения, является тот факт, что военные корабли были уязвимы для атак самолетов.
Основной план атаки обеих сторон заключался в том, что корабли противника должны были быть уничтожены самолетами, выпускающими торпеды или сбрасывающими бомбы. Эти самолеты прибыли с авианосцев.
Итак, чтобы победить врага, нужно было сначала разрушить взлетно-посадочные полосы, которые позволяли штурмовикам действовать с авианосцев. Если самолеты не запускались или не могли приземлиться, они сразу становились бесполезными. Авианосцы могли быть потоплены самолетами, летящими низко и сбрасывающими торпеды, которые пробивали корабль на уровне ватерлинии или под ней; или сбросив бомбы, которые повредят корабль и, возможно, воспламенят боеприпасы или топливо и серьезно повредят и, в конечном итоге, уничтожат корабль. Эти самолеты также будут стрелять из своих пулеметов по цели, надеясь вызвать дальнейшие смерти и повреждения. Истребители также будут там, чтобы защищать атакующий самолет от других истребителей, запускаемых с авианосца для его защиты.
Если бы авианосцы можно было уничтожить, остальные корабли можно было бы выследить практически на досуге.
Каждый авианосец был окружен «экраном» из других боевых кораблей для защиты от атак с воздуха. Задача этих окружающих кораблей заключалась в том, чтобы сбивать атакующие самолеты до того, как они достигнут авианосца.
Экран авианосца. На схеме изображен авианосец USS Yorktown, окруженный заслоном из крейсеров и эсминцев. Диаметр «круга» примерно 3,6 км.
В то же время авианосец будет двигаться зигзагом на высокой скорости, чтобы стать более сложной целью. Он также будет запускать быстрые и маневренные истребители для атаки более медленных и громоздких атакующих бомбардировщиков.
Таким образом, когда вы видите кадры кинохроники или фотографии нападения, вы в основном видите:
- атакующий истребитель, защищающий сопровождающий атакующий бомбардировщик
- атакующий бомбардировщик, пытающийся приблизиться к авианосцу, чтобы запустить торпеды или сбросить бомбы на это
- эти самолеты продолжают обстреливать цель из пулемета
- защитный экран обороняющихся кораблей стреляет из орудий, чтобы сбивать атакующие самолеты
- обороняющиеся истребители также помогают атаковать самолеты противника и защищать авианосцы.
Как разворачивалась битва
Район битвы. Пронумерованные кружки относятся к местам, упомянутым в тексте ниже.
4 мая
Последовательность событий началась 4 мая. Береговой наблюдатель сообщил, что видел флот, направляющийся к Тулаги. Йорктаун запустил свои самолеты в атаку. Они нанесли некоторый ущерб, но основная часть флота вторжения на самом деле шла из Рабаула в сторону Порт-Морсби. (См. Боевую карту — действие № 1). Американский командующий предположил, что японские авианосцы будут защищать фланг этих транспортов, и двинулся в сторону Новой Гвинеи. Однако основной японский авианосный флот на самом деле надеялся застать американцев с тыла и собирался войти в Коралловое море у Соломоновых островов. Противоборствующие силы теперь пытались найти друг друга на обширной территории.
5–6 мая
Противоборствующие силы продолжали искать друг друга, отправляя разведывательные полеты. Время от времени они заправлялись топливом, чтобы держать свои баки заправленными, чтобы у них было достаточно топлива, чтобы выдержать длительное сражение, включающее высокую скорость и большие расстояния, если это необходимо.
7 мая
До 7 мая не было замечено японского флота вторжения. Самолеты японских авианосцев Zuikaku и Shokaku обнаружили американский заправщик USS Neosho и его эскорт USS Sims, атаковали и вывели их из строя, поначалу полагая, что танкер был авианосцем. (См. Боевую карту — действие № 2) Тем временем самолеты из Лексингтона и Йорктауна нашли Шохо и уничтожили его. Это был первый раз, когда японцы потерпели поражение в бою. (см. Боевую карту — действие №3)
Часть флота союзников, включая два австралийских корабля, была отправлена в сторону Папуа, чтобы дождаться ожидаемого флота вторжения в Порт-Морсби и атаковать его. Союзники не знали, что основной японский флот вторжения повернул назад — они были слишком уязвимы для бомбардировщиков наземного базирования без авиационной поддержки Shoho.
Это оставило австралийские корабли в ожидании, чтобы вступить в бой с флотом вторжения, который никогда не придет. Но это не означало, что они были в безопасности. В какой-то момент HMAS Australia подверглась атаке японских торпедоносцев и бомбардировщиков из Рабаула. Умелое маневрирование кораблей означало, что ущерб был нанесен небольшой. Несколько американских бомбардировщиков видели это, но подумали, что это американские самолеты, атакующие японский авианосец, и присоединились! К счастью, они не причинили вреда и вскоре поняли, что происходит.
Безопасно и эффективно вести поиск и сражаться можно только днем. Японцы сделали ставку на то, чтобы первыми найти силы США, и отправили свои самолеты ближе к вечеру. Это было рискованно. Если бы они нашли врага и атаковали его, то могли бы нанести большой урон, а на следующий день вернуться и добить «легкую» цель; но если они не найдут корабли, им придется ночью приземляться на своих авианосцах, что является трудным и опасным маневром.
(Масатакэ Окуйима и Дзиро Хорикоши, Ричард Хаф, The Longest Battle, Cassell & Co, Лондон, 1986, стр. 166):
Вскоре наш самолет стал жертвой иллюзий и «миражей», вызванных истощением. Несколько раз летчики, отчаявшись в своем положении над морем, «засекли» свой авианосец. Наконец авианосец был замечен, и оставшиеся восемнадцать бомбардировщиков включили свои сигнальные и проблесковые огни, когда они развернулись в соответствии со своей схемой захода на посадку. Когда головной самолет с выпущенными закрылками и на пониженной скорости дрейфовал к палубе авианосца, чтобы приземлиться, пилот обнаружил, что огромный корабль впереди — американский авианосец! По-видимому, американцы также ошиблись в идентификации, поскольку даже когда бомбардировщик упал рядом с палубой авианосца, ни одна вражеская пушка не выстрелила. Японский пилот лихорадочно открыл дроссельную заслонку и на полной скорости отлетел от судна, сопровождаемый своими изумленными людьми. Наши летчики были возмущены. В течение изнурительных часов они летели над морем, боролись с грозовыми шквалами и, наконец, потеряли все следы своего положения относительно своих авианосцев. Когда они, наконец, увидели заветный американский военный корабль, ничего не подозревавший, курсирующий под восемнадцатью бомбардировщиками, у них не было ни бомб, ни торпед.
Только восемнадцать из двадцати семи самолетов, вылетевших в тот день, вернулись. Все погибшие были пилотами-ветеранами, и японцам было нелегко заменить их.
8 мая
8 мая разведывательные полеты обеих групп авианосцев наконец нашли друг друга одновременно. Хотя их разделяло 320 километров, они пустили в атаку свои самолеты. Звенья боевых самолетов пересекались друг с другом, и некоторые пилоты противоборствующих сторон действительно видели друг друга, направляясь в атаку.
Основная битва
Теперь каждая сторона использовала все свое оружие против другой. Атакующие выслали свои пикирующие бомбардировщики и торпедоносцы и были встречены истребителями и огнем авианосцев и их прикрывающих кораблей. (См. Карту битвы — действие номер 4)
Во время битвы было большое смятение, и было большое мужество — с обеих сторон.
Японский корректировщик, обнаруживший американский флот 8 мая, вылетел обратно и сообщил подробности. Японские истребители и бомбардировщики взлетели, но пилот-корректировщик так хотел убедиться, что они нашли свои цели, что направил их обратно, несмотря на то, что знал, что у него не хватит топлива, чтобы вернуться на свой авианосец и приземлиться. Мы можем только предположить, что он разбился и погиб в море.
Во время атаки на Шокаку американский летчик нырнул на своем самолете всего в нескольких метрах от корабля, чтобы убедиться, что бомба попала в цель, хотя он знал, что его самолет не сможет выйти из пикирования. Он рухнул в море рядом с кораблем, но его бомба попала точно в цель, и Шокаку был обречен. Эти выдержки из рассказов австралийских, американских и японских свидетелей, участвовавших в конфликте, дают некоторое представление о характере боевых действий в тот день.
(Эд Зноско, член экипажа авианосца «Чикаго», Крис Култхард-Кларк, Action Stations Coral Sea, Allen & Unwin, Сидней, 19 лет)91 стр. 94):
Я пробрался через аварийный люк, чтобы укомплектовать свою боевую станцию в качестве носильщика в послебоевом перевязочном пункте. . . 5-дюймовые зенитные орудия были слышны в скорострельном огне, а корабль трясло и вибрировало от полного хода на наших четырех больших винтах и часто меняло курс, чтобы увернуться от японских торпед.
(Джек Лангрел, член экипажа HMAS Australia, Крис Култхард-Кларк, Action Stations Coral Sea, Allen & Unwin, Сидней, 19 лет)91 стр. 96):
Внезапно весь ад разверзся, так что я понял, что это определенно входят япошки. Я повернулся, чтобы спуститься в люк, который я выбрал, только чтобы обнаружить, что он был надежно заперт. Меня поймали на верхней палубе, поэтому я просто стоял за башней. Один из японских бомбардировщиков-торпедоносцев должен был находиться в 100 футах от борта корабля и на уровне верхней палубы, когда он проходил по левому борту. Без моего ведома они обстреливали корабль пулеметными пулями.
(Стэнли Джонстон, член экипажа на борту авианосца «Лексингтон», Крис Култхард-Кларк, Action Stations Coral Sea, Allen & Unwin, Sydney, 1991, стр. 118):
Нападающий . . . Аккумулятор имеет запас хода на том первом япошке. Я вижу их снаряды, ярко-малиновые трассеры, пронзающие крылья и фюзеляж. Этот самолет колеблется, начинает медленный крен влево и отклоняется ровно настолько, чтобы пройти в перевернутом положении прямо под нашим носом. Когда он скользит мимо, я вижу пламя, исходящее из хвоста, и машина падает в воду в 50 футах от нашего правого борта. Порт вперёд. . . батарея . . . концентрирует свой огонь на втором япошке. Когда этот самолет приближается почти прямо над этими орудиями, они попали прямо в него снарядом. 904:65 Взрыв разнес его на куски, его двигатель погрузился в воду почти у подножия батареи. Обрывки его крыльев и хвостового оперения скользят по палубе авианосца, как листы бумаги, несущиеся перед ветром.
(Сигеказу Симадзаки, командир Дзуйкаку, в книге Криса Култхарда-Кларка, Action Stations Coral Sea, Allen & Unwin, Sydney, 1991, стр. 119):
Когда мы атаковали вражеские авианосцы, мы столкнулись с виртуальной стеной зенитного огня. ; авианосцы и их корабли поддержки очернили небо разрывающимися снарядами и трассерами. Казалось невероятным, что мы сможем пережить наши бомбардировки и торпедные пролеты через такую невероятную оборону. . . Мне пришлось лететь прямо над волнами, чтобы избежать вражеских снарядов и трассеров. На самом деле, когда я отвернулся от вражеского авианосца, я был так низко, что чуть не задел нос корабля, ибо летел ниже уровня полетной палубы. Я мог видеть членов экипажа корабля, уставившихся на мой самолет, когда он проносился мимо.
(Мервин Джонстон, член экипажа HMAS Australia, Крис Култхард-Кларк, Action Stations Coral Sea, Allen & Unwin, Sydney, 1991, стр. 125):
Мы могли слышать . . . комментарии различных пилотов. . . [у которых] в некоторых случаях заканчивалось топливо или они не могли приземлиться на «Лексингтон» или «Йорктаун», поскольку они были либо повреждены, либо загорелись. Многие сообщения были прощаниями с друзьями или любимыми.
В тот день погибли сотни мужчин.
Каков был результат?
В бою флот США понес большие потери. Потери США:
- Один авианосец уничтожен, один поврежден, одна нефтебаза и один эсминец потоплены, 66 самолетов потеряны, 543 человека убиты или ранены.
Потери японцев:
- Один небольшой авианосец уничтожен, один авианосец серьезно поврежден, один эсминец и три малых военно-морских корабля потоплены, 77 авианосцев потеряны, 1074 человека убиты или ранены.
(Мицуо Фучидо и Масатаку Окумия, Мидуэй. Битва, обреченная на Японию, Хатчинсон, 19 лет)57 стр. 116-7.)
Почему Битва сложилась именно так?
Большая часть исхода была связана с самоуспокоенностью японцев и несостоятельностью морской разведки — они недооценили численность имеющихся у США сил, полагая, что они могут предоставить только один авианосец вместо двух. Таким образом, они не выделили для вторжения всю имевшуюся у них силу.
Японцы также допустили тактические ошибки – они потратили драгоценные часы на поиски, атакуя относительно неважную цель, танкер. Они также проиграли авантюру, связанную с поиском своих целей ближе к вечеру, что привело к потере незаменимого боевого летного экипажа.
Преимущество американцев в том, что они знали, что замышляет враг, благодаря возможности перехватывать и расшифровывать их секретные сигналы. У американцев был радар, который мог вовремя идентифицировать приближающиеся вражеские самолеты, чтобы они могли поднять в воздух свои истребители и атаковать их.
Американцам тоже повезло при атаке – два японских авианосца находились примерно в двенадцати километрах друг от друга и один был затянут облаками, поэтому пилоты США могли сконцентрироваться на одном, свободном от защитного оружия другого. Они уничтожили Шокаку. Это означало также, что самолеты «Сёкаку», когда они возвращались после нападения на авианосцы США, должны были приземлиться на «Дзуйкаку»; но этот корабль не мог справиться с таким количеством прибывающих самолетов, и экипажу приходилось выталкивать приземлившиеся самолеты за борт, чтобы позволить приземлиться большему количеству приближающихся. Японцы потеряли 45 из 72 исправных самолетов в начале боя 7 мая.
Иногда удача была нужна союзникам, так как часть их оружия была явно хуже. Бомбардировщик-торпедоносец Devastator, например, должен был лететь низко и медленно в течение длительного времени, когда приближался, чтобы выпустить свои торпеды по противнику, и при этом становился «сидячей уткой» для артиллеристов на борту корабля-мишени. Тогда, даже если опустошители смогли выпустить свои торпеды, они, скорее всего, не останутся на курсе, а если попадут, то не взорвутся!
Медлительность «Опустошителя» также означала, что самолеты, сбрасывавшие бомбы, прибывали к цели раньше них, и им приходилось ждать, чтобы нанести ударный строй, состоявший из одновременных бомбардировок с большой высоты и торпедных ударов с малых высот. Таким образом, у японцев было время нарушить схему и снизить ее эффективность.
Однако в долгосрочной перспективе союзники выиграли от боя гораздо больше, чем японцы.
Битва положила конец предложенному японцами морскому вторжению в Порт-Морсби. Когда в следующем месяце они атаковали американский флот у Мидуэя, ослабленные японцы встретили более сильный флот союзников, чем они ожидали, и потерпели поражение. Это был конец японской военно-морской мощи в Тихом океане.
Спасла ли битва в Коралловом море Австралию от вторжения?
В 1942 году многие люди считали, что Австралия была спасена от вторжения битвой в Коралловом море. Об этом ясно говорит речь премьер-министра Джона Кертина.
(Джон Кертин в фильме Криса Култхарда-Кларка, Action Stations Coral Sea, Allen & Unwin, Sydney, 1991, стр. 129):
События, происходящие сегодня, имеют решающее значение для всего ведения войны на этом театре военных действий. . . . Должен добавить, что в настоящий момент никто не может сказать, чем может закончиться помолвка. Если дело пойдет удачно, у нас будет повод для большой благодарности, и тогда наше положение несколько прояснится. Но если мы не получим выгод от этой битвы, на которую мы надеемся, все, что нам предстоит, — это более суровое испытание и большая и серьезная ответственность. Эта битва не решит исход войны; она определит ближайшую тактику, которую будут проводить союзные войска и общий противник.
В Австралии те, кто знал, что происходит, были готовы к худшему.
(оператор радара WAAAF, цитируется у Криса Култхарда-Кларка, Action Stations Coral Sea, Allen & Unwin, Sydney, 1991, стр. 130): из [мангровых] деревьев. Был час ночи, но, увидев свет в кабинете командира, я постучал и спросил: «Сэр, а почему на ветвях каждого третьего дерева сидит солдат и лицом к морю?» Он посмотрел на меня вдаль. глаз и сказал: «Капрал, солдат нет, а если и есть, то ты их не видел. А если и увидишь, то точно никому больше не упомянешь!»
Многие современные историки теперь утверждают, что у японцев не было никакого плана вторжения в Австралию, поэтому Битва в Коралловом море не могла остановить это вторжение. В этом есть правда, хотя и комплексная.
К началу 1942 года японцы добились своей первоначальной цели — создать оборонительный периметр вокруг своих территориальных завоеваний.
Военный план от ноября 1941 г. определял районы, которые должны были быть быстро оккупированы или уничтожены, как только позволит военная ситуация, и «важные точки в районе Австралии» были частью этого плана.
Но теперь между командованием японской армии и флота возникли разногласия по поводу того, что делать дальше. Армия выступала за продолжение наступления за пределами Новой Британии, включая захват Порт-Морсби, Соломоновых островов, Новых Гебридских островов, Новой Каледонии, Фиджи и Самоа. Это прервало бы связь и снабжение между Австралией и Соединенными Штатами, тем самым изолировав Австралию и сведя на нет ее потенциал как поставщика боевого персонала и товаров, а также базы, с которой возродившаяся американская военная мощь могла бы быть применена против новых владений Японии.
Флот, однако, выступал либо за прямое вторжение в Австралию, либо за наступление западных войск на Индию и Цейлон.
У адмирала Ямамото был третий план — как можно скорее вызвать решающую морскую конфронтацию против США на Мидуэе.
План Ямамото по вторжению в Австралию требовал гораздо большего количества кораблей и людей, чем было доступно Японии, поэтому от этого плана отказались в пользу плана армии по изоляции Австралии и эффективному вытеснению ее из войны.
В июне 1942 года был реализован план флота по форсированию столкновения у Мидуэя. «Йорктаун», который, как считали японцы, затонул в Коралловом море, смог принять участие в Мидуэе, но два японских авианосца не были отремонтированы. Таким образом, Коралловое море внесло свой вклад в исход битвы при Мидуэе, где японский Тихоокеанский флот был практически уничтожен. Это открыло союзникам возможность вернуть себе все отпавшие от японцев районы в Тихом океане, правда, только спустя еще несколько лет и с огромными потерями.
Как в Австралии вспоминают и отмечают битву в Коралловом море?
Ежегодно с 1946 года Неделя Кораллового моря отмечается в Австралии маршами военнослужащих из Австралии и США, а также официальными мероприятиями для высокопоставленных лиц из США. Эти празднования выражают благодарность Соединенным Штатам за их участие в битве и поддержку, оказанную Австралии Америкой во Второй мировой войне. «Битва за Австралию», которая проводится в первую среду сентября. Теперь это знаменует собой не только битву в Коралловом море, но и вклад и значение всех тех, кто помогал защищать Австралию в ее самое уязвимое время — людей на пути Кокода, летчиков в северной Австралии и Папуа, моряков и купцов.