Professional Documents
Culture Documents
Авторське право Адаменко
Авторське право Адаменко
ЗВІТ
З ЛАБОРАТОРНОЇ РОБОТИ №1
" ДОСЛІДЖЕННЯ ОБ’ЄКТІВ АВТОРСЬКОГО ПРАВА: ХАРАКТЕРИСТИКА
ОСНОВНИХ СКЛАДОВИХ ЗАЯВКИ НА АВТОРСЬКИЙ ТВІР
(КОМП’ЮТЕРНУ ПРОГРАМУ)"
ВАРІАНТ №1
Перевірив
ас. каф. ЗІ Остапенко-Боженова А. В.
_________________ 2022 р.
Вінниця 2022 р.
1
НАЦІОНАЛЬНИЙ ОРГАН ІНТЕЛЕКТУАЛЬНОЇ ВЛАСНОСТІ
ДЕРЖАВНЕ ПІДПРИЄМСТВО
«УКРАЇНСЬКИЙ ІНСТИТУТ ІНТЕЛЕКТУАЛЬНОЇ ВЛАСНОСТІ»
(УКРПАТЕНТ)
вул. Глазунова, буд. 1, м. Київ, 01601, тел.: (044) 494-05-05, факс: (044) 494-05-06
E-mail: office@ukrpatent.org, сайт: www.ukrpatent.org, код згідно з ЄДРПОУ 31032378
ЗАЯВА
про реєстрацію авторського права на твір
Число
Місяць ▲ Рік ▲
▲
Число
Місяць ▲ Рік ▲
▲
2
5. Дата остаточного завершення роботи над твором ► Число 12 Місяць 1Рік 2022
Суть авторства, авторський вклад у створення твору Розробка кодової частини комп’ютерної
програми мовою програмування JS
Цей твір (частину твору) створено:* Цей твір (частину твору) створено для оприлюднення:*
3
10. Особа, яка подає заявку на реєстрацію (заявник):
Кількість Кількість
12. Перелік документів і матеріалів, що додаються до заяви
аркушів примірників
□ Примірник твору (форма, в 9 1
якій представлено твір) - -
□ Документ, що підтверджує перехід у - -
спадщину майнового права автора (якщо
заявка подається спадкоємцем автора)
□ Платіжний документ, що підтверджує сплату збору за підготовку до державної 1 1
реєстрації авторського права на твір
□ Платіжний документ, що підтверджує сплату збору за оформлення і видачу 1 1
свідоцтва про державну реєстрацію авторського права на твір
□ Документ, що підтверджує наявність пільг по сплаті збору - -
□ Документ, що свідчить про факт і дату оприлюднення твору (за наявності) - -
□ Документ, що підтверджує повноваження довіреної особи (довіреність) - -
□ Інші документи, - - -
що додаються до - - -
заяви - - -
Примітки:____________________________________________________________________________________________
_____________________________________________________________________________________________________
_____________________________________________________________________________________________________
Заявку опрацював: ______________________________________________________________
Прізвище, ініціали та підпис працівника відділу
4
Лист подовження до бланку заяви
9.2. Прізвище, ім'я, по батькові другого автора (псевдонім, за наявності, вказати в дужках) ▼
___________________________________________________________________________________
___________________________________________________________________________________
Дата народження ► Число ____ Місяць ________ Рік ________
Цей твір (частину твору) створено:* Цей твір (частину твору) створено для оприлюднення:*
9.3. Прізвище, ім'я, по батькові третього автора (псевдонім, за наявності вказати в дужках) ▼
___________________________________________________________________________________
___________________________________________________________________________________
Дата народження ► Число ____ Місяць ________ Рік ________
Цей твір (частину твору) створено:* Цей твір (частину твору) створено для оприлюднення:*
5
Настанова програми
Для того щоб почати роботу із додатком потрібно для початку запустити сервер за допомогою
термінала або командної стрічки (рис. 1).
6
Після підключення двох гравців потрібно розставити кораблі на своєму полі та натиснути Start
game(рис. 3)
7
Мета гри – це потопити усі кораблі суперника. Після того як ви чи вас суперник це зробить, гра
зупиниться та визначить переможця(рис. 5).
8
Текст програми
document.addEventListener('DOMContentLoaded', () => {
const userGrid = document.querySelector('.grid-user')
const computerGrid = document.querySelector('.grid-computer')
const displayGrid = document.querySelector('.grid-display')
const ships = document.querySelectorAll('.ship')
const destroyer = document.querySelector('.destroyer-container')
const submarine = document.querySelector('.submarine-container')
const cruiser = document.querySelector('.cruiser-container')
const battleship = document.querySelector('.battleship-container')
const carrier = document.querySelector('.carrier-container')
const startButton = document.querySelector('#start')
const rotateButton = document.querySelector('#rotate')
const turnDisplay = document.querySelector('#whose-go')
const infoDisplay = document.querySelector('#info')
const setupButtons = document.getElementById('setup-buttons')
const userSquares = []
const computerSquares = []
let isHorizontal = true
let isGameOver = false
let currentPlayer = 'user'
const width = 10
let playerNum = 0
let ready = false
let enemyReady = false
let allShipsPlaced = false
let shotFired = -1
const shipArray = [
{
name: 'destroyer',
directions: [
[0, 1],
[0, width]
]
},
{
name: 'submarine',
directions: [
[0, 1, 2],
[0, width, width*2]
]
},
{
name: 'cruiser',
directions: [
[0, 1, 2],
[0, width, width*2]
]
},
9
{
name: 'battleship',
directions: [
[0, 1, 2, 3],
[0, width, width*2, width*3]
]
},
{
name: 'carrier',
directions: [
[0, 1, 2, 3, 4],
[0, width, width*2, width*3, width*4]
]
},
]
createBoard(userGrid, userSquares)
createBoard(computerGrid, computerSquares)
if (gameMode === 'singlePlayer') {
startSinglePlayer()
} else {
startMultiPlayer()
}
function startMultiPlayer() {
const socket = io();
console.log(playerNum)
socket.emit('check-players')
}
})
socket.on('player-connection', num => {
console.log(`Player number ${num} has connected or disconnected`)
playerConnectedOrDisconnected(num)
})
socket.on('enemy-ready', num => {
enemyReady = true
playerReady(num)
if (ready) {
playGameMulti(socket)
setupButtons.style.display = 'none'
}
10
})
socket.on('check-players', players => {
players.forEach((p, i) => {
if(p.connected) playerConnectedOrDisconnected(i)
if(p.ready) {
playerReady(i)
if(i !== playerReady) enemyReady = true
}
})
})
socket.on('timeout', () => {
infoDisplay.innerHTML = 'You have reached the 10 minute limit'
})
startButton.addEventListener('click', () => {
if(allShipsPlaced) playGameMulti(socket)
else infoDisplay.innerHTML = "Please place all ships"
})
computerSquares.forEach(square => {
square.addEventListener('click', () => {
if(currentPlayer === 'user' && ready && enemyReady) {
shotFired = square.dataset.id
socket.emit('fire', shotFired)
}
})
})
socket.on('fire', id => {
enemyGo(id)
const square = userSquares[id]
socket.emit('fire-reply', square.classList)
playGameMulti(socket)
})
socket.on('fire-reply', classList => {
revealSquare(classList)
playGameMulti(socket)
})
function playerConnectedOrDisconnected(num) {
let player = `.p${parseInt(num) + 1}`
document.querySelector(`${player} .connected`).classList.toggle('active')
if(parseInt(num) === playerNum) document.querySelector(player).style.fontWeight = 'bold'
}
}
function startSinglePlayer() {
generate(shipArray[0])
generate(shipArray[1])
generate(shipArray[2])
generate(shipArray[3])
generate(shipArray[4])
startButton.addEventListener('click', () => {
11
setupButtons.style.display = 'none'
playGameSingle()
})
}
function createBoard(grid, squares) {
for (let i = 0; i < width*width; i++) {
const square = document.createElement('div')
square.dataset.id = i
grid.appendChild(square)
squares.push(square)
}
}
function generate(ship) {
let randomDirection = Math.floor(Math.random() * ship.directions.length)
let current = ship.directions[randomDirection]
if (randomDirection === 0) direction = 1
if (randomDirection === 1) direction = 10
let randomStart = Math.abs(Math.floor(Math.random() * computerSquares.length -
(ship.directions[0].length * direction)))
else generate(ship)
}
function rotate() {
if (isHorizontal) {
destroyer.classList.toggle('destroyer-container-vertical')
submarine.classList.toggle('submarine-container-vertical')
cruiser.classList.toggle('cruiser-container-vertical')
battleship.classList.toggle('battleship-container-vertical')
carrier.classList.toggle('carrier-container-vertical')
isHorizontal = false
return
}
if (!isHorizontal) {
destroyer.classList.toggle('destroyer-container-vertical')
submarine.classList.toggle('submarine-container-vertical')
cruiser.classList.toggle('cruiser-container-vertical')
battleship.classList.toggle('battleship-container-vertical')
carrier.classList.toggle('carrier-container-vertical')
isHorizontal = true
return
12
}
}
rotateButton.addEventListener('click', rotate)
ships.forEach(ship => ship.addEventListener('dragstart', dragStart))
userSquares.forEach(square => square.addEventListener('dragstart', dragStart))
userSquares.forEach(square => square.addEventListener('dragover', dragOver))
userSquares.forEach(square => square.addEventListener('dragenter', dragEnter))
userSquares.forEach(square => square.addEventListener('dragleave', dragLeave))
userSquares.forEach(square => square.addEventListener('drop', dragDrop))
userSquares.forEach(square => square.addEventListener('dragend', dragEnd))
let selectedShipNameWithIndex
let draggedShip
let draggedShipLength
function dragStart() {
draggedShip = this
draggedShipLength = this.childNodes.length
}
function dragOver(e) {
e.preventDefault()
}
function dragEnter(e) {
e.preventDefault()
}
function dragLeave() {
}
function dragDrop() {
let shipNameWithLastId = draggedShip.lastChild.id
let shipClass = shipNameWithLastId.slice(0, -2)
let lastShipIndex = parseInt(shipNameWithLastId.substr(-1))
let shipLastId = lastShipIndex + parseInt(this.dataset.id)
const notAllowedHorizontal =
[0,10,20,30,40,50,60,70,80,90,1,11,21,31,41,51,61,71,81,91,2,22,32,42,52,62,72,82,92,3,13,23,33,4
3,53,63,73,83,93]
const notAllowedVertical =
[99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68
,67,66,65,64,63,62,61,60]
let newNotAllowedHorizontal = notAllowedHorizontal.splice(0, 10 * lastShipIndex)
let newNotAllowedVertical = notAllowedVertical.splice(0, 10 * lastShipIndex)
13
selectedShipIndex = parseInt(selectedShipNameWithIndex.substr(-1))
displayGrid.removeChild(draggedShip)
if(!displayGrid.querySelector('.ship')) allShipsPlaced = true
}
function dragEnd() {
}
function playGameMulti(socket) {
setupButtons.style.display = 'none'
if(isGameOver) return
if(!ready) {
socket.emit('player-ready')
ready = true
playerReady(playerNum)
}
if(enemyReady) {
if(currentPlayer === 'user') {
turnDisplay.innerHTML = 'Your Go'
}
if(currentPlayer === 'enemy') {
turnDisplay.innerHTML = "Enemy's Go"
}
}
}
14
function playerReady(num) {
let player = `.p${parseInt(num) + 1}`
document.querySelector(`${player} .ready`).classList.toggle('active')
}
function playGameSingle() {
if (isGameOver) return
if (currentPlayer === 'user') {
turnDisplay.innerHTML = 'Your Go'
computerSquares.forEach(square => square.addEventListener('click', function(e) {
shotFired = square.dataset.id
revealSquare(square.classList)
}))
}
if (currentPlayer === 'enemy') {
turnDisplay.innerHTML = 'Computers Go'
setTimeout(enemyGo, 1000)
}
}
let destroyerCount = 0
let submarineCount = 0
let cruiserCount = 0
let battleshipCount = 0
let carrierCount = 0
function revealSquare(classList) {
const enemySquare = computerGrid.querySelector(`div[data-id='${shotFired}']`)
const obj = Object.values(classList)
if (!enemySquare.classList.contains('boom') && currentPlayer === 'user' && !isGameOver) {
if (obj.includes('destroyer')) destroyerCount++
if (obj.includes('submarine')) submarineCount++
if (obj.includes('cruiser')) cruiserCount++
if (obj.includes('battleship')) battleshipCount++
if (obj.includes('carrier')) carrierCount++
}
if (obj.includes('taken')) {
enemySquare.classList.add('boom')
} else {
enemySquare.classList.add('miss')
}
checkForWins()
currentPlayer = 'enemy'
if(gameMode === 'singlePlayer') playGameSingle()
}
let cpuDestroyerCount = 0
let cpuSubmarineCount = 0
let cpuCruiserCount = 0
let cpuBattleshipCount = 0
15
let cpuCarrierCount = 0
function enemyGo(square) {
if (gameMode === 'singlePlayer') square = Math.floor(Math.random() * userSquares.length)
if (!userSquares[square].classList.contains('boom')) {
const hit = userSquares[square].classList.contains('taken')
userSquares[square].classList.add(hit ? 'boom' : 'miss')
if (userSquares[square].classList.contains('destroyer')) cpuDestroyerCount++
if (userSquares[square].classList.contains('submarine')) cpuSubmarineCount++
if (userSquares[square].classList.contains('cruiser')) cpuCruiserCount++
if (userSquares[square].classList.contains('battleship')) cpuBattleshipCount++
if (userSquares[square].classList.contains('carrier')) cpuCarrierCount++
checkForWins()
} else if (gameMode === 'singlePlayer') enemyGo()
currentPlayer = 'user'
turnDisplay.innerHTML = 'Your Go'
}
function checkForWins() {
let enemy = 'computer'
if(gameMode === 'multiPlayer') enemy = 'enemy'
if (destroyerCount === 2) {
infoDisplay.innerHTML = `You sunk the ${enemy}'s destroyer`
destroyerCount = 10
}
if (submarineCount === 3) {
infoDisplay.innerHTML = `You sunk the ${enemy}'s submarine`
submarineCount = 10
}
if (cruiserCount === 3) {
infoDisplay.innerHTML = `You sunk the ${enemy}'s cruiser`
cruiserCount = 10
}
if (battleshipCount === 4) {
infoDisplay.innerHTML = `You sunk the ${enemy}'s battleship`
battleshipCount = 10
}
if (carrierCount === 5) {
infoDisplay.innerHTML = `You sunk the ${enemy}'s carrier`
carrierCount = 10
}
if (cpuDestroyerCount === 2) {
infoDisplay.innerHTML = `${enemy} sunk your destroyer`
cpuDestroyerCount = 10
}
if (cpuSubmarineCount === 3) {
infoDisplay.innerHTML = `${enemy} sunk your submarine`
cpuSubmarineCount = 10
}
if (cpuCruiserCount === 3) {
infoDisplay.innerHTML = `${enemy} sunk your cruiser`
16
cpuCruiserCount = 10
}
if (cpuBattleshipCount === 4) {
infoDisplay.innerHTML = `${enemy} sunk your battleship`
cpuBattleshipCount = 10
}
if (cpuCarrierCount === 5) {
infoDisplay.innerHTML = `${enemy} sunk your carrier`
cpuCarrierCount = 10
}
17