You are on page 1of 17

Міністерство освіти і науки України

Вінницький національний технічний університет


Факультет інформаційних технологій та комп’ютерної інженерії
Кафедра захисту інформації

ЗВІТ
З ЛАБОРАТОРНОЇ РОБОТИ №1
" ДОСЛІДЖЕННЯ ОБ’ЄКТІВ АВТОРСЬКОГО ПРАВА: ХАРАКТЕРИСТИКА
ОСНОВНИХ СКЛАДОВИХ ЗАЯВКИ НА АВТОРСЬКИЙ ТВІР
(КОМП’ЮТЕРНУ ПРОГРАМУ)"
ВАРІАНТ №1

Виконав студент гр. 1КІТС-20б


Адаменко Ілля Олександрович

Лабораторну роботу захищено


з оцінкою _________________________

Перевірив
ас. каф. ЗІ Остапенко-Боженова А. В.

_________________ 2022 р.

Вінниця 2022 р.
1
НАЦІОНАЛЬНИЙ ОРГАН ІНТЕЛЕКТУАЛЬНОЇ ВЛАСНОСТІ
ДЕРЖАВНЕ ПІДПРИЄМСТВО
«УКРАЇНСЬКИЙ ІНСТИТУТ ІНТЕЛЕКТУАЛЬНОЇ ВЛАСНОСТІ»
(УКРПАТЕНТ)

вул. Глазунова, буд. 1, м. Київ, 01601, тел.: (044) 494-05-05, факс: (044) 494-05-06
E-mail: office@ukrpatent.org, сайт: www.ukrpatent.org, код згідно з ЄДРПОУ 31032378

ЗАЯВА
про реєстрацію авторського права на твір

Службові відмітки: Підпис начальника відділу ►______________

Номер заявки ▼ Дата подання

Число
Місяць ▲ Рік ▲

Номер свідоцтва ▼ Дата реєстрації

Число
Місяць ▲ Рік ▲

Прошу зареєструвати авторське право на твір

1. Вид та повна назва твору Комп’ютерна програма “Морський бій”

Скорочена назва твору (якщо така є)


___________________________________________________________________________________
___________________________________________________________________________________

Попередня чи альтернативна назва твору (якщо така є)


___________________________________________________________________________________
___________________________________________________________________________________

2. Галузь творчої діяльності ______________________Література


Наука, література чи мистецтво
3. До якого об’єкту(ів) авторського права належить твір Комп’ютерна програма

4. Анотація або реферат твору (Публікується в офіційному бюлетені)


Було розроблено мережеву реалізацію гри «Морський бій». З цією метою було проведено
дослідження предметної області та здійснено аналіз існуючих аналогів. На основі відомостей,
отриманих протягом дослідження, було здійснено проектування та безпосередню розробку
програмного додатку. При створенні програмного проекту було використано програмне
середовище розробки Visual Studio Code. Програмний модуль написано на мові програмування JS.

2
5. Дата остаточного завершення роботи над твором ► Число 12 Місяць 1Рік 2022

6. Відомості про оприлюднення твору (опублікування, сповіщення, виконання, показ тощо)


Програма була розроблена на основі настільної гри “Морський бій”. «Морський бій» — гра
для двох учасників, у якій гравці по черзі називають координати на невідомій їм карті суперника.
Гру вперше випустила у вигляді настільної гри компанія Milton Bradley Company 1931 року.
7. Відомості про використані твори:
____________________________
7.1. Відомості про твір(и), відносно якого(их) цей твір є похідним
___________________________________________________________________________________
Вказати, на основі якого твору зроблено переклад, адаптацію, аранжування тощо, їх правомірність
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
7.2. Відомості про твір(и), або частину твору(ів), що включено до твору, права на який реєструються
___________________________________________________________________________________
Вказати твори інших авторів та правомірність їх включення
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________

8. Відомості про попередню реєстрацію* Ні – □; Так – □, __________________________________


Вказати державу, дату, номер попередньої реєстрації
___________________________________________________________________________________
та назву реєстру
9. Відомості про автора(ів) твору, зазначеного у п.1 заяви **
9.1. Прізвище, ім'я, по батькові першого автора (псевдонім, за наявності, вказати в дужках) ▼
Адаменко Ілля Олександрович
Дата народження ► Число 2 Місяць 8 Рік 2003

Повна поштова адреса, телефон вул. Воїнів-Інтернаціоналістів 5, м. Вінниця, 21000.


380682909325
Вулиця, номер будинку, назва населеного пункту, район, область, поштовий індекс
___________________________________________________________________________________
___________________________________________________________________________________

Суть авторства, авторський вклад у створення твору Розробка кодової частини комп’ютерної
програми мовою програмування JS

Цей твір (частину твору) створено:* Цей твір (частину твору) створено для оприлюднення:*

під власним ім’ям □


за договором □ анонімно □
у порядку індивідуальної розробки □ під псевдонімом □

* Необхідне позначити “X”


** Якщо авторів декілька, використайте лист подовження бланку заяви

3
10. Особа, яка подає заявку на реєстрацію (заявник):

10.1. Автор(и), спадкоємець(і) ▼


Адаменко Ілля Олександрович ilysha.adamenko@gmail.com, +380682909325
Повне ім’я особи, повна поштова адреса (адреса для листування), телефон
___________________________________________________________________________________
10.2. Довірена особа автора(ів), спадкоємця(ів) ▼
___________________________________________________________________________________
Повне ім’я особи, повна поштова адреса (адреса для листування), телефон
___________________________________________________________________________________

11. Видача свідоцтва (свідоцтв):


 Надіслати за вказаною адресою вул. Воїнів-Інтернаціоналістів 5, м. Вінниця, 21000
Вулиця, номер будинку, назва населеного пункту, район, область, поштовий індекс
___________________________________________________________________________________
 Видати заявнику Адаменко І.О.
Прізвище, ініціали

Кількість Кількість
12. Перелік документів і матеріалів, що додаються до заяви
аркушів примірників
□ Примірник твору (форма, в 9 1
якій представлено твір) - -
□ Документ, що підтверджує перехід у - -
спадщину майнового права автора (якщо
заявка подається спадкоємцем автора)
□ Платіжний документ, що підтверджує сплату збору за підготовку до державної 1 1
реєстрації авторського права на твір
□ Платіжний документ, що підтверджує сплату збору за оформлення і видачу 1 1
свідоцтва про державну реєстрацію авторського права на твір
□ Документ, що підтверджує наявність пільг по сплаті збору - -
□ Документ, що свідчить про факт і дату оприлюднення твору (за наявності) - -
□ Документ, що підтверджує повноваження довіреної особи (довіреність) - -
□ Інші документи, - - -
що додаються до - - -
заяви - - -

13. Я, який нижче підписався, підтверджую достатність і достовірність відомостей,


вказаних у матеріалах заявки:
 Автор(и) Адаменоко І. О.
Прізвище(а), ініціали, підпис(и)
___________________________________________________________________________________ _______________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________
 Заявник Адаменоко І. О.
Прізвище, ініціали та підпис особи, яка подає заявку
___________________________________________________________________________________
___________________________________________________________________________________
Дата ► Число ►15 Місяць ►04 Рік ►2022

Примітки:____________________________________________________________________________________________
_____________________________________________________________________________________________________
_____________________________________________________________________________________________________
Заявку опрацював: ______________________________________________________________
Прізвище, ініціали та підпис працівника відділу

4
Лист подовження до бланку заяви

9.2. Прізвище, ім'я, по батькові другого автора (псевдонім, за наявності, вказати в дужках) ▼
___________________________________________________________________________________
___________________________________________________________________________________
Дата народження ► Число ____ Місяць ________ Рік ________

Повна поштова адреса, телефон _____________________________________________________


Вулиця, номер будинку, назва населеного пункту, район, область, поштовий індекс
___________________________________________________________________________________
___________________________________________________________________________________

Суть авторства, авторський вклад у створення твору _____________________________________


___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________

Цей твір (частину твору) створено:* Цей твір (частину твору) створено для оприлюднення:*

під власним ім’ям □


за договором □ анонімно □
у порядку індивідуальної розробки □ під псевдонімом □

9.3. Прізвище, ім'я, по батькові третього автора (псевдонім, за наявності вказати в дужках) ▼
___________________________________________________________________________________
___________________________________________________________________________________
Дата народження ► Число ____ Місяць ________ Рік ________

Повна поштова адреса, телефон ____________________________________________________


Вулиця, номер будинку, назва населеного пункту, район, область, поштовий індекс
____________________________________________________________________________
____________________________________________________________________________
_____________________________________
Суть авторства, авторський вклад у створення твору
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________

Цей твір (частину твору) створено:* Цей твір (частину твору) створено для оприлюднення:*

під власним ім’ям □


за договором □ анонімно □
у порядку індивідуальної розробки □ під псевдонімом □

* Необхідне позначити “X”

5
Настанова програми
Для того щоб почати роботу із додатком потрібно для початку запустити сервер за допомогою
термінала або командної стрічки (рис. 1).

Рисунок 1 – Запуск сервера

Після цього вписуємо у пошукову стрічку http://localhost:3000/ та переходимо по посиланню. У


браузері відкриється Головне меню (рис. 2).

Рисунок 2 – Головне меню гри


Обираємо режим мультиплеєр та чекаємо нашого опонента, який також повинен підключитись до
цього порту.

6
Після підключення двох гравців потрібно розставити кораблі на своєму полі та натиснути Start
game(рис. 3)

Рисунок 3 – Початок гри


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

Рисунок 4 – Хід суперника

7
Мета гри – це потопити усі кораблі суперника. Після того як ви чи вас суперник це зробить, гра
зупиниться та визначить переможця(рис. 5).

Рисунок 5 – Перемога гравця номер 1

Особливостями гри є те що реалізація є мережева, яка надає можливість грати не з ботами, а з


живими гравцями, у великій кількості. Програма розроблялась і тестувалась на комп’ютері з такими
характеристики: Процесор Intel(R) Core(TM) i5-4200 2.7 GHz; Оперативна пам’ять 16 ГБ; Графічні карта
Nvidia GeForce GTX 970.

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();

    socket.on('player-number', num => {


      if (num === -1) {
        infoDisplay.innerHTML = "Sorry, the server is full"
      } else {
        playerNum = parseInt(num)
        if(playerNum === 1) currentPlayer = "enemy"

        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)))

    const isTaken = current.some(index => computerSquares[randomStart +


index].classList.contains('taken'))
    const isAtRightEdge = current.some(index => (randomStart + index) % width === width - 1)
    const isAtLeftEdge = current.some(index => (randomStart + index) % width === 0)

    if (!isTaken && !isAtRightEdge && !isAtLeftEdge) current.forEach(index =>


computerSquares[randomStart + index].classList.add('taken', ship.name))

    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

  ships.forEach(ship => ship.addEventListener('mousedown', (e) => {


    selectedShipNameWithIndex = e.target.id
  }))

  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))

    shipLastId = shipLastId - selectedShipIndex

    if (isHorizontal && !newNotAllowedHorizontal.includes(shipLastId)) {


      for (let i=0; i < draggedShipLength; i++) {
        let directionClass
        if (i === 0) directionClass = 'start'
        if (i === draggedShipLength - 1) directionClass = 'end'
        userSquares[parseInt(this.dataset.id) - selectedShipIndex + i].classList.add('taken', 'horizontal',
directionClass, shipClass)
   }
    } else if (!isHorizontal && !newNotAllowedVertical.includes(shipLastId)) {
      for (let i=0; i < draggedShipLength; i++) {
        let directionClass
        if (i === 0) directionClass = 'start'
        if (i === draggedShipLength - 1) directionClass = 'end'
        userSquares[parseInt(this.dataset.id) - selectedShipIndex + width*i].classList.add('taken',
'vertical', directionClass, shipClass)
   }
    } else return

    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
  }

    if ((destroyerCount + submarineCount + cruiserCount + battleshipCount + carrierCount) === 50) {


      infoDisplay.innerHTML = "YOU WIN"
      gameOver()
  }
    if ((cpuDestroyerCount + cpuSubmarineCount + cpuCruiserCount + cpuBattleshipCount +
cpuCarrierCount) === 50) {
      infoDisplay.innerHTML = `${enemy.toUpperCase()} WINS`
      gameOver()
  }
 }
  function gameOver() {
    isGameOver = true
    startButton.removeEventListener('click', playGameSingle)
 }
})

17

You might also like